Trent Nelson added the comment:

Looks like os.readlink() is busted:


> /home/trent/src/cpython/Lib/shutil.py(107)copyfile()
-> os.symlink(os.readlink(src), dst)
(Pdb) s
TypeError: embedded NUL character
> /home/trent/src/cpython/Lib/shutil.py(107)copyfile()
-> os.symlink(os.readlink(src), dst)
(Pdb) os.readlink(src)
'/tmp/tmpr3obfj/foo\x00\x00\x00\x00\x00\x00'
(Pdb) p src
'/tmp/tmpr3obfj/baz'
(Pdb) l
102                 # XXX What about other special files? (sockets, devices...)
103                 if stat.S_ISFIFO(st.st_mode):
104                     raise SpecialFileError("`%s` is a named pipe" % fn)
105     
106         if not follow_symlinks and os.path.islink(src):
107  ->         os.symlink(os.readlink(src), dst)
108         else:
109             with open(src, 'rb') as fsrc:
110                 with open(dst, 'wb') as fdst:
111                     copyfileobj(fsrc, fdst)
112         return dst


> /home/trent/src/cpython/Lib/shutil.py(107)copyfile()
-> os.symlink(os.readlink(src), dst)
(Pdb) s
TypeError: embedded NUL character
> /home/trent/src/cpython/Lib/shutil.py(107)copyfile()
-> os.symlink(os.readlink(src), dst)
(Pdb) os.readlink(src)
'/tmp/tmpr3obfj/foo\x00\x00\x00\x00\x00\x00'
(Pdb) p src
'/tmp/tmpr3obfj/baz'
(Pdb) l
102                 # XXX What about other special files? (sockets, devices...)
103                 if stat.S_ISFIFO(st.st_mode):
104                     raise SpecialFileError("`%s` is a named pipe" % fn)
105     
106         if not follow_symlinks and os.path.islink(src):
107  ->         os.symlink(os.readlink(src), dst)
108         else:
109             with open(src, 'rb') as fsrc:
110                 with open(dst, 'wb') as fdst:
111                     copyfileobj(fsrc, fdst)
112         return dst

i.e.:
(Pdb) os.readlink(src)
'/tmp/tmpr3obfj/foo\x00\x00\x00\x00\x00\x00'


Started another session with gdb, set a breakpoint at posix_readlink:


Breakpoint 1, posix_readlink (self=0x800909858, args=0x805ec2840, kwargs=0x0)
    at ./Modules/posixmodule.c:7007
7007        int dir_fd = DEFAULT_DIR_FD;
(gdb) l
7002    
7003    static PyObject *
7004    posix_readlink(PyObject *self, PyObject *args, PyObject *kwargs)
7005    {
7006        path_t path;
7007        int dir_fd = DEFAULT_DIR_FD;
7008        char buffer[MAXPATHLEN];
7009        ssize_t length;
7010        PyObject *return_value = NULL;
7011        static char *keywords[] = {"path", "dir_fd", NULL};
(gdb) n
7013        memset(&path, 0, sizeof(path));
(gdb) 
7014        if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:readlink", 
keywords,
(gdb) 
7024        Py_BEGIN_ALLOW_THREADS
(gdb) 
7026        if (dir_fd != DEFAULT_DIR_FD)
(gdb) p path
$1 = {function_name = 0x0, argument_name = 0x0, nullable = 0, allow_fd = 0, 
  wide = 0x0, narrow = 0x805ec0f10 "/tmp/tmpko8vo_/baz", fd = -1, length = 18, 
  object = 0x805e30d60, cleanup = 0x805ec0ee0}

path.narrow and length are correct at that point.


(gdb) p dir_fd
$2 = -100
(gdb) n
7024        Py_BEGIN_ALLOW_THREADS
(gdb) n
7026        if (dir_fd != DEFAULT_DIR_FD)
(gdb) n
7030            length = readlink(path.narrow, buffer, sizeof(buffer));
(gdb) n
7031        Py_END_ALLOW_THREADS
(gdb) p length
$3 = 24
(gdb) p sizeof(buffer)
$7 = 1024
(gdb)  p buffer
$9 = 
"/tmp/tmpko8vo_/foo\000\000\000\000\000\000อค\r\001\b\000\000\000\000\000\000\000??????A",
 '\0' <repeats 77 times>, "??\203\000\b\000\000\000?v???\177\000\000??A", '\0' 
<repeats 13 times>, "f\023J", '\0' <repeats 13 times>, 
"??A\000\000\000\000\000\001\000\000\000\000\000\000\000\030u???\177\000\000 
u???\177\000\000RCJ\000\000\000\000\000\000\001\000\000\000\000\000\000??A\000\000\000\000\000?v???\177\000\000?(?\005\b\000\000\0000?L\002\b\000\000\000\210N?\005\b\000\000\000\001\000\000\000\000\000\000\000??A\000\000\000\000\000?"...

No idea why readlink is returning 24.  Need to look into it more.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue15748>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to