Commit 21fae03e authored by Steve Dower's avatar Steve Dower

Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.

parent d3c4853b
...@@ -47,6 +47,11 @@ Library ...@@ -47,6 +47,11 @@ Library
leading dots could match related hostnames again (e.g. .b.c matches a.b.c). leading dots could match related hostnames again (e.g. .b.c matches a.b.c).
Patch by Milan Oberkirch. Patch by Milan Oberkirch.
Windows
-------
- Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
C API C API
----- -----
......
...@@ -111,7 +111,9 @@ msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes) ...@@ -111,7 +111,9 @@ msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes)
int err; int err;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
_Py_BEGIN_SUPPRESS_IPH
err = _locking(fd, mode, nbytes); err = _locking(fd, mode, nbytes);
_Py_END_SUPPRESS_IPH
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (err != 0) if (err != 0)
return PyErr_SetFromErrno(PyExc_IOError); return PyErr_SetFromErrno(PyExc_IOError);
...@@ -138,7 +140,9 @@ static long ...@@ -138,7 +140,9 @@ static long
msvcrt_setmode_impl(PyObject *module, int fd, int flags) msvcrt_setmode_impl(PyObject *module, int fd, int flags)
/*[clinic end generated code: output=24a9be5ea07ccb9b input=76e7c01f6b137f75]*/ /*[clinic end generated code: output=24a9be5ea07ccb9b input=76e7c01f6b137f75]*/
{ {
_Py_BEGIN_SUPPRESS_IPH
flags = _setmode(fd, flags); flags = _setmode(fd, flags);
_Py_END_SUPPRESS_IPH
if (flags == -1) if (flags == -1)
PyErr_SetFromErrno(PyExc_IOError); PyErr_SetFromErrno(PyExc_IOError);
...@@ -165,7 +169,9 @@ msvcrt_open_osfhandle_impl(PyObject *module, Py_intptr_t handle, int flags) ...@@ -165,7 +169,9 @@ msvcrt_open_osfhandle_impl(PyObject *module, Py_intptr_t handle, int flags)
{ {
int fd; int fd;
_Py_BEGIN_SUPPRESS_IPH
fd = _open_osfhandle(handle, flags); fd = _open_osfhandle(handle, flags);
_Py_END_SUPPRESS_IPH
if (fd == -1) if (fd == -1)
PyErr_SetFromErrno(PyExc_IOError); PyErr_SetFromErrno(PyExc_IOError);
...@@ -189,16 +195,11 @@ msvcrt_get_osfhandle_impl(PyObject *module, int fd) ...@@ -189,16 +195,11 @@ msvcrt_get_osfhandle_impl(PyObject *module, int fd)
{ {
Py_intptr_t handle = -1; Py_intptr_t handle = -1;
if (!_PyVerify_fd(fd)) {
PyErr_SetFromErrno(PyExc_IOError);
}
else {
_Py_BEGIN_SUPPRESS_IPH _Py_BEGIN_SUPPRESS_IPH
handle = _get_osfhandle(fd); handle = _get_osfhandle(fd);
_Py_END_SUPPRESS_IPH _Py_END_SUPPRESS_IPH
if (handle == -1) if (handle == -1)
PyErr_SetFromErrno(PyExc_IOError); PyErr_SetFromErrno(PyExc_IOError);
}
return handle; return handle;
} }
...@@ -308,7 +309,9 @@ static PyObject * ...@@ -308,7 +309,9 @@ static PyObject *
msvcrt_putch_impl(PyObject *module, char char_value) msvcrt_putch_impl(PyObject *module, char char_value)
/*[clinic end generated code: output=92ec9b81012d8f60 input=ec078dd10cb054d6]*/ /*[clinic end generated code: output=92ec9b81012d8f60 input=ec078dd10cb054d6]*/
{ {
_Py_BEGIN_SUPPRESS_IPH
_putch(char_value); _putch(char_value);
_Py_END_SUPPRESS_IPH
Py_RETURN_NONE; Py_RETURN_NONE;
} }
...@@ -325,7 +328,9 @@ static PyObject * ...@@ -325,7 +328,9 @@ static PyObject *
msvcrt_putwch_impl(PyObject *module, int unicode_char) msvcrt_putwch_impl(PyObject *module, int unicode_char)
/*[clinic end generated code: output=a3bd1a8951d28eee input=996ccd0bbcbac4c3]*/ /*[clinic end generated code: output=a3bd1a8951d28eee input=996ccd0bbcbac4c3]*/
{ {
_Py_BEGIN_SUPPRESS_IPH
_putwch(unicode_char); _putwch(unicode_char);
_Py_END_SUPPRESS_IPH
Py_RETURN_NONE; Py_RETURN_NONE;
} }
...@@ -347,7 +352,13 @@ static PyObject * ...@@ -347,7 +352,13 @@ static PyObject *
msvcrt_ungetch_impl(PyObject *module, char char_value) msvcrt_ungetch_impl(PyObject *module, char char_value)
/*[clinic end generated code: output=c6942a0efa119000 input=22f07ee9001bbf0f]*/ /*[clinic end generated code: output=c6942a0efa119000 input=22f07ee9001bbf0f]*/
{ {
if (_ungetch(char_value) == EOF) int res;
_Py_BEGIN_SUPPRESS_IPH
res = _ungetch(char_value);
_Py_END_SUPPRESS_IPH
if (res == EOF)
return PyErr_SetFromErrno(PyExc_IOError); return PyErr_SetFromErrno(PyExc_IOError);
Py_RETURN_NONE; Py_RETURN_NONE;
} }
...@@ -365,7 +376,13 @@ static PyObject * ...@@ -365,7 +376,13 @@ static PyObject *
msvcrt_ungetwch_impl(PyObject *module, int unicode_char) msvcrt_ungetwch_impl(PyObject *module, int unicode_char)
/*[clinic end generated code: output=e63af05438b8ba3d input=83ec0492be04d564]*/ /*[clinic end generated code: output=e63af05438b8ba3d input=83ec0492be04d564]*/
{ {
if (_ungetwch(unicode_char) == WEOF) int res;
_Py_BEGIN_SUPPRESS_IPH
res = _ungetwch(unicode_char);
_Py_END_SUPPRESS_IPH
if (res == WEOF)
return PyErr_SetFromErrno(PyExc_IOError); return PyErr_SetFromErrno(PyExc_IOError);
Py_RETURN_NONE; Py_RETURN_NONE;
} }
...@@ -387,7 +404,13 @@ static long ...@@ -387,7 +404,13 @@ static long
msvcrt_CrtSetReportFile_impl(PyObject *module, int type, int file) msvcrt_CrtSetReportFile_impl(PyObject *module, int type, int file)
/*[clinic end generated code: output=df291c7fe032eb68 input=bb8f721a604fcc45]*/ /*[clinic end generated code: output=df291c7fe032eb68 input=bb8f721a604fcc45]*/
{ {
return (long)_CrtSetReportFile(type, (_HFILE)file); long res;
_Py_BEGIN_SUPPRESS_IPH
res = (long)_CrtSetReportFile(type, (_HFILE)file);
_Py_END_SUPPRESS_IPH
return res;
} }
/*[clinic input] /*[clinic input]
...@@ -408,7 +431,9 @@ msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode) ...@@ -408,7 +431,9 @@ msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode)
{ {
int res; int res;
_Py_BEGIN_SUPPRESS_IPH
res = _CrtSetReportMode(type, mode); res = _CrtSetReportMode(type, mode);
_Py_END_SUPPRESS_IPH
if (res == -1) if (res == -1)
PyErr_SetFromErrno(PyExc_IOError); PyErr_SetFromErrno(PyExc_IOError);
return res; return res;
...@@ -429,7 +454,13 @@ static long ...@@ -429,7 +454,13 @@ static long
msvcrt_set_error_mode_impl(PyObject *module, int mode) msvcrt_set_error_mode_impl(PyObject *module, int mode)
/*[clinic end generated code: output=ac4a09040d8ac4e3 input=046fca59c0f20872]*/ /*[clinic end generated code: output=ac4a09040d8ac4e3 input=046fca59c0f20872]*/
{ {
return _set_error_mode(mode); long res;
_Py_BEGIN_SUPPRESS_IPH
res = _set_error_mode(mode);
_Py_END_SUPPRESS_IPH
return res;
} }
#endif /* _DEBUG */ #endif /* _DEBUG */
...@@ -448,7 +479,10 @@ msvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode) ...@@ -448,7 +479,10 @@ msvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode)
{ {
unsigned int res; unsigned int res;
_Py_BEGIN_SUPPRESS_IPH
res = SetErrorMode(mode); res = SetErrorMode(mode);
_Py_END_SUPPRESS_IPH
return PyLong_FromUnsignedLong(res); return PyLong_FromUnsignedLong(res);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment