[ python-Bugs-1019808 ] wrong socket error returned

SourceForge.net noreply at sourceforge.net
Tue Aug 8 14:15:28 CEST 2006


Bugs item #1019808, was opened at 2004-08-31 12:18
Message generated for change (Settings changed) made by akuchling
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1019808&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Extension Modules
>Group: Python 2.6
Status: Open
Resolution: None
Priority: 5
Submitted By: Federico Schwindt (fgsch)
Assigned to: A.M. Kuchling (akuchling)
Summary: wrong socket error returned

Initial Comment:
hi,

  first, background:

  OS: OpenBSD-current/i386
  Python version: 2.3.4

   example script:

import socket

socket.setdefaulttimeout(30)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 9999))

   where nothing is listening on 9999 (ECONNREFUSED
should be returned).
   when ran it i get:

Traceback (most recent call last):
  File "bug.py", line 8, in ?
    s.connect(('127.0.0.1', 9999))
  File "<string>", line 1, in connect
socket.error: (22, 'Invalid argument')

  this is a problem in the socketmodule.c, in the
internal_connect() function. getsockopt with SOCK_ERROR
should be used once EINPROGRESS is returned to get the
real error.
  this code works on linux, but the connect semantic
is, imho, broken. you cannot reuse a socket once it
failed (a test afterwards shown that this is valid
under linux!!!!).
  please contact me if you need further details,
although i find this very clear.
  thanks,

  f.-


----------------------------------------------------------------------

>Comment By: A.M. Kuchling (akuchling)
Date: 2006-08-08 08:15

Message:
Logged In: YES 
user_id=11375

I agree -- this sort of Unix-platform-specific bugfix is
always risky.  It would have been better if this patch could
have been committed in one of the alphas.

I'll put this bug in the Python 2.6 group and commit it
after 2.5final is released (perhaps it can also go on the
release25-maint branch at that time).


----------------------------------------------------------------------

Comment By: Neal Norwitz (nnorwitz)
Date: 2006-08-04 01:34

Message:
Logged In: YES 
user_id=33168

Andrew, I'm ok with this patch, but not enthusiastic for
2.5.  It might be better to wait for 2.5.1 in order to give
this more time to settle.  I agree that this change *should*
be correct, but who knows if it will break some other
platform(s).  I leave it to you whether to apply for 2.5 or
2.5.1.  It would be good to actually test this condition too.

----------------------------------------------------------------------

Comment By: A.M. Kuchling (akuchling)
Date: 2006-08-03 10:31

Message:
Logged In: YES 
user_id=11375

Deleting broken patches; attaching a correct version against
2.5 trunk.


----------------------------------------------------------------------

Comment By: A.M. Kuchling (akuchling)
Date: 2006-08-03 10:18

Message:
Logged In: YES 
user_id=11375

I can confirm the bug on MacOS X, and the failure of the
patch to fix it.

I think the logic of the patch is wrong; it saves errno in
save_errno when errno==EINPROGRESS, does a getsockopt(), and
then resets errno to save_errno, which we know is
EINPROGRESS.  I think the correct action is to do 'errno =
<result of the getsockopt>".

Revised patch attached; it produces the correct result on OS X.







----------------------------------------------------------------------

Comment By: A.M. Kuchling (akuchling)
Date: 2006-08-03 10:15

Message:
Logged In: YES 
user_id=11375

I can confirm the bug on MacOS X, and the failure of the
patch to fix it.

I think the logic of the patch is wrong; it saves errno in
save_errno when errno==EINPROGRESS, does a getsockopt(), and
then resets errno to save_errno, which we know is
EINPROGRESS.  I think the correct action is to do 'errno =
<result of the getsockopt>".

Revised patch attached; it produces the correct result on OS X.







----------------------------------------------------------------------

Comment By: A.M. Kuchling (akuchling)
Date: 2006-08-03 10:14

Message:
Logged In: YES 
user_id=11375

I can confirm the bug on MacOS X, and the failure of the
patch to fix it.

I think the logic of the patch is wrong; it saves errno in
save_errno when errno==EINPROGRESS, does a getsockopt(), and
then resets errno to save_errno, which we know is
EINPROGRESS.  I think the correct action is to do 'errno =
<result of the getsockopt>".

Revised patch attached; it produces the correct result on OS X.







----------------------------------------------------------------------

Comment By: Frank Vercruesse (vercruesse)
Date: 2006-02-17 15:46

Message:
Logged In: YES 
user_id=202246

I can confirm the bug running Python 2.4.2 on Mac OS X
10.4.5 (PPC). However, the patch doesn't seem to resolve the
issue. Now I get the following traceback when running the
posted script:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 1, in connect
socket.error: (36, 'Operation now in progress')


----------------------------------------------------------------------

Comment By: Federico Schwindt (fgsch)
Date: 2005-10-03 15:44

Message:
Logged In: YES 
user_id=50493

patch against 2.4.1 appended. not tested in anything but
openbsd. nevertheless, i think it should work in linux and
osx. not sure about others.
cheers.

----------------------------------------------------------------------

Comment By: Neal Norwitz (nnorwitz)
Date: 2005-10-03 02:02

Message:
Logged In: YES 
user_id=33168

Can you provide a patch that you believe corrects this problem?

----------------------------------------------------------------------

Comment By: Federico Schwindt (fgsch)
Date: 2005-06-24 05:41

Message:
Logged In: YES 
user_id=50493

just tried this with 2.4.1 running in OpenBSD 3.7/amd64 and
the problem is still there :-(

----------------------------------------------------------------------

Comment By: Federico Schwindt (fgsch)
Date: 2004-09-22 23:58

Message:
Logged In: YES 
user_id=50493

any news? this may be a problem in other *BSDs as well..

----------------------------------------------------------------------

Comment By: Federico Schwindt (fgsch)
Date: 2004-08-31 12:22

Message:
Logged In: YES 
user_id=50493

maybe i was not clear. the problem is only happening when
setdefaulttimeout is used. otherwise ECONNREFUSED is
correctly returned.

f.-

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1019808&group_id=5470


More information about the Python-bugs-list mailing list