@@ -752,12 +752,12 @@ gethandle(PyObject* obj, const char* name)
752
752
return ret ;
753
753
}
754
754
755
- static PyObject *
755
+ static wchar_t *
756
756
getenvironment (PyObject * environment )
757
757
{
758
758
Py_ssize_t i , envsize , totalsize ;
759
- Py_UCS4 * buffer = NULL , * p , * end ;
760
- PyObject * keys , * values , * res ;
759
+ wchar_t * buffer = NULL , * p , * end ;
760
+ PyObject * keys , * values ;
761
761
762
762
/* convert environment dictionary to windows environment string */
763
763
if (! PyMapping_Check (environment )) {
@@ -775,17 +775,18 @@ getenvironment(PyObject* environment)
775
775
goto error ;
776
776
}
777
777
778
- envsize = PySequence_Fast_GET_SIZE (keys );
779
- if (PySequence_Fast_GET_SIZE (values ) != envsize ) {
778
+ envsize = PyList_GET_SIZE (keys );
779
+ if (PyList_GET_SIZE (values ) != envsize ) {
780
780
PyErr_SetString (PyExc_RuntimeError ,
781
781
"environment changed size during iteration" );
782
782
goto error ;
783
783
}
784
784
785
785
totalsize = 1 ; /* trailing null character */
786
786
for (i = 0 ; i < envsize ; i ++ ) {
787
- PyObject * key = PySequence_Fast_GET_ITEM (keys , i );
788
- PyObject * value = PySequence_Fast_GET_ITEM (values , i );
787
+ PyObject * key = PyList_GET_ITEM (keys , i );
788
+ PyObject * value = PyList_GET_ITEM (values , i );
789
+ Py_ssize_t size ;
789
790
790
791
if (! PyUnicode_Check (key ) || ! PyUnicode_Check (value )) {
791
792
PyErr_SetString (PyExc_TypeError ,
@@ -806,19 +807,25 @@ getenvironment(PyObject* environment)
806
807
PyErr_SetString (PyExc_ValueError , "illegal environment variable name" );
807
808
goto error ;
808
809
}
809
- if (totalsize > PY_SSIZE_T_MAX - PyUnicode_GET_LENGTH (key ) - 1 ) {
810
+
811
+ size = PyUnicode_AsWideChar (key , NULL , 0 );
812
+ assert (size > 1 );
813
+ if (totalsize > PY_SSIZE_T_MAX - size ) {
810
814
PyErr_SetString (PyExc_OverflowError , "environment too long" );
811
815
goto error ;
812
816
}
813
- totalsize += PyUnicode_GET_LENGTH (key ) + 1 ; /* +1 for '=' */
814
- if (totalsize > PY_SSIZE_T_MAX - PyUnicode_GET_LENGTH (value ) - 1 ) {
817
+ totalsize += size ; /* including '=' */
818
+
819
+ size = PyUnicode_AsWideChar (value , NULL , 0 );
820
+ assert (size > 0 );
821
+ if (totalsize > PY_SSIZE_T_MAX - size ) {
815
822
PyErr_SetString (PyExc_OverflowError , "environment too long" );
816
823
goto error ;
817
824
}
818
- totalsize += PyUnicode_GET_LENGTH ( value ) + 1 ; /* +1 for '\0' */
825
+ totalsize += size ; /* including trailing '\0' */
819
826
}
820
827
821
- buffer = PyMem_NEW (Py_UCS4 , totalsize );
828
+ buffer = PyMem_NEW (wchar_t , totalsize );
822
829
if (! buffer ) {
823
830
PyErr_NoMemory ();
824
831
goto error ;
@@ -827,34 +834,25 @@ getenvironment(PyObject* environment)
827
834
end = buffer + totalsize ;
828
835
829
836
for (i = 0 ; i < envsize ; i ++ ) {
830
- PyObject * key = PySequence_Fast_GET_ITEM (keys , i );
831
- PyObject * value = PySequence_Fast_GET_ITEM (values , i );
832
- if (!PyUnicode_AsUCS4 (key , p , end - p , 0 ))
833
- goto error ;
834
- p += PyUnicode_GET_LENGTH (key );
835
- * p ++ = '=' ;
836
- if (!PyUnicode_AsUCS4 (value , p , end - p , 0 ))
837
- goto error ;
838
- p += PyUnicode_GET_LENGTH (value );
839
- * p ++ = '\0' ;
837
+ PyObject * key = PyList_GET_ITEM (keys , i );
838
+ PyObject * value = PyList_GET_ITEM (values , i );
839
+ Py_ssize_t size = PyUnicode_AsWideChar (key , p , end - p );
840
+ assert (1 <= size && size < end - p );
841
+ p += size ;
842
+ * p ++ = L'=' ;
843
+ size = PyUnicode_AsWideChar (value , p , end - p );
844
+ assert (0 <= size && size < end - p );
845
+ p += size + 1 ;
840
846
}
841
847
842
- /* add trailing null byte */
843
- * p ++ = '\0' ;
848
+ /* add trailing null character */
849
+ * p ++ = L '\0' ;
844
850
assert (p == end );
845
851
846
- Py_XDECREF (keys );
847
- Py_XDECREF (values );
848
-
849
- res = PyUnicode_FromKindAndData (PyUnicode_4BYTE_KIND , buffer , p - buffer );
850
- PyMem_Free (buffer );
851
- return res ;
852
-
853
852
error :
854
- PyMem_Free (buffer );
855
853
Py_XDECREF (keys );
856
854
Py_XDECREF (values );
857
- return NULL ;
855
+ return buffer ;
858
856
}
859
857
860
858
static LPHANDLE
@@ -1053,8 +1051,7 @@ _winapi_CreateProcess_impl(PyObject *module,
1053
1051
BOOL result ;
1054
1052
PROCESS_INFORMATION pi ;
1055
1053
STARTUPINFOEXW si ;
1056
- PyObject * environment = NULL ;
1057
- wchar_t * wenvironment ;
1054
+ wchar_t * wenvironment = NULL ;
1058
1055
wchar_t * command_line_copy = NULL ;
1059
1056
AttributeList attribute_list = {0 };
1060
1057
@@ -1071,20 +1068,11 @@ _winapi_CreateProcess_impl(PyObject *module,
1071
1068
goto cleanup ;
1072
1069
1073
1070
if (env_mapping != Py_None ) {
1074
- environment = getenvironment (env_mapping );
1075
- if (environment == NULL ) {
1076
- goto cleanup ;
1077
- }
1078
- /* contains embedded null characters */
1079
- wenvironment = PyUnicode_AsUnicode (environment );
1071
+ wenvironment = getenvironment (env_mapping );
1080
1072
if (wenvironment == NULL ) {
1081
1073
goto cleanup ;
1082
1074
}
1083
1075
}
1084
- else {
1085
- environment = NULL ;
1086
- wenvironment = NULL ;
1087
- }
1088
1076
1089
1077
if (getattributelist (startup_info , "lpAttributeList" , & attribute_list ) < 0 )
1090
1078
goto cleanup ;
@@ -1131,7 +1119,7 @@ _winapi_CreateProcess_impl(PyObject *module,
1131
1119
1132
1120
cleanup :
1133
1121
PyMem_Free (command_line_copy );
1134
- Py_XDECREF ( environment );
1122
+ PyMem_Free ( wenvironment );
1135
1123
freeattributelist (& attribute_list );
1136
1124
1137
1125
return ret ;
0 commit comments