From b808e99d34dc27204d2c8ad07489c2ba84dd98f5 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Fri, 24 Jan 2003 22:15:21 +0000 Subject: [PATCH] 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. --- Python/getargs.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/Python/getargs.c b/Python/getargs.c index 58ef2a3fe9..50f6034f59 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", 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", 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", 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", 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", 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", arg, msgbuf, bufsize); else -- 2.40.0