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

This commit is contained in:
Steve Dower 2017-02-04 15:05:13 -08:00
parent d3c4853b78
commit 21fae03e16
2 changed files with 51 additions and 12 deletions

View File

@ -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
----- -----

View File

@ -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
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)
{ {
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)
{ {
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 *
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 *
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 *
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 *
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
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)
{ {
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
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)
{ {
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);
} }