summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorNeil Schemenauer <nascheme@enme.ucalgary.ca>2003-01-24 22:15:21 (GMT)
committerNeil Schemenauer <nascheme@enme.ucalgary.ca>2003-01-24 22:15:21 (GMT)
commitb808e99d34dc27204d2c8ad07489c2ba84dd98f5 (patch)
treed896af47fe81a84f6e22cd5ef5a01c87db84acaa /Python
parent3422c99de1d1c001ebc1416e3efc1b10452347b5 (diff)
downloadcpython-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.c30
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