[issue23098] mknod devices can be >32 bits

Serhiy Storchaka report at bugs.python.org
Tue Dec 23 08:55:51 CET 2014


Serhiy Storchaka added the comment:

And here are patches for 2.7 and 3.4 (unfortunately none of patches is applied 
clear to other version).

----------
Added file: http://bugs.python.org/file37532/posix_dev_t_converter-2.7.patch
Added file: http://bugs.python.org/file37533/posix_dev_t_converter-3.4.patch

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue23098>
_______________________________________
-------------- next part --------------
diff -r c6491d91d59a Modules/posixmodule.c
--- a/Modules/posixmodule.c	Sat Dec 20 17:42:24 2014 +0200
+++ b/Modules/posixmodule.c	Tue Dec 23 09:48:10 2014 +0200
@@ -474,6 +474,29 @@ OverflowUp:
 #endif /* MS_WINDOWS */
 
 
+#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
+static int
+_Py_Dev_Converter(PyObject *obj, void *p)
+{
+#ifdef HAVE_LONG_LONG
+    *((dev_t *)p) = PyLong_AsUnsignedLongLong(obj);
+#else
+    *((dev_t *)p) = PyLong_AsUnsignedLong(obj);
+#endif
+    if (PyErr_Occurred())
+        return 0;
+    return 1;
+}
+
+#ifdef HAVE_LONG_LONG
+#  define _PyLong_FromDev PyLong_FromLongLong
+#else
+#  define _PyLong_FromDev PyLong_FromLong
+#endif
+
+#endif
+
+
 #if defined _MSC_VER && _MSC_VER >= 1400
 /* Microsoft CRT in VS2005 and higher will verify that a filehandle is
  * valid and raise an assertion if it isn't.
@@ -1426,11 +1449,10 @@ static PyObject*
 #else
     PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long)st->st_ino));
 #endif
-#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS)
-    PyStructSequence_SET_ITEM(v, 2,
-                              PyLong_FromLongLong((PY_LONG_LONG)st->st_dev));
+#ifdef MS_WINDOWS
+    PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev));
 #else
-    PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long)st->st_dev));
+    PyStructSequence_SET_ITEM(v, 2, _PyLong_FromDev(st->st_dev));
 #endif
     PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long)st->st_nlink));
 #if defined(MS_WINDOWS)
@@ -7009,9 +7031,11 @@ posix_mknod(PyObject *self, PyObject *ar
 {
     char *filename;
     int mode = 0600;
-    int device = 0;
+    dev_t device = 0;
     int res;
-    if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device))
+    if (!PyArg_ParseTuple(args, "s|iO&:mknod",
+        &filename, &mode,
+        _Py_Dev_Converter, &device))
         return NULL;
     Py_BEGIN_ALLOW_THREADS
     res = mknod(filename, mode, device);
@@ -7031,8 +7055,8 @@ Extracts a device major number from a ra
 static PyObject *
 posix_major(PyObject *self, PyObject *args)
 {
-    int device;
-    if (!PyArg_ParseTuple(args, "i:major", &device))
+    dev_t device;
+    if (!PyArg_ParseTuple(args, "O&:major", _Py_Dev_Converter, &device))
         return NULL;
     return PyInt_FromLong((long)major(device));
 }
@@ -7044,8 +7068,8 @@ Extracts a device minor number from a ra
 static PyObject *
 posix_minor(PyObject *self, PyObject *args)
 {
-    int device;
-    if (!PyArg_ParseTuple(args, "i:minor", &device))
+    dev_t device;
+    if (!PyArg_ParseTuple(args, "O&:minor", _Py_Dev_Converter, &device))
         return NULL;
     return PyInt_FromLong((long)minor(device));
 }
@@ -7060,7 +7084,7 @@ posix_makedev(PyObject *self, PyObject *
     int major, minor;
     if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
         return NULL;
-    return PyInt_FromLong((long)makedev(major, minor));
+    return _PyLong_FromDev(makedev(major, minor));
 }
 #endif /* device macros */
 
