summaryrefslogtreecommitdiff
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2018-12-01 04:52:04 -0800
committerGitHub <noreply@github.com>2018-12-01 04:52:04 -0800
commit265b41996aa3f604624a8046d1c314a1aee4b590 (patch)
tree6b5da9dc43cbf58a693906ac14f03f1ddee17d4e /Modules/posixmodule.c
parent7da9755021a27075f5856c6ffff4c949e790bbee (diff)
downloadcpython-git-265b41996aa3f604624a8046d1c314a1aee4b590.tar.gz
bpo-35371: Fix possible crash in os.utime() on Windows. (GH-10844)
(cherry picked from commit 32bc11c33cf5ccea165b5f4ac3799f02fdf9c76a) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r--Modules/posixmodule.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index dbd534cab0..cab30c2102 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -4645,7 +4645,6 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
int result;
#endif
- PyObject *return_value = NULL;
utime_t utime;
memset(&utime, 0, sizeof(utime_t));
@@ -4654,7 +4653,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
PyErr_SetString(PyExc_ValueError,
"utime: you may specify either 'times'"
" or 'ns' but not both");
- goto exit;
+ return NULL;
}
if (times && (times != Py_None)) {
@@ -4664,14 +4663,14 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
PyErr_SetString(PyExc_TypeError,
"utime: 'times' must be either"
" a tuple of two ints or None");
- goto exit;
+ return NULL;
}
utime.now = 0;
if (_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 0),
&a_sec, &a_nsec, _PyTime_ROUND_FLOOR) == -1 ||
_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 1),
&m_sec, &m_nsec, _PyTime_ROUND_FLOOR) == -1) {
- goto exit;
+ return NULL;
}
utime.atime_s = a_sec;
utime.atime_ns = a_nsec;
@@ -4682,14 +4681,14 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) {
PyErr_SetString(PyExc_TypeError,
"utime: 'ns' must be a tuple of two ints");
- goto exit;
+ return NULL;
}
utime.now = 0;
if (!split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 0),
&utime.atime_s, &utime.atime_ns) ||
!split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 1),
&utime.mtime_s, &utime.mtime_ns)) {
- goto exit;
+ return NULL;
}
}
else {
@@ -4699,20 +4698,20 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
#if !defined(UTIME_HAVE_NOFOLLOW_SYMLINKS)
if (follow_symlinks_specified("utime", follow_symlinks))
- goto exit;
+ return NULL;
#endif
if (path_and_dir_fd_invalid("utime", path, dir_fd) ||
dir_fd_and_fd_invalid("utime", dir_fd, path->fd) ||
fd_and_follow_symlinks_invalid("utime", path->fd, follow_symlinks))
- goto exit;
+ return NULL;
#if !defined(HAVE_UTIMENSAT)
if ((dir_fd != DEFAULT_DIR_FD) && (!follow_symlinks)) {
PyErr_SetString(PyExc_ValueError,
"utime: cannot use dir_fd and follow_symlinks "
"together on this platform");
- goto exit;
+ return NULL;
}
#endif
@@ -4724,7 +4723,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
Py_END_ALLOW_THREADS
if (hFile == INVALID_HANDLE_VALUE) {
path_error(path);
- goto exit;
+ return NULL;
}
if (utime.now) {
@@ -4741,8 +4740,10 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
something is wrong with the file, when it also
could be the time stamp that gives a problem. */
PyErr_SetFromWindowsErr(0);
- goto exit;
+ CloseHandle(hFile);
+ return NULL;
}
+ CloseHandle(hFile);
#else /* MS_WINDOWS */
Py_BEGIN_ALLOW_THREADS
@@ -4770,21 +4771,13 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
if (result < 0) {
/* see previous comment about not putting filename in error here */
- return_value = posix_error();
- goto exit;
+ posix_error();
+ return NULL;
}
#endif /* MS_WINDOWS */
- Py_INCREF(Py_None);
- return_value = Py_None;
-
-exit:
-#ifdef MS_WINDOWS
- if (hFile != INVALID_HANDLE_VALUE)
- CloseHandle(hFile);
-#endif
- return return_value;
+ Py_RETURN_NONE;
}
/* Process operations */