Use Unicode unconditionally for _winapi.CreateFile (GH-114611)

Currently it switches based on build settings, but argument clinic does not handle it correctly.
This commit is contained in:
Steve Dower 2024-01-26 17:53:46 +00:00 committed by GitHub
parent c95cdd0a82
commit 74bd566f70
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 13 deletions

View file

@ -439,7 +439,7 @@ _winapi_ConnectNamedPipe_impl(PyObject *module, HANDLE handle,
/*[clinic input] /*[clinic input]
_winapi.CreateFile -> HANDLE _winapi.CreateFile -> HANDLE
file_name: LPCTSTR file_name: LPCWSTR
desired_access: DWORD desired_access: DWORD
share_mode: DWORD share_mode: DWORD
security_attributes: LPSECURITY_ATTRIBUTES security_attributes: LPSECURITY_ATTRIBUTES
@ -450,12 +450,12 @@ _winapi.CreateFile -> HANDLE
[clinic start generated code]*/ [clinic start generated code]*/
static HANDLE static HANDLE
_winapi_CreateFile_impl(PyObject *module, LPCTSTR file_name, _winapi_CreateFile_impl(PyObject *module, LPCWSTR file_name,
DWORD desired_access, DWORD share_mode, DWORD desired_access, DWORD share_mode,
LPSECURITY_ATTRIBUTES security_attributes, LPSECURITY_ATTRIBUTES security_attributes,
DWORD creation_disposition, DWORD creation_disposition,
DWORD flags_and_attributes, HANDLE template_file) DWORD flags_and_attributes, HANDLE template_file)
/*[clinic end generated code: output=417ddcebfc5a3d53 input=6423c3e40372dbd5]*/ /*[clinic end generated code: output=818c811e5e04d550 input=1fa870ed1c2e3d69]*/
{ {
HANDLE handle; HANDLE handle;
@ -466,14 +466,15 @@ _winapi_CreateFile_impl(PyObject *module, LPCTSTR file_name,
} }
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
handle = CreateFile(file_name, desired_access, handle = CreateFileW(file_name, desired_access,
share_mode, security_attributes, share_mode, security_attributes,
creation_disposition, creation_disposition,
flags_and_attributes, template_file); flags_and_attributes, template_file);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (handle == INVALID_HANDLE_VALUE) if (handle == INVALID_HANDLE_VALUE) {
PyErr_SetFromWindowsErr(0); PyErr_SetFromWindowsErr(0);
}
return handle; return handle;
} }

View file

@ -161,7 +161,7 @@ PyDoc_STRVAR(_winapi_CreateFile__doc__,
{"CreateFile", _PyCFunction_CAST(_winapi_CreateFile), METH_FASTCALL, _winapi_CreateFile__doc__}, {"CreateFile", _PyCFunction_CAST(_winapi_CreateFile), METH_FASTCALL, _winapi_CreateFile__doc__},
static HANDLE static HANDLE
_winapi_CreateFile_impl(PyObject *module, LPCTSTR file_name, _winapi_CreateFile_impl(PyObject *module, LPCWSTR file_name,
DWORD desired_access, DWORD share_mode, DWORD desired_access, DWORD share_mode,
LPSECURITY_ATTRIBUTES security_attributes, LPSECURITY_ATTRIBUTES security_attributes,
DWORD creation_disposition, DWORD creation_disposition,
@ -171,7 +171,7 @@ static PyObject *
_winapi_CreateFile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _winapi_CreateFile(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
LPCTSTR file_name; LPCWSTR file_name = NULL;
DWORD desired_access; DWORD desired_access;
DWORD share_mode; DWORD share_mode;
LPSECURITY_ATTRIBUTES security_attributes; LPSECURITY_ATTRIBUTES security_attributes;
@ -180,8 +180,8 @@ _winapi_CreateFile(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
HANDLE template_file; HANDLE template_file;
HANDLE _return_value; HANDLE _return_value;
if (!_PyArg_ParseStack(args, nargs, "skk" F_POINTER "kk" F_HANDLE ":CreateFile", if (!_PyArg_ParseStack(args, nargs, "O&kk" F_POINTER "kk" F_HANDLE ":CreateFile",
&file_name, &desired_access, &share_mode, &security_attributes, &creation_disposition, &flags_and_attributes, &template_file)) { _PyUnicode_WideCharString_Converter, &file_name, &desired_access, &share_mode, &security_attributes, &creation_disposition, &flags_and_attributes, &template_file)) {
goto exit; goto exit;
} }
_return_value = _winapi_CreateFile_impl(module, file_name, desired_access, share_mode, security_attributes, creation_disposition, flags_and_attributes, template_file); _return_value = _winapi_CreateFile_impl(module, file_name, desired_access, share_mode, security_attributes, creation_disposition, flags_and_attributes, template_file);
@ -194,6 +194,9 @@ _winapi_CreateFile(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
return_value = HANDLE_TO_PYNUM(_return_value); return_value = HANDLE_TO_PYNUM(_return_value);
exit: exit:
/* Cleanup for file_name */
PyMem_Free((void *)file_name);
return return_value; return return_value;
} }
@ -1479,4 +1482,4 @@ exit:
return return_value; return return_value;
} }
/*[clinic end generated code: output=9d43ae4bdbe1126a input=a9049054013a1b77]*/ /*[clinic end generated code: output=a1f20d03c363db1d input=a9049054013a1b77]*/