@@ -347,14 +347,32 @@ update_ufd_array(pollObject *self)
347347 assert (i < self -> ufd_len );
348348 /* Never overflow */
349349 self -> ufds [i ].fd = (int )PyInt_AsLong (key );
350- self -> ufds [i ].events = (short )PyInt_AsLong (value );
350+ self -> ufds [i ].events = (short )( unsigned short ) PyInt_AsLong (value );
351351 i ++ ;
352352 }
353353 assert (i == self -> ufd_len );
354354 self -> ufd_uptodate = 1 ;
355355 return 1 ;
356356}
357357
358+ static int
359+ ushort_converter (PyObject * obj , void * ptr )
360+ {
361+ unsigned long uval ;
362+
363+ uval = PyLong_AsUnsignedLong (obj );
364+ if (uval == (unsigned long )-1 && PyErr_Occurred ())
365+ return 0 ;
366+ if (uval > USHRT_MAX ) {
367+ PyErr_SetString (PyExc_OverflowError ,
368+ "Python int too large for C unsigned short" );
369+ return 0 ;
370+ }
371+
372+ * (unsigned short * )ptr = Py_SAFE_DOWNCAST (uval , unsigned long , unsigned short );
373+ return 1 ;
374+ }
375+
358376PyDoc_STRVAR (poll_register_doc ,
359377"register(fd [, eventmask] ) -> None\n\n\
360378Register a file descriptor with the polling object.\n\
@@ -366,12 +384,12 @@ static PyObject *
366384poll_register (pollObject * self , PyObject * args )
367385{
368386 PyObject * o , * key , * value ;
369- int fd , events = POLLIN | POLLPRI | POLLOUT ;
387+ int fd ;
388+ unsigned short events = POLLIN | POLLPRI | POLLOUT ;
370389 int err ;
371390
372- if (!PyArg_ParseTuple (args , "O|i :register" , & o , & events )) {
391+ if (!PyArg_ParseTuple (args , "O|O& :register" , & o , ushort_converter , & events ))
373392 return NULL ;
374- }
375393
376394 fd = PyObject_AsFileDescriptor (o );
377395 if (fd == -1 ) return NULL ;
@@ -409,12 +427,12 @@ static PyObject *
409427poll_modify (pollObject * self , PyObject * args )
410428{
411429 PyObject * o , * key , * value ;
412- int fd , events ;
430+ int fd ;
431+ unsigned short events ;
413432 int err ;
414433
415- if (!PyArg_ParseTuple (args , "Oi :modify" , & o , & events )) {
434+ if (!PyArg_ParseTuple (args , "OO& :modify" , & o , ushort_converter , & events ))
416435 return NULL ;
417- }
418436
419437 fd = PyObject_AsFileDescriptor (o );
420438 if (fd == -1 ) return NULL ;
0 commit comments