@@ -877,16 +877,42 @@ _Py_Gid_Converter(PyObject *obj, gid_t *p)
877
877
#endif /* MS_WINDOWS */
878
878
879
879
880
- #define _PyLong_FromDev PyLong_FromLongLong
880
+ static PyObject *
881
+ _PyLong_FromDev (dev_t dev )
882
+ {
883
+ if (dev == NODEV ) {
884
+ return PyLong_FromLongLong ((long long )dev );
885
+ }
886
+ return PyLong_FromUnsignedLongLong ((unsigned long long )dev );
887
+ }
881
888
882
889
883
890
#if (defined(HAVE_MKNOD ) && defined(HAVE_MAKEDEV )) || defined(HAVE_DEVICE_MACROS )
884
891
static int
885
892
_Py_Dev_Converter (PyObject * obj , void * p )
886
893
{
887
- * ((dev_t * )p ) = PyLong_AsUnsignedLongLong (obj );
888
- if (PyErr_Occurred ())
894
+ if (PyLong_Check (obj ) && Py_SIZE (obj ) < 0 ) {
895
+ int overflow ;
896
+ long long result = PyLong_AsLongLongAndOverflow (obj , & overflow );
897
+ if (result == -1 && PyErr_Occurred ()) {
898
+ return 0 ;
899
+ }
900
+ if (!overflow && result == (long long )NODEV ) {
901
+ * ((dev_t * )p ) = NODEV ;
902
+ return 1 ;
903
+ }
904
+ }
905
+
906
+ unsigned long long result = PyLong_AsUnsignedLongLong (obj );
907
+ if (result == (unsigned long long )-1 && PyErr_Occurred ()) {
889
908
return 0 ;
909
+ }
910
+ if ((unsigned long long )(dev_t )result != result ) {
911
+ PyErr_SetString (PyExc_OverflowError ,
912
+ "Python int too large to convert to C dev_t" );
913
+ return 0 ;
914
+ }
915
+ * ((dev_t * )p ) = (dev_t )result ;
890
916
return 1 ;
891
917
}
892
918
#endif /* (HAVE_MKNOD && HAVE_MAKEDEV) || HAVE_DEVICE_MACROS */
@@ -10638,53 +10664,68 @@ os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
10638
10664
10639
10665
#ifdef HAVE_DEVICE_MACROS
10640
10666
/*[clinic input]
10641
- os.major -> unsigned_int
10667
+ os.major
10642
10668
10643
10669
device: dev_t
10644
10670
/
10645
10671
10646
10672
Extracts a device major number from a raw device number.
10647
10673
[clinic start generated code]*/
10648
10674
10649
- static unsigned int
10675
+ static PyObject *
10650
10676
os_major_impl (PyObject * module , dev_t device )
10651
- /*[clinic end generated code: output=5b3b2589bafb498e input=1e16a4d30c4d4462 ]*/
10677
+ /*[clinic end generated code: output=4071ffee17647891 input=b1a0a14ec9448229 ]*/
10652
10678
{
10653
- return major (device );
10679
+ unsigned int result = major (device );
10680
+ if (result == (unsigned int )NODEV ) {
10681
+ return PyLong_FromLong ((int )NODEV );
10682
+ }
10683
+ return PyLong_FromUnsignedLong (result );
10654
10684
}
10655
10685
10656
10686
10657
10687
/*[clinic input]
10658
- os.minor -> unsigned_int
10688
+ os.minor
10659
10689
10660
10690
device: dev_t
10661
10691
/
10662
10692
10663
10693
Extracts a device minor number from a raw device number.
10664
10694
[clinic start generated code]*/
10665
10695
10666
- static unsigned int
10696
+ static PyObject *
10667
10697
os_minor_impl (PyObject * module , dev_t device )
10668
- /*[clinic end generated code: output=5e1a25e630b0157d input=0842c6d23f24c65e ]*/
10698
+ /*[clinic end generated code: output=306cb78e3bc5004f input=2f686e463682a9da ]*/
10669
10699
{
10670
- return minor (device );
10700
+ unsigned int result = minor (device );
10701
+ if (result == (unsigned int )NODEV ) {
10702
+ return PyLong_FromLong ((int )NODEV );
10703
+ }
10704
+ return PyLong_FromUnsignedLong (result );
10671
10705
}
10672
10706
10673
10707
10674
10708
/*[clinic input]
10675
10709
os.makedev -> dev_t
10676
10710
10677
- major: int
10678
- minor: int
10711
+ major: dev_t
10712
+ minor: dev_t
10679
10713
/
10680
10714
10681
10715
Composes a raw device number from the major and minor device numbers.
10682
10716
[clinic start generated code]*/
10683
10717
10684
10718
static dev_t
10685
- os_makedev_impl (PyObject * module , int major , int minor )
10686
- /*[clinic end generated code: output=881aaa4aba6f6a52 input=4b9fd8fc73cbe48f ]*/
10719
+ os_makedev_impl (PyObject * module , dev_t major , dev_t minor )
10720
+ /*[clinic end generated code: output=cad6125c51f5af80 input=2146126ec02e55c1 ]*/
10687
10721
{
10722
+ if ((major != NODEV && (dev_t )(unsigned int )major != major ) ||
10723
+ (minor != NODEV && (dev_t )(unsigned int )minor != minor ))
10724
+ {
10725
+ PyErr_SetString (PyExc_OverflowError ,
10726
+ "Python int too large to convert to C unsigned int" );
10727
+ return (dev_t )- 1 ;
10728
+ }
10688
10729
return makedev (major , minor );
10689
10730
}
10690
10731
#endif /* HAVE_DEVICE_MACROS */
0 commit comments