@@ -8522,7 +8546,6 @@ setup_confname_table(struct constdef *ta
 {
     PyObject *d = NULL;
     size_t i;
-
     qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
     d = PyDict_New();
     if (d == NULL)
-------------- next part --------------
diff -r c4643b32cd9a Modules/posixmodule.c
--- a/Modules/posixmodule.c	Mon Dec 22 22:09:50 2014 +0100
+++ b/Modules/posixmodule.c	Tue Dec 23 09:37:08 2014 +0200
@@ -623,6 +623,29 @@ fail:
 #endif /* MS_WINDOWS */
 
 
+#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
+static int
+_Py_Dev_Converter(PyObject *obj, void *p)
+{
+#ifdef HAVE_LONG_LONG
+    *((dev_t *)p) = PyLong_AsUnsignedLongLong(obj);
+#else
+    *((dev_t *)p) = PyLong_AsUnsignedLong(obj);
+#endif
+    if (PyErr_Occurred())
+        return 0;
+    return 1;
+}
+
+#ifdef HAVE_LONG_LONG
+#  define _PyLong_FromDev PyLong_FromLongLong
+#else
+#  define _PyLong_FromDev PyLong_FromLong
+#endif
+
+#endif
+
+
 #ifdef AT_FDCWD
 /*
  * Why the (int) cast?  Solaris 10 defines AT_FDCWD as 0xffd19553 (-3041965);
@@ -2218,11 +2241,8 @@ static PyObject*
 #endif
 #ifdef MS_WINDOWS
     PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev));
-#elif defined(HAVE_LONG_LONG)
-    PyStructSequence_SET_ITEM(v, 2,
-                              PyLong_FromLongLong((PY_LONG_LONG)st->st_dev));
-#else
-    PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
+#else
+    PyStructSequence_SET_ITEM(v, 2, _PyLong_FromDev(st->st_dev));
 #endif
     PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
 #if defined(MS_WINDOWS)
@@ -8633,16 +8653,16 @@ posix_mknod(PyObject *self, PyObject *ar
 {
     path_t path;
     int mode = 0666;
-    int device = 0;
+    dev_t device = 0;
     int dir_fd = DEFAULT_DIR_FD;
     int result;
     PyObject *return_value = NULL;
     static char *keywords[] = {"path", "mode", "device", "dir_fd", NULL};
 
     memset(&path, 0, sizeof(path));
-    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|ii$O&:mknod", keywords,
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|iO&$O&:mknod", keywords,
         path_converter, &path,
-        &mode, &device,
+        &mode, _Py_Dev_Converter, &device,
 #ifdef HAVE_MKNODAT
         dir_fd_converter, &dir_fd
 #else
@@ -8682,8 +8702,8 @@ Extracts a device major number from a ra
 static PyObject *
 posix_major(PyObject *self, PyObject *args)
 {
-    int device;
-    if (!PyArg_ParseTuple(args, "i:major", &device))
+    dev_t device;
+    if (!PyArg_ParseTuple(args, "O&:major", _Py_Dev_Converter, &device))
         return NULL;
     return PyLong_FromLong((long)major(device));
 }
@@ -8695,8 +8715,8 @@ Extracts a device minor number from a ra
 static PyObject *
 posix_minor(PyObject *self, PyObject *args)
 {
-    int device;
-    if (!PyArg_ParseTuple(args, "i:minor", &device))
+    dev_t device;
+    if (!PyArg_ParseTuple(args, "O&:minor", _Py_Dev_Converter, &device))
         return NULL;
     return PyLong_FromLong((long)minor(device));
 }
@@ -8711,7 +8731,7 @@ posix_makedev(PyObject *self, PyObject *
     int major, minor;
     if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
         return NULL;
-    return PyLong_FromLong((long)makedev(major, minor));
+    return _PyLong_FromDev(makedev(major, minor));
 }
 #endif /* device macros */
 


More information about the Python-bugs-list mailing list