@@ -396,26 +396,24 @@ win32_warn_bytes_api()
396396#endif
397397
398398static int
399- _fd_converter (PyObject * o , int * p , int default_value ) {
400- long long_value ;
401- if (o == Py_None ) {
402- * p = default_value ;
403- return 1 ;
404- }
405- if (PyFloat_Check (o )) {
406- PyErr_SetString (PyExc_TypeError ,
407- "integer argument expected, got float" );
399+ _fd_converter (PyObject * o , int * p , const char * allowed )
400+ {
401+ int overflow ;
402+ long long_value = PyLong_AsLongAndOverflow (o , & overflow );
403+ if (PyFloat_Check (o ) ||
404+ (long_value == -1 && !overflow && PyErr_Occurred ())) {
405+ PyErr_Clear ();
406+ PyErr_Format (PyExc_TypeError ,
407+ "argument should be %s, not %.200s" ,
408+ allowed , Py_TYPE (o )-> tp_name );
408409 return 0 ;
409410 }
410- long_value = PyLong_AsLong (o );
411- if (long_value == -1 && PyErr_Occurred ())
412- return 0 ;
413- if (long_value > INT_MAX ) {
411+ if (overflow > 0 || long_value > INT_MAX ) {
414412 PyErr_SetString (PyExc_OverflowError ,
415413 "signed integer is greater than maximum" );
416414 return 0 ;
417415 }
418- if (long_value < INT_MIN ) {
416+ if (overflow < 0 || long_value < INT_MIN ) {
419417 PyErr_SetString (PyExc_OverflowError ,
420418 "signed integer is less than minimum" );
421419 return 0 ;
@@ -425,8 +423,13 @@ _fd_converter(PyObject *o, int *p, int default_value) {
425423}
426424
427425static int
428- dir_fd_converter (PyObject * o , void * p ) {
429- return _fd_converter (o , (int * )p , DEFAULT_DIR_FD );
426+ dir_fd_converter (PyObject * o , void * p )
427+ {
428+ if (o == Py_None ) {
429+ * (int * )p = DEFAULT_DIR_FD ;
430+ return 1 ;
431+ }
432+ return _fd_converter (o , (int * )p , "integer" );
430433}
431434
432435
@@ -603,17 +606,16 @@ path_converter(PyObject *o, void *p) {
603606 }
604607 else {
605608 PyErr_Clear ();
606- bytes = PyBytes_FromObject (o );
609+ if (PyObject_CheckBuffer (o ))
610+ bytes = PyBytes_FromObject (o );
611+ else
612+ bytes = NULL ;
607613 if (!bytes ) {
608614 PyErr_Clear ();
609615 if (path -> allow_fd ) {
610616 int fd ;
611- /*
612- * note: _fd_converter always permits None.
613- * but we've already done our None check.
614- * so o cannot be None at this point.
615- */
616- int result = _fd_converter (o , & fd , -1 );
617+ int result = _fd_converter (o , & fd ,
618+ "string, bytes or integer" );
617619 if (result ) {
618620 path -> wide = NULL ;
619621 path -> narrow = NULL ;
@@ -674,15 +676,17 @@ argument_unavailable_error(char *function_name, char *argument_name) {
674676}
675677
676678static int
677- dir_fd_unavailable (PyObject * o , void * p ) {
678- int * dir_fd = ( int * ) p ;
679- int return_value = _fd_converter ( o , dir_fd , DEFAULT_DIR_FD ) ;
680- if (!return_value )
679+ dir_fd_unavailable (PyObject * o , void * p )
680+ {
681+ int dir_fd ;
682+ if (!dir_fd_converter ( o , & dir_fd ) )
681683 return 0 ;
682- if (* dir_fd == DEFAULT_DIR_FD )
683- return 1 ;
684- argument_unavailable_error (NULL , "dir_fd" );
685- return 0 ;
684+ if (dir_fd != DEFAULT_DIR_FD ) {
685+ argument_unavailable_error (NULL , "dir_fd" );
686+ return 0 ;
687+ }
688+ * (int * )p = dir_fd ;
689+ return 1 ;
686690}
687691
688692static int
0 commit comments