diff options
author | Neil Schemenauer <nascheme@enme.ucalgary.ca> | 2003-01-24 22:15:21 (GMT) |
---|---|---|
committer | Neil Schemenauer <nascheme@enme.ucalgary.ca> | 2003-01-24 22:15:21 (GMT) |
commit | b808e99d34dc27204d2c8ad07489c2ba84dd98f5 (patch) | |
tree | d896af47fe81a84f6e22cd5ef5a01c87db84acaa /Python | |
parent | 3422c99de1d1c001ebc1416e3efc1b10452347b5 (diff) | |
download | cpython-b808e99d34dc27204d2c8ad07489c2ba84dd98f5.zip cpython-b808e99d34dc27204d2c8ad07489c2ba84dd98f5.tar.gz cpython-b808e99d34dc27204d2c8ad07489c2ba84dd98f5.tar.bz2 |
Raise a TypeError if a float is passed when an integer is specified.
Calling PyInt_AsLong() on a float truncates it which is almost never
the desired behavior. This closes SF bug #660144.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/getargs.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/Python/getargs.c b/Python/getargs.c index 58ef2a3..50f6034 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -408,7 +408,10 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, case 'b': { /* unsigned byte -- very short int */ char *p = va_arg(*p_va, char *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<b>", arg, msgbuf, bufsize); else if (ival < 0) { @@ -429,7 +432,10 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, case 'B': {/* byte sized bitfield - both signed and unsigned values allowed */ char *p = va_arg(*p_va, char *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<b>", arg, msgbuf, bufsize); else if (ival < SCHAR_MIN) { @@ -449,7 +455,10 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, case 'h': {/* signed short int */ short *p = va_arg(*p_va, short *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<h>", arg, msgbuf, bufsize); else if (ival < SHRT_MIN) { @@ -470,7 +479,10 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, case 'H': { /* short int sized bitfield, both signed and unsigned allowed */ unsigned short *p = va_arg(*p_va, unsigned short *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<H>", arg, msgbuf, bufsize); else if (ival < SHRT_MIN) { @@ -490,7 +502,10 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, case 'i': {/* signed int */ int *p = va_arg(*p_va, int *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<i>", arg, msgbuf, bufsize); else if (ival > INT_MAX) { @@ -510,7 +525,10 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, case 'l': {/* long int */ long *p = va_arg(*p_va, long *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<l>", arg, msgbuf, bufsize); else |