diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-06-23 20:57:43 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-06-23 20:57:43 (GMT) |
commit | 1ce46d99dbe13e57544e404966c57072d1dcf8e1 (patch) | |
tree | 609b590c904bd2bb008fc094f2ff469407fad6a6 /Modules | |
parent | 42471ad7ddbb88a8e177d6faa1a88a62481d2087 (diff) | |
download | cpython-1ce46d99dbe13e57544e404966c57072d1dcf8e1.zip cpython-1ce46d99dbe13e57544e404966c57072d1dcf8e1.tar.gz cpython-1ce46d99dbe13e57544e404966c57072d1dcf8e1.tar.bz2 |
Issue #11016: Detect integer conversion on conversion from Python int to C mode_t
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_stat.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/Modules/_stat.c b/Modules/_stat.c index 3b4eb82..eafd726 100644 --- a/Modules/_stat.c +++ b/Modules/_stat.c @@ -258,15 +258,32 @@ typedef unsigned short mode_t; # define SF_SNAPSHOT 0x00200000 #endif +static mode_t +_PyLong_AsMode_t(PyObject *op) +{ + unsigned long value; + mode_t mode; + + value = PyLong_AsUnsignedLong(op); + if ((value == (unsigned long)-1) && PyErr_Occurred()) + return (mode_t)-1; + + mode = (mode_t)value; + if ((unsigned long)mode != value) { + PyErr_SetString(PyExc_OverflowError, "mode out of range"); + return (mode_t)-1; + } + return mode; +} + #define stat_S_ISFUNC(isfunc, doc) \ static PyObject * \ stat_ ##isfunc (PyObject *self, PyObject *omode) \ { \ - unsigned long mode = PyLong_AsUnsignedLong(omode); \ - if ((mode == (unsigned long)-1) && PyErr_Occurred()) { \ + mode_t mode = _PyLong_AsMode_t(omode); \ + if ((mode == (mode_t)-1) && PyErr_Occurred()) \ return NULL; \ - } \ return PyBool_FromLong(isfunc(mode)); \ } \ PyDoc_STRVAR(stat_ ## isfunc ## _doc, doc) @@ -318,10 +335,9 @@ PyDoc_STRVAR(stat_S_IMODE_doc, static PyObject * stat_S_IMODE(PyObject *self, PyObject *omode) { - unsigned long mode = PyLong_AsUnsignedLong(omode); - if ((mode == (unsigned long)-1) && PyErr_Occurred()) { + mode_t mode = _PyLong_AsMode_t(omode); + if ((mode == (mode_t)-1) && PyErr_Occurred()) return NULL; - } return PyLong_FromUnsignedLong(mode & S_IMODE); } @@ -332,10 +348,9 @@ PyDoc_STRVAR(stat_S_IFMT_doc, static PyObject * stat_S_IFMT(PyObject *self, PyObject *omode) { - unsigned long mode = PyLong_AsUnsignedLong(omode); - if ((mode == (unsigned long)-1) && PyErr_Occurred()) { + mode_t mode = _PyLong_AsMode_t(omode); + if ((mode == (mode_t)-1) && PyErr_Occurred()) return NULL; - } return PyLong_FromUnsignedLong(mode & S_IFMT); } @@ -395,12 +410,11 @@ static PyObject * stat_filemode(PyObject *self, PyObject *omode) { char buf[10]; - unsigned long mode; + mode_t mode; - mode = PyLong_AsUnsignedLong(omode); - if ((mode == (unsigned long)-1) && PyErr_Occurred()) { + mode = _PyLong_AsMode_t(omode); + if ((mode == (mode_t)-1) && PyErr_Occurred()) return NULL; - } buf[0] = filetype(mode); fileperm(mode, &buf[1]); |