eryksun added the comment:

Calling nt.execv works with a unicode string because it creates a bytes path 
via PyUnicode_FSConverter. OTOH, nt.execve uses path_converter, which doesn't 
convert unicode to bytes on Windows. Thus in posixmodule.c, for the call 
execve(path->narrow, argvlist, envlist), path->narrow is NULL, and the CRT 
kills the process due to a bad argument:

    (70.135c): Break instruction exception - code 80000003 (first chance)
    ntdll!LdrpDoDebuggerBreak+0x30:
    00000000`7733cb70 cc              int     3
    0:000> bp ntdll!ZwTerminateProcess
    0:000> bp desktopcrt140!execve
    0:000> g
    ModLoad: 000007fe`fc850000 000007fe`fc868000   
C:\Windows\system32\CRYPTSP.dll
    ModLoad: 000007fe`fc550000 000007fe`fc597000   
C:\Windows\system32\rsaenh.dll
    ModLoad: 000007fe`fceb0000 000007fe`fcebf000   
C:\Windows\system32\CRYPTBASE.dll

    Python 3.5.0a1 (v3.5.0a1:5d4b6a57d5fd, Feb  7 2015, 18:15:14) 
    [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import nt, sys                       
    >>> path = sys.executable
    >>> nt.execve(path, ['python', '-V'], {})

    Breakpoint 1 hit
    DESKTOPCRT140!_execve:
    000007fe`fa5ac43c 4d8bc8          mov     r9,r8
    0:000> r rcx
    rcx=0000000000000000

The first argument is passed in AMD64 register rcx, which you can see is NULL 
here.

    0:000> g
    Breakpoint 0 hit
    ntdll!NtTerminateProcess:
    00000000`772e1570 4c8bd1          mov     r10,rcx
    0:000> k 8
    Child-SP          RetAddr           Call Site
    00000000`0038f5c8 000007fe`fd11402f ntdll!NtTerminateProcess
    00000000`0038f5d0 000007fe`f54e003a KERNELBASE!TerminateProcess+0x2f
    00000000`0038f600 000007fe`f54e0055 APPCRT140!_invalid_parameter+0x76
    00000000`0038f640 000007fe`fa5abbd8 APPCRT140!_invalid_parameter_noinfo+0x19
    00000000`0038f680 00000000`6aa116a7 DESKTOPCRT140!common_spawnv<char>+0x44
    00000000`0038f6e0 00000000`6aa115a8 python35!os_execve_impl+0xb7
    00000000`0038f720 00000000`6aa9ff3b python35!os_execve+0xa8
    00000000`0038f7d0 00000000`6ab14aed python35!PyCFunction_Call+0xfb

Using a bytes path with nt.execve will work, but it's deprecated on Windows:

    C:\>py -3.5 -Wall
    Python 3.5.0a1 (v3.5.0a1:5d4b6a57d5fd, Feb  7 2015, 18:15:14) 
    [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os, nt, sys
    >>> path = os.fsencode(sys.executable)
    >>> nt.execve(path, ['python', '-V'], {})
    __main__:1: DeprecationWarning: The Windows bytes API has been 
    deprecated, use Unicode filenames instead

    C:\>Python 3.5.0a1

Since bytes paths are deprecated on Windows, these calls should be using wexecv 
and wexecve.

https://msdn.microsoft.com/en-us/library/431x4c1w%28v=vs.100%29.aspx

----------
nosy: +eryksun
versions: +Python 3.5

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

Reply via email to