Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fccfe89

Browse files
committed
Another veeeeeery old patch...
Date: Thu, 14 Sep 1995 12:18:20 -0400 From: Alan Morse <[email protected]> To: [email protected] Subject: getargs bug in 1.2 and 1.3 BETA We have found a bug in the part of the getargs code that we added and submitted, and which was incorporated into 1.1. The parsing of "O?" format specifiers is not handled correctly; there is no "else" for the "if" and therefore it can never fail. What's worse, the advancing of the varargs pointer is not handled properly, so from then on it is out of sync, wreaking all sorts of havoc. (If it had failed properly, then the out-of-sync varargs would not have been an issue.) Below is the context diff for the change. Note that I have made a few stylistic changes beyond adding the else case, namely: 1) Making the "O" case follow the convention established by the other format specifiers of getting all their vararg arguments before performing the test, rather than getting some before and some after the test passes. 2) Making the logic of the tests parallel, so the "if" part indicates that the format is accepted and the "else" part indicates that the format has failed. They were inconsistent with each other and with the the other format specifiers. -Alan Morse ([email protected])
1 parent 837d8bf commit fccfe89

1 file changed

Lines changed: 11 additions & 9 deletions

File tree

Python/getargs.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -640,22 +640,24 @@ convertsimple1(arg, p_format, p_va)
640640
PyTypeObject *type;
641641
PyObject **p;
642642
if (*format == '!') {
643-
format++;
644643
type = va_arg(*p_va, PyTypeObject*);
645-
if (arg->ob_type != type)
646-
return type->tp_name;
647-
else {
648-
p = va_arg(*p_va, PyObject **);
644+
p = va_arg(*p_va, PyObject **);
645+
format++;
646+
if (arg->ob_type == type)
649647
*p = arg;
650-
}
648+
else
649+
return type->tp_name;
650+
651651
}
652652
else if (*format == '?') {
653653
inquiry pred = va_arg(*p_va, inquiry);
654+
p = va_arg(*p_va, PyObject **);
654655
format++;
655-
if ((*pred)(arg)) {
656-
p = va_arg(*p_va, PyObject **);
656+
if ((*pred)(arg))
657657
*p = arg;
658-
}
658+
else
659+
return "(unspecified)";
660+
659661
}
660662
else if (*format == '&') {
661663
typedef int (*converter)

0 commit comments

Comments
 (0)