This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2013年04月10日 01:02 by giampaolo.rodola, last changed 2022年04月11日 14:57 by admin.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| issue17683.patch | giampaolo.rodola, 2013年04月10日 01:08 | review | ||
| af_unix_str.diff | neologix, 2013年05月20日 17:59 | review | ||
| Messages (15) | |||
|---|---|---|---|
| msg186472 - (view) | Author: Giampaolo Rodola' (giampaolo.rodola) * (Python committer) | Date: 2013年04月10日 01:02 | |
(bytes vs. string)
>>> import socket
>>> s = socket.socket(socket.AF_UNIX)
>>> s.getsockname()
b''
>>> s.bind(('/tmp/temp'))
>>> s.getsockname()
'/tmp/temp'
>>>
|
|||
| msg186473 - (view) | Author: Giampaolo Rodola' (giampaolo.rodola) * (Python committer) | Date: 2013年04月10日 01:08 | |
Here's a patch. |
|||
| msg186477 - (view) | Author: Charles-François Natali (neologix) * (Python committer) | Date: 2013年04月10日 05:44 | |
> Here's a patch. Your patch returns an empty string in case of Linux abstract namespace: this is wrong, because even though the first char in sun_path is NIL, the path is non-null, there can be other non-NIL char following. Example (the output returns a str because it's a Python 2.6 version): >>> import socket >>> s = socket.socket(socket.AF_UNIX) >>> s.bind(b'\x00hello') >>> s.getsockname() '\x00hello' That's why it returns bytes. |
|||
| msg186478 - (view) | Author: Antoine Pitrou (pitrou) * (Python committer) | Date: 2013年04月10日 06:33 | |
Well, couldn't we simply return a string in that case? We just have to be more careful than in the patch :-) |
|||
| msg186480 - (view) | Author: Charles-François Natali (neologix) * (Python committer) | Date: 2013年04月10日 07:01 | |
> Well, couldn't we simply return a string in that case? We just have to be more careful than in the patch :-) Probably, provided that: - s.bind(<addr>).getsockname() == <addr> - it doesn't break existing code :-) |
|||
| msg186487 - (view) | Author: Antoine Pitrou (pitrou) * (Python committer) | Date: 2013年04月10日 12:35 | |
Apparently the current code is a result of Guido's changeset 980308fbda29 which changed normal Unix sockets to use unicode objects, but Linux abstract namespace sockets to use bytes objects. I don't know if a lot of thought was given to the issue in that changeset; I would favour using PyUnicode_DecodeFSDefaultAndSize for Linux abstract namespace sockets too. |
|||
| msg186497 - (view) | Author: Guido van Rossum (gvanrossum) * (Python committer) | Date: 2013年04月10日 14:37 | |
Sorry, I don't think I have anything to add. |
|||
| msg186499 - (view) | Author: Giampaolo Rodola' (giampaolo.rodola) * (Python committer) | Date: 2013年04月10日 14:50 | |
Note that if we pass bytes to bind(), getsockname() will return str anyway: >>> s = socket.socket(socket.AF_UNIX) >>> s.bind(b'hello') >>> s.getsockname() 'hello' That said, it seems more consistent to me to return str also in case of abstract namespace. As per: http://blog.eduardofleury.com/archives/2007/09/13 ...one is supposed to set only the first byte to null, and the rest of the path is supposed to be a 'plain' string. |
|||
| msg189682 - (view) | Author: Charles-François Natali (neologix) * (Python committer) | Date: 2013年05月20日 17:59 | |
Here's a patch. Note that I had to adapt test_socket (which was passing bytes). |
|||
| msg189684 - (view) | Author: Antoine Pitrou (pitrou) * (Python committer) | Date: 2013年05月20日 19:05 | |
Looks fine to me :-) |
|||
| msg189726 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2013年05月21日 07:49 | |
New changeset c0f2b038fc12 by Charles-François Natali in branch 'default': Issue #17683: socket module: return AF_UNIX addresses in Linux abstract http://hg.python.org/cpython/rev/c0f2b038fc12 |
|||
| msg189727 - (view) | Author: Charles-François Natali (neologix) * (Python committer) | Date: 2013年05月21日 08:24 | |
Antoine, I need your help :-) http://buildbot.python.org/all/builders/x86 Gentoo Non-Debug 3.x/builds/4311/steps/test/logs/stdio """ ====================================================================== ERROR: testLinuxAbstractNamespace (test.test_socket.TestLinuxAbstractNamespace) ---------------------------------------------------------------------- Traceback (most recent call last): File "/var/lib/buildslave/3.x.murray-gentoo-wide/build/Lib/test/test_socket.py", line 4456, in testLinuxAbstractNamespace s1.bind(address) UnicodeEncodeError: 'ascii' codec can't encode character '\xff' in position 19: ordinal not in range(128) """ I don't know jack s*** about encoding, but from what I understand, the problem is that the test is passing an invalid ordinal, now that test is passing a string. Should I revert this part of the test (i.e. make the passed address a bytes again)? |
|||
| msg189730 - (view) | Author: Charles-François Natali (neologix) * (Python committer) | Date: 2013年05月21日 08:37 | |
Hum, IIUC, basically what happens is that the user could - and still can - pass arbitrary bytes as address (which is legtit), but depending on the encoding, getsockaddr() and friends might blow up when decoding it. If that's correct, that's bad, and that would be a good reason to keep bytes. |
|||
| msg189741 - (view) | Author: Antoine Pitrou (pitrou) * (Python committer) | Date: 2013年05月21日 10:41 | |
> Hum, IIUC, basically what happens is that the user could - and still > can - pass arbitrary bytes as address (which is legtit), but depending > on the encoding, getsockaddr() and friends might blow up when decoding > it. Shouldn't the surrogateescape error handler (PEP 383) prevent this? |
|||
| msg189869 - (view) | Author: Charles-François Natali (neologix) * (Python committer) | Date: 2013年05月23日 17:05 | |
> Shouldn't the surrogateescape error handler (PEP 383) prevent this? Yes, it shoud (I just read PEP 383, I told you I didn't know anything about encoding :-). So basically, for the test failure, the issue is simply that the platform's default encoding can't encode character '\xff'. Should I simply remove the offending character from this test address? Also, let's say I wanted to test that it can be passed and returned properly, so I add '0円xff' to the adress passed to testBytesName: s.bind(b"\x00python\x00test\xff") How should I check the string returned by getsockname()? self.assertEquals(s.getsockname(), ???) |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:44 | admin | set | github: 61883 |
| 2013年06月01日 17:26:38 | neologix | set | nosy:
+ vstinner |
| 2013年05月23日 17:05:11 | neologix | set | messages: + msg189869 |
| 2013年05月21日 10:41:28 | pitrou | set | messages: + msg189741 |
| 2013年05月21日 08:37:40 | neologix | set | messages: + msg189730 |
| 2013年05月21日 08:24:38 | neologix | set | messages: + msg189727 |
| 2013年05月21日 07:49:45 | python-dev | set | nosy:
+ python-dev messages: + msg189726 |
| 2013年05月20日 19:05:16 | pitrou | set | messages: + msg189684 |
| 2013年05月20日 18:53:22 | gvanrossum | set | nosy:
- gvanrossum |
| 2013年05月20日 17:59:14 | neologix | set | files:
+ af_unix_str.diff messages: + msg189682 components: + Library (Lib) keywords: + needs review type: behavior stage: patch review |
| 2013年04月10日 14:50:34 | giampaolo.rodola | set | messages: + msg186499 |
| 2013年04月10日 14:37:00 | gvanrossum | set | messages: + msg186497 |
| 2013年04月10日 12:35:03 | pitrou | set | nosy:
+ gvanrossum messages: + msg186487 |
| 2013年04月10日 07:01:18 | neologix | set | messages: + msg186480 |
| 2013年04月10日 06:33:13 | pitrou | set | messages: + msg186478 |
| 2013年04月10日 05:44:13 | neologix | set | nosy:
+ neologix messages: + msg186477 |
| 2013年04月10日 01:08:30 | giampaolo.rodola | set | files:
+ issue17683.patch keywords: + patch messages: + msg186473 |
| 2013年04月10日 01:02:50 | giampaolo.rodola | create | |