]> granicus.if.org Git - python/commitdiff
vgetargskeywords()
authorTim Peters <tim.peters@gmail.com>
Sat, 27 Oct 2001 07:25:06 +0000 (07:25 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 27 Oct 2001 07:25:06 +0000 (07:25 +0000)
+ Squash another potential buffer overrun.
+ Simplify the keyword-arg loop by decrementing the count of keywords
  remaining instead of incrementing Yet Another Variable; also break
  out early if the number of keyword args remaining hits 0.

Since I hit the function's closing curly brace with this patch, that's
enough of this for now <wink>.

Python/getargs.c

index c65c149d1dbb476d076ed0a957e8b3b93074d27c..248def36cab44b8948fd31a3b0e8ac89026b0be8 100644 (file)
@@ -1033,9 +1033,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
        int min, max;
        char *formatsave;
        int i, len, nargs, nkeywords;
-       char *msg, *ks, **p;
-       int pos, match, converted;
-       PyObject *key, *value;
+       char *msg, **p;
 
        assert(args != NULL && PyTuple_Check(args));
        assert(keywords == NULL || PyDict_Check(keywords));
@@ -1150,7 +1148,8 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
                PyErr_SetString(PyExc_TypeError, message);
                return 0;
        }
-       
+
+       /* convert the positional arguments */
        for (i = 0; i < nargs; i++) {
                if (*format == '|')
                        format++;
@@ -1162,13 +1161,12 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
                }
        }
 
-       /* handle no keyword parameters in call  */     
+       /* handle no keyword parameters in call */      
        if (nkeywords == 0)
                return 1; 
 
        /* convert the keyword arguments; this uses the format 
           string where it was left after processing args */
-       converted = 0;
        for (i = nargs; i < max; i++) {
                PyObject *item;
                if (*format == '|')
@@ -1182,7 +1180,9 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
                                seterror(i+1, msg, levels, fname, message);
                                return 0;
                        }
-                       converted++;
+                       --nkeywords;
+                       if (nkeywords == 0)
+                               break;
                }
                else if (PyErr_Occurred())
                        return 0;
@@ -1196,11 +1196,12 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
        }
 
        /* make sure there are no extraneous keyword arguments */
-       pos = 0;
-       if (converted < nkeywords) {
+       if (nkeywords > 0) {
+               PyObject *key, *value;
+               int pos = 0;
                while (PyDict_Next(keywords, &pos, &key, &value)) {
-                       match = 0;
-                       ks = PyString_AsString(key);
+                       int match = 0;
+                       char *ks = PyString_AsString(key);
                        for (i = 0; i < max; i++) {
                                if (!strcmp(ks, kwlist[i])) {
                                        match = 1;
@@ -1208,15 +1209,15 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
                                }
                        }
                        if (!match) {
-                               sprintf(msgbuf,
-                       "%s is an invalid keyword argument for this function",
-                                       ks);
-                               PyErr_SetString(PyExc_TypeError, msgbuf);
+                               PyErr_Format(PyExc_TypeError,
+                                            "'%s' is an invalid keyword "
+                                            "argument for this function",
+                                            ks);
                                return 0;
                        }
                }
        }
-       
+
        return 1;
 }