1 
2 /* New getargs implementation */
3 
4 #include "Python.h"
5 #include "pycore_tuple.h"         // _PyTuple_ITEMS()
6 #include "pycore_pylifecycle.h"   // _PyArg_Fini
7 
8 #include <ctype.h>
9 #include <float.h>
10 
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 int PyArg_Parse(PyObject *, const char *, ...);
16 int PyArg_ParseTuple(PyObject *, const char *, ...);
17 int PyArg_VaParse(PyObject *, const char *, va_list);
18 
19 int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
20                                 const char *, char **, ...);
21 int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
22                                 const char *, char **, va_list);
23 
24 int _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *,
25                                             struct _PyArg_Parser *, ...);
26 int _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *,
27                                             struct _PyArg_Parser *, va_list);
28 
29 #ifdef HAVE_DECLSPEC_DLL
30 /* Export functions */
31 PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...);
32 PyAPI_FUNC(int) _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs,
33                                         const char *format, ...);
34 PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs,
35                                         PyObject *kwnames,
36                                         struct _PyArg_Parser *parser, ...);
37 PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, const char *, ...);
38 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
39                                                   const char *, char **, ...);
40 PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
41 PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, const char *, va_list);
42 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
43                                               const char *, char **, va_list);
44 
45 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
46                                             struct _PyArg_Parser *, ...);
47 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
48                                             struct _PyArg_Parser *, va_list);
49 #endif
50 
51 #define FLAG_COMPAT 1
52 #define FLAG_SIZE_T 2
53 
54 typedef int (*destr_t)(PyObject *, void *);
55 
56 
57 /* Keep track of "objects" that have been allocated or initialized and
58    which will need to be deallocated or cleaned up somehow if overall
59    parsing fails.
60 */
61 typedef struct {
62   void *item;
63   destr_t destructor;
64 } freelistentry_t;
65 
66 typedef struct {
67   freelistentry_t *entries;
68   int first_available;
69   int entries_malloced;
70 } freelist_t;
71 
72 #define STATIC_FREELIST_ENTRIES 8
73 
74 /* Forward */
75 static int vgetargs1_impl(PyObject *args, PyObject *const *stack, Py_ssize_t nargs,
76                           const char *format, va_list *p_va, int flags);
77 static int vgetargs1(PyObject *, const char *, va_list *, int);
78 static void seterror(Py_ssize_t, const char *, int *, const char *, const char *);
79 static const char *convertitem(PyObject *, const char **, va_list *, int, int *,
80                                char *, size_t, freelist_t *);
81 static const char *converttuple(PyObject *, const char **, va_list *, int,
82                                 int *, char *, size_t, int, freelist_t *);
83 static const char *convertsimple(PyObject *, const char **, va_list *, int,
84                                  char *, size_t, freelist_t *);
85 static Py_ssize_t convertbuffer(PyObject *, const void **p, const char **);
86 static int getbuffer(PyObject *, Py_buffer *, const char**);
87 
88 static int vgetargskeywords(PyObject *, PyObject *,
89                             const char *, char **, va_list *, int);
90 static int vgetargskeywordsfast(PyObject *, PyObject *,
91                             struct _PyArg_Parser *, va_list *, int);
92 static int vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
93                           PyObject *keywords, PyObject *kwnames,
94                           struct _PyArg_Parser *parser,
95                           va_list *p_va, int flags);
96 static const char *skipitem(const char **, va_list *, int);
97 
98 int
PyArg_Parse(PyObject * args,const char * format,...)99 PyArg_Parse(PyObject *args, const char *format, ...)
100 {
101     int retval;
102     va_list va;
103 
104     va_start(va, format);
105     retval = vgetargs1(args, format, &va, FLAG_COMPAT);
106     va_end(va);
107     return retval;
108 }
109 
110 PyAPI_FUNC(int)
_PyArg_Parse_SizeT(PyObject * args,const char * format,...)111 _PyArg_Parse_SizeT(PyObject *args, const char *format, ...)
112 {
113     int retval;
114     va_list va;
115 
116     va_start(va, format);
117     retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T);
118     va_end(va);
119     return retval;
120 }
121 
122 
123 int
PyArg_ParseTuple(PyObject * args,const char * format,...)124 PyArg_ParseTuple(PyObject *args, const char *format, ...)
125 {
126     int retval;
127     va_list va;
128 
129     va_start(va, format);
130     retval = vgetargs1(args, format, &va, 0);
131     va_end(va);
132     return retval;
133 }
134 
135 PyAPI_FUNC(int)
_PyArg_ParseTuple_SizeT(PyObject * args,const char * format,...)136 _PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...)
137 {
138     int retval;
139     va_list va;
140 
141     va_start(va, format);
142     retval = vgetargs1(args, format, &va, FLAG_SIZE_T);
143     va_end(va);
144     return retval;
145 }
146 
147 
148 int
_PyArg_ParseStack(PyObject * const * args,Py_ssize_t nargs,const char * format,...)149 _PyArg_ParseStack(PyObject *const *args, Py_ssize_t nargs, const char *format, ...)
150 {
151     int retval;
152     va_list va;
153 
154     va_start(va, format);
155     retval = vgetargs1_impl(NULL, args, nargs, format, &va, 0);
156     va_end(va);
157     return retval;
158 }
159 
160 PyAPI_FUNC(int)
_PyArg_ParseStack_SizeT(PyObject * const * args,Py_ssize_t nargs,const char * format,...)161 _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs, const char *format, ...)
162 {
163     int retval;
164     va_list va;
165 
166     va_start(va, format);
167     retval = vgetargs1_impl(NULL, args, nargs, format, &va, FLAG_SIZE_T);
168     va_end(va);
169     return retval;
170 }
171 
172 
173 int
PyArg_VaParse(PyObject * args,const char * format,va_list va)174 PyArg_VaParse(PyObject *args, const char *format, va_list va)
175 {
176     va_list lva;
177     int retval;
178 
179     va_copy(lva, va);
180 
181     retval = vgetargs1(args, format, &lva, 0);
182     va_end(lva);
183     return retval;
184 }
185 
186 PyAPI_FUNC(int)
_PyArg_VaParse_SizeT(PyObject * args,const char * format,va_list va)187 _PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va)
188 {
189     va_list lva;
190     int retval;
191 
192     va_copy(lva, va);
193 
194     retval = vgetargs1(args, format, &lva, FLAG_SIZE_T);
195     va_end(lva);
196     return retval;
197 }
198 
199 
200 /* Handle cleanup of allocated memory in case of exception */
201 
202 static int
cleanup_ptr(PyObject * self,void * ptr)203 cleanup_ptr(PyObject *self, void *ptr)
204 {
205     void **pptr = (void **)ptr;
206     PyMem_Free(*pptr);
207     *pptr = NULL;
208     return 0;
209 }
210 
211 static int
cleanup_buffer(PyObject * self,void * ptr)212 cleanup_buffer(PyObject *self, void *ptr)
213 {
214     Py_buffer *buf = (Py_buffer *)ptr;
215     if (buf) {
216         PyBuffer_Release(buf);
217     }
218     return 0;
219 }
220 
221 static int
addcleanup(void * ptr,freelist_t * freelist,destr_t destructor)222 addcleanup(void *ptr, freelist_t *freelist, destr_t destructor)
223 {
224     int index;
225 
226     index = freelist->first_available;
227     freelist->first_available += 1;
228 
229     freelist->entries[index].item = ptr;
230     freelist->entries[index].destructor = destructor;
231 
232     return 0;
233 }
234 
235 static int
cleanreturn(int retval,freelist_t * freelist)236 cleanreturn(int retval, freelist_t *freelist)
237 {
238     int index;
239 
240     if (retval == 0) {
241       /* A failure occurred, therefore execute all of the cleanup
242          functions.
243       */
244       for (index = 0; index < freelist->first_available; ++index) {
245           freelist->entries[index].destructor(NULL,
246                                               freelist->entries[index].item);
247       }
248     }
249     if (freelist->entries_malloced)
250         PyMem_Free(freelist->entries);
251     return retval;
252 }
253 
254 
255 static int
vgetargs1_impl(PyObject * compat_args,PyObject * const * stack,Py_ssize_t nargs,const char * format,va_list * p_va,int flags)256 vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, const char *format,
257                va_list *p_va, int flags)
258 {
259     char msgbuf[256];
260     int levels[32];
261     const char *fname = NULL;
262     const char *message = NULL;
263     int min = -1;
264     int max = 0;
265     int level = 0;
266     int endfmt = 0;
267     const char *formatsave = format;
268     Py_ssize_t i;
269     const char *msg;
270     int compat = flags & FLAG_COMPAT;
271     freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
272     freelist_t freelist;
273 
274     assert(nargs == 0 || stack != NULL);
275 
276     freelist.entries = static_entries;
277     freelist.first_available = 0;
278     freelist.entries_malloced = 0;
279 
280     flags = flags & ~FLAG_COMPAT;
281 
282     while (endfmt == 0) {
283         int c = *format++;
284         switch (c) {
285         case '(':
286             if (level == 0)
287                 max++;
288             level++;
289             if (level >= 30)
290                 Py_FatalError("too many tuple nesting levels "
291                               "in argument format string");
292             break;
293         case ')':
294             if (level == 0)
295                 Py_FatalError("excess ')' in getargs format");
296             else
297                 level--;
298             break;
299         case '\0':
300             endfmt = 1;
301             break;
302         case ':':
303             fname = format;
304             endfmt = 1;
305             break;
306         case ';':
307             message = format;
308             endfmt = 1;
309             break;
310         case '|':
311             if (level == 0)
312                 min = max;
313             break;
314         default:
315             if (level == 0) {
316                 if (Py_ISALPHA(c))
317                     if (c != 'e') /* skip encoded */
318                         max++;
319             }
320             break;
321         }
322     }
323 
324     if (level != 0)
325         Py_FatalError(/* '(' */ "missing ')' in getargs format");
326 
327     if (min < 0)
328         min = max;
329 
330     format = formatsave;
331 
332     if (max > STATIC_FREELIST_ENTRIES) {
333         freelist.entries = PyMem_NEW(freelistentry_t, max);
334         if (freelist.entries == NULL) {
335             PyErr_NoMemory();
336             return 0;
337         }
338         freelist.entries_malloced = 1;
339     }
340 
341     if (compat) {
342         if (max == 0) {
343             if (compat_args == NULL)
344                 return 1;
345             PyErr_Format(PyExc_TypeError,
346                          "%.200s%s takes no arguments",
347                          fname==NULL ? "function" : fname,
348                          fname==NULL ? "" : "()");
349             return cleanreturn(0, &freelist);
350         }
351         else if (min == 1 && max == 1) {
352             if (compat_args == NULL) {
353                 PyErr_Format(PyExc_TypeError,
354                              "%.200s%s takes at least one argument",
355                              fname==NULL ? "function" : fname,
356                              fname==NULL ? "" : "()");
357                 return cleanreturn(0, &freelist);
358             }
359             msg = convertitem(compat_args, &format, p_va, flags, levels,
360                               msgbuf, sizeof(msgbuf), &freelist);
361             if (msg == NULL)
362                 return cleanreturn(1, &freelist);
363             seterror(levels[0], msg, levels+1, fname, message);
364             return cleanreturn(0, &freelist);
365         }
366         else {
367             PyErr_SetString(PyExc_SystemError,
368                 "old style getargs format uses new features");
369             return cleanreturn(0, &freelist);
370         }
371     }
372 
373     if (nargs < min || max < nargs) {
374         if (message == NULL)
375             PyErr_Format(PyExc_TypeError,
376                          "%.150s%s takes %s %d argument%s (%zd given)",
377                          fname==NULL ? "function" : fname,
378                          fname==NULL ? "" : "()",
379                          min==max ? "exactly"
380                          : nargs < min ? "at least" : "at most",
381                          nargs < min ? min : max,
382                          (nargs < min ? min : max) == 1 ? "" : "s",
383                          nargs);
384         else
385             PyErr_SetString(PyExc_TypeError, message);
386         return cleanreturn(0, &freelist);
387     }
388 
389     for (i = 0; i < nargs; i++) {
390         if (*format == '|')
391             format++;
392         msg = convertitem(stack[i], &format, p_va,
393                           flags, levels, msgbuf,
394                           sizeof(msgbuf), &freelist);
395         if (msg) {
396             seterror(i+1, msg, levels, fname, message);
397             return cleanreturn(0, &freelist);
398         }
399     }
400 
401     if (*format != '\0' && !Py_ISALPHA(*format) &&
402         *format != '(' &&
403         *format != '|' && *format != ':' && *format != ';') {
404         PyErr_Format(PyExc_SystemError,
405                      "bad format string: %.200s", formatsave);
406         return cleanreturn(0, &freelist);
407     }
408 
409     return cleanreturn(1, &freelist);
410 }
411 
412 static int
vgetargs1(PyObject * args,const char * format,va_list * p_va,int flags)413 vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
414 {
415     PyObject **stack;
416     Py_ssize_t nargs;
417 
418     if (!(flags & FLAG_COMPAT)) {
419         assert(args != NULL);
420 
421         if (!PyTuple_Check(args)) {
422             PyErr_SetString(PyExc_SystemError,
423                 "new style getargs format but argument is not a tuple");
424             return 0;
425         }
426 
427         stack = _PyTuple_ITEMS(args);
428         nargs = PyTuple_GET_SIZE(args);
429     }
430     else {
431         stack = NULL;
432         nargs = 0;
433     }
434 
435     return vgetargs1_impl(args, stack, nargs, format, p_va, flags);
436 }
437 
438 
439 static void
seterror(Py_ssize_t iarg,const char * msg,int * levels,const char * fname,const char * message)440 seterror(Py_ssize_t iarg, const char *msg, int *levels, const char *fname,
441          const char *message)
442 {
443     char buf[512];
444     int i;
445     char *p = buf;
446 
447     if (PyErr_Occurred())
448         return;
449     else if (message == NULL) {
450         if (fname != NULL) {
451             PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname);
452             p += strlen(p);
453         }
454         if (iarg != 0) {
455             PyOS_snprintf(p, sizeof(buf) - (p - buf),
456                           "argument %zd", iarg);
457             i = 0;
458             p += strlen(p);
459             while (i < 32 && levels[i] > 0 && (int)(p-buf) < 220) {
460                 PyOS_snprintf(p, sizeof(buf) - (p - buf),
461                               ", item %d", levels[i]-1);
462                 p += strlen(p);
463                 i++;
464             }
465         }
466         else {
467             PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument");
468             p += strlen(p);
469         }
470         PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
471         message = buf;
472     }
473     if (msg[0] == '(') {
474         PyErr_SetString(PyExc_SystemError, message);
475     }
476     else {
477         PyErr_SetString(PyExc_TypeError, message);
478     }
479 }
480 
481 
482 /* Convert a tuple argument.
483    On entry, *p_format points to the character _after_ the opening '('.
484    On successful exit, *p_format points to the closing ')'.
485    If successful:
486       *p_format and *p_va are updated,
487       *levels and *msgbuf are untouched,
488       and NULL is returned.
489    If the argument is invalid:
490       *p_format is unchanged,
491       *p_va is undefined,
492       *levels is a 0-terminated list of item numbers,
493       *msgbuf contains an error message, whose format is:
494      "must be <typename1>, not <typename2>", where:
495         <typename1> is the name of the expected type, and
496         <typename2> is the name of the actual type,
497       and msgbuf is returned.
498 */
499 
500 static const char *
converttuple(PyObject * arg,const char ** p_format,va_list * p_va,int flags,int * levels,char * msgbuf,size_t bufsize,int toplevel,freelist_t * freelist)501 converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
502              int *levels, char *msgbuf, size_t bufsize, int toplevel,
503              freelist_t *freelist)
504 {
505     int level = 0;
506     int n = 0;
507     const char *format = *p_format;
508     int i;
509     Py_ssize_t len;
510 
511     for (;;) {
512         int c = *format++;
513         if (c == '(') {
514             if (level == 0)
515                 n++;
516             level++;
517         }
518         else if (c == ')') {
519             if (level == 0)
520                 break;
521             level--;
522         }
523         else if (c == ':' || c == ';' || c == '\0')
524             break;
525         else if (level == 0 && Py_ISALPHA(c))
526             n++;
527     }
528 
529     if (!PySequence_Check(arg) || PyBytes_Check(arg)) {
530         levels[0] = 0;
531         PyOS_snprintf(msgbuf, bufsize,
532                       toplevel ? "expected %d arguments, not %.50s" :
533                       "must be %d-item sequence, not %.50s",
534                   n,
535                   arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
536         return msgbuf;
537     }
538 
539     len = PySequence_Size(arg);
540     if (len != n) {
541         levels[0] = 0;
542         if (toplevel) {
543             PyOS_snprintf(msgbuf, bufsize,
544                           "expected %d argument%s, not %zd",
545                           n,
546                           n == 1 ? "" : "s",
547                           len);
548         }
549         else {
550             PyOS_snprintf(msgbuf, bufsize,
551                           "must be sequence of length %d, not %zd",
552                           n, len);
553         }
554         return msgbuf;
555     }
556 
557     format = *p_format;
558     for (i = 0; i < n; i++) {
559         const char *msg;
560         PyObject *item;
561         item = PySequence_GetItem(arg, i);
562         if (item == NULL) {
563             PyErr_Clear();
564             levels[0] = i+1;
565             levels[1] = 0;
566             strncpy(msgbuf, "is not retrievable", bufsize);
567             return msgbuf;
568         }
569         msg = convertitem(item, &format, p_va, flags, levels+1,
570                           msgbuf, bufsize, freelist);
571         /* PySequence_GetItem calls tp->sq_item, which INCREFs */
572         Py_XDECREF(item);
573         if (msg != NULL) {
574             levels[0] = i+1;
575             return msg;
576         }
577     }
578 
579     *p_format = format;
580     return NULL;
581 }
582 
583 
584 /* Convert a single item. */
585 
586 static const char *
convertitem(PyObject * arg,const char ** p_format,va_list * p_va,int flags,int * levels,char * msgbuf,size_t bufsize,freelist_t * freelist)587 convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
588             int *levels, char *msgbuf, size_t bufsize, freelist_t *freelist)
589 {
590     const char *msg;
591     const char *format = *p_format;
592 
593     if (*format == '(' /* ')' */) {
594         format++;
595         msg = converttuple(arg, &format, p_va, flags, levels, msgbuf,
596                            bufsize, 0, freelist);
597         if (msg == NULL)
598             format++;
599     }
600     else {
601         msg = convertsimple(arg, &format, p_va, flags,
602                             msgbuf, bufsize, freelist);
603         if (msg != NULL)
604             levels[0] = 0;
605     }
606     if (msg == NULL)
607         *p_format = format;
608     return msg;
609 }
610 
611 
612 
613 /* Format an error message generated by convertsimple().
614    displayname must be UTF-8 encoded.
615 */
616 
617 void
_PyArg_BadArgument(const char * fname,const char * displayname,const char * expected,PyObject * arg)618 _PyArg_BadArgument(const char *fname, const char *displayname,
619                    const char *expected, PyObject *arg)
620 {
621     PyErr_Format(PyExc_TypeError,
622                  "%.200s() %.200s must be %.50s, not %.50s",
623                  fname, displayname, expected,
624                  arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
625 }
626 
627 static const char *
converterr(const char * expected,PyObject * arg,char * msgbuf,size_t bufsize)628 converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
629 {
630     assert(expected != NULL);
631     assert(arg != NULL);
632     if (expected[0] == '(') {
633         PyOS_snprintf(msgbuf, bufsize,
634                       "%.100s", expected);
635     }
636     else {
637         PyOS_snprintf(msgbuf, bufsize,
638                       "must be %.50s, not %.50s", expected,
639                       arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
640     }
641     return msgbuf;
642 }
643 
644 #define CONV_UNICODE "(unicode conversion error)"
645 
646 /* Convert a non-tuple argument.  Return NULL if conversion went OK,
647    or a string with a message describing the failure.  The message is
648    formatted as "must be <desired type>, not <actual type>".
649    When failing, an exception may or may not have been raised.
650    Don't call if a tuple is expected.
651 
652    When you add new format codes, please don't forget poor skipitem() below.
653 */
654 
655 static const char *
convertsimple(PyObject * arg,const char ** p_format,va_list * p_va,int flags,char * msgbuf,size_t bufsize,freelist_t * freelist)656 convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
657               char *msgbuf, size_t bufsize, freelist_t *freelist)
658 {
659 #define RETURN_ERR_OCCURRED return msgbuf
660     /* For # codes */
661 #define REQUIRE_PY_SSIZE_T_CLEAN \
662     if (!(flags & FLAG_SIZE_T)) { \
663         PyErr_SetString(PyExc_SystemError, \
664                         "PY_SSIZE_T_CLEAN macro must be defined for '#' formats"); \
665         RETURN_ERR_OCCURRED; \
666     }
667 
668     const char *format = *p_format;
669     char c = *format++;
670     const char *sarg;
671 
672     switch (c) {
673 
674     case 'b': { /* unsigned byte -- very short int */
675         char *p = va_arg(*p_va, char *);
676         long ival = PyLong_AsLong(arg);
677         if (ival == -1 && PyErr_Occurred())
678             RETURN_ERR_OCCURRED;
679         else if (ival < 0) {
680             PyErr_SetString(PyExc_OverflowError,
681                             "unsigned byte integer is less than minimum");
682             RETURN_ERR_OCCURRED;
683         }
684         else if (ival > UCHAR_MAX) {
685             PyErr_SetString(PyExc_OverflowError,
686                             "unsigned byte integer is greater than maximum");
687             RETURN_ERR_OCCURRED;
688         }
689         else
690             *p = (unsigned char) ival;
691         break;
692     }
693 
694     case 'B': {/* byte sized bitfield - both signed and unsigned
695                   values allowed */
696         char *p = va_arg(*p_va, char *);
697         unsigned long ival = PyLong_AsUnsignedLongMask(arg);
698         if (ival == (unsigned long)-1 && PyErr_Occurred())
699             RETURN_ERR_OCCURRED;
700         else
701             *p = (unsigned char) ival;
702         break;
703     }
704 
705     case 'h': {/* signed short int */
706         short *p = va_arg(*p_va, short *);
707         long ival = PyLong_AsLong(arg);
708         if (ival == -1 && PyErr_Occurred())
709             RETURN_ERR_OCCURRED;
710         else if (ival < SHRT_MIN) {
711             PyErr_SetString(PyExc_OverflowError,
712                             "signed short integer is less than minimum");
713             RETURN_ERR_OCCURRED;
714         }
715         else if (ival > SHRT_MAX) {
716             PyErr_SetString(PyExc_OverflowError,
717                             "signed short integer is greater than maximum");
718             RETURN_ERR_OCCURRED;
719         }
720         else
721             *p = (short) ival;
722         break;
723     }
724 
725     case 'H': { /* short int sized bitfield, both signed and
726                    unsigned allowed */
727         unsigned short *p = va_arg(*p_va, unsigned short *);
728         unsigned long ival = PyLong_AsUnsignedLongMask(arg);
729         if (ival == (unsigned long)-1 && PyErr_Occurred())
730             RETURN_ERR_OCCURRED;
731         else
732             *p = (unsigned short) ival;
733         break;
734     }
735 
736     case 'i': {/* signed int */
737         int *p = va_arg(*p_va, int *);
738         long ival = PyLong_AsLong(arg);
739         if (ival == -1 && PyErr_Occurred())
740             RETURN_ERR_OCCURRED;
741         else if (ival > INT_MAX) {
742             PyErr_SetString(PyExc_OverflowError,
743                             "signed integer is greater than maximum");
744             RETURN_ERR_OCCURRED;
745         }
746         else if (ival < INT_MIN) {
747             PyErr_SetString(PyExc_OverflowError,
748                             "signed integer is less than minimum");
749             RETURN_ERR_OCCURRED;
750         }
751         else
752             *p = ival;
753         break;
754     }
755 
756     case 'I': { /* int sized bitfield, both signed and
757                    unsigned allowed */
758         unsigned int *p = va_arg(*p_va, unsigned int *);
759         unsigned long ival = PyLong_AsUnsignedLongMask(arg);
760         if (ival == (unsigned long)-1 && PyErr_Occurred())
761             RETURN_ERR_OCCURRED;
762         else
763             *p = (unsigned int) ival;
764         break;
765     }
766 
767     case 'n': /* Py_ssize_t */
768     {
769         PyObject *iobj;
770         Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
771         Py_ssize_t ival = -1;
772         iobj = _PyNumber_Index(arg);
773         if (iobj != NULL) {
774             ival = PyLong_AsSsize_t(iobj);
775             Py_DECREF(iobj);
776         }
777         if (ival == -1 && PyErr_Occurred())
778             RETURN_ERR_OCCURRED;
779         *p = ival;
780         break;
781     }
782     case 'l': {/* long int */
783         long *p = va_arg(*p_va, long *);
784         long ival = PyLong_AsLong(arg);
785         if (ival == -1 && PyErr_Occurred())
786             RETURN_ERR_OCCURRED;
787         else
788             *p = ival;
789         break;
790     }
791 
792     case 'k': { /* long sized bitfield */
793         unsigned long *p = va_arg(*p_va, unsigned long *);
794         unsigned long ival;
795         if (PyLong_Check(arg))
796             ival = PyLong_AsUnsignedLongMask(arg);
797         else
798             return converterr("int", arg, msgbuf, bufsize);
799         *p = ival;
800         break;
801     }
802 
803     case 'L': {/* long long */
804         long long *p = va_arg( *p_va, long long * );
805         long long ival = PyLong_AsLongLong(arg);
806         if (ival == (long long)-1 && PyErr_Occurred())
807             RETURN_ERR_OCCURRED;
808         else
809             *p = ival;
810         break;
811     }
812 
813     case 'K': { /* long long sized bitfield */
814         unsigned long long *p = va_arg(*p_va, unsigned long long *);
815         unsigned long long ival;
816         if (PyLong_Check(arg))
817             ival = PyLong_AsUnsignedLongLongMask(arg);
818         else
819             return converterr("int", arg, msgbuf, bufsize);
820         *p = ival;
821         break;
822     }
823 
824     case 'f': {/* float */
825         float *p = va_arg(*p_va, float *);
826         double dval = PyFloat_AsDouble(arg);
827         if (dval == -1.0 && PyErr_Occurred())
828             RETURN_ERR_OCCURRED;
829         else
830             *p = (float) dval;
831         break;
832     }
833 
834     case 'd': {/* double */
835         double *p = va_arg(*p_va, double *);
836         double dval = PyFloat_AsDouble(arg);
837         if (dval == -1.0 && PyErr_Occurred())
838             RETURN_ERR_OCCURRED;
839         else
840             *p = dval;
841         break;
842     }
843 
844     case 'D': {/* complex double */
845         Py_complex *p = va_arg(*p_va, Py_complex *);
846         Py_complex cval;
847         cval = PyComplex_AsCComplex(arg);
848         if (PyErr_Occurred())
849             RETURN_ERR_OCCURRED;
850         else
851             *p = cval;
852         break;
853     }
854 
855     case 'c': {/* char */
856         char *p = va_arg(*p_va, char *);
857         if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
858             *p = PyBytes_AS_STRING(arg)[0];
859         else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1)
860             *p = PyByteArray_AS_STRING(arg)[0];
861         else
862             return converterr("a byte string of length 1", arg, msgbuf, bufsize);
863         break;
864     }
865 
866     case 'C': {/* unicode char */
867         int *p = va_arg(*p_va, int *);
868         int kind;
869         const void *data;
870 
871         if (!PyUnicode_Check(arg))
872             return converterr("a unicode character", arg, msgbuf, bufsize);
873 
874         if (PyUnicode_READY(arg))
875             RETURN_ERR_OCCURRED;
876 
877         if (PyUnicode_GET_LENGTH(arg) != 1)
878             return converterr("a unicode character", arg, msgbuf, bufsize);
879 
880         kind = PyUnicode_KIND(arg);
881         data = PyUnicode_DATA(arg);
882         *p = PyUnicode_READ(kind, data, 0);
883         break;
884     }
885 
886     case 'p': {/* boolean *p*redicate */
887         int *p = va_arg(*p_va, int *);
888         int val = PyObject_IsTrue(arg);
889         if (val > 0)
890             *p = 1;
891         else if (val == 0)
892             *p = 0;
893         else
894             RETURN_ERR_OCCURRED;
895         break;
896     }
897 
898     /* XXX WAAAAH!  's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all
899        need to be cleaned up! */
900 
901     case 'y': {/* any bytes-like object */
902         void **p = (void **)va_arg(*p_va, char **);
903         const char *buf;
904         Py_ssize_t count;
905         if (*format == '*') {
906             if (getbuffer(arg, (Py_buffer*)p, &buf) < 0)
907                 return converterr(buf, arg, msgbuf, bufsize);
908             format++;
909             if (addcleanup(p, freelist, cleanup_buffer)) {
910                 return converterr(
911                     "(cleanup problem)",
912                     arg, msgbuf, bufsize);
913             }
914             break;
915         }
916         count = convertbuffer(arg, (const void **)p, &buf);
917         if (count < 0)
918             return converterr(buf, arg, msgbuf, bufsize);
919         if (*format == '#') {
920             REQUIRE_PY_SSIZE_T_CLEAN;
921             Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
922             *psize = count;
923             format++;
924         } else {
925             if (strlen(*p) != (size_t)count) {
926                 PyErr_SetString(PyExc_ValueError, "embedded null byte");
927                 RETURN_ERR_OCCURRED;
928             }
929         }
930         break;
931     }
932 
933     case 's': /* text string or bytes-like object */
934     case 'z': /* text string, bytes-like object or None */
935     {
936         if (*format == '*') {
937             /* "s*" or "z*" */
938             Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
939 
940             if (c == 'z' && arg == Py_None)
941                 PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
942             else if (PyUnicode_Check(arg)) {
943                 Py_ssize_t len;
944                 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
945                 if (sarg == NULL)
946                     return converterr(CONV_UNICODE,
947                                       arg, msgbuf, bufsize);
948                 PyBuffer_FillInfo(p, arg, (void *)sarg, len, 1, 0);
949             }
950             else { /* any bytes-like object */
951                 const char *buf;
952                 if (getbuffer(arg, p, &buf) < 0)
953                     return converterr(buf, arg, msgbuf, bufsize);
954             }
955             if (addcleanup(p, freelist, cleanup_buffer)) {
956                 return converterr(
957                     "(cleanup problem)",
958                     arg, msgbuf, bufsize);
959             }
960             format++;
961         } else if (*format == '#') { /* a string or read-only bytes-like object */
962             /* "s#" or "z#" */
963             const void **p = (const void **)va_arg(*p_va, const char **);
964             REQUIRE_PY_SSIZE_T_CLEAN;
965             Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
966 
967             if (c == 'z' && arg == Py_None) {
968                 *p = NULL;
969                 *psize = 0;
970             }
971             else if (PyUnicode_Check(arg)) {
972                 Py_ssize_t len;
973                 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
974                 if (sarg == NULL)
975                     return converterr(CONV_UNICODE,
976                                       arg, msgbuf, bufsize);
977                 *p = sarg;
978                 *psize = len;
979             }
980             else { /* read-only bytes-like object */
981                 /* XXX Really? */
982                 const char *buf;
983                 Py_ssize_t count = convertbuffer(arg, p, &buf);
984                 if (count < 0)
985                     return converterr(buf, arg, msgbuf, bufsize);
986                 *psize = count;
987             }
988             format++;
989         } else {
990             /* "s" or "z" */
991             const char **p = va_arg(*p_va, const char **);
992             Py_ssize_t len;
993             sarg = NULL;
994 
995             if (c == 'z' && arg == Py_None)
996                 *p = NULL;
997             else if (PyUnicode_Check(arg)) {
998                 sarg = PyUnicode_AsUTF8AndSize(arg, &len);
999                 if (sarg == NULL)
1000                     return converterr(CONV_UNICODE,
1001                                       arg, msgbuf, bufsize);
1002                 if (strlen(sarg) != (size_t)len) {
1003                     PyErr_SetString(PyExc_ValueError, "embedded null character");
1004                     RETURN_ERR_OCCURRED;
1005                 }
1006                 *p = sarg;
1007             }
1008             else
1009                 return converterr(c == 'z' ? "str or None" : "str",
1010                                   arg, msgbuf, bufsize);
1011         }
1012         break;
1013     }
1014 
1015     case 'u': /* raw unicode buffer (Py_UNICODE *) */
1016     case 'Z': /* raw unicode buffer or None */
1017     {
1018         if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1019                 "getargs: The '%c' format is deprecated. Use 'U' instead.", c)) {
1020             RETURN_ERR_OCCURRED;
1021         }
1022 _Py_COMP_DIAG_PUSH
1023 _Py_COMP_DIAG_IGNORE_DEPR_DECLS
1024         Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
1025 
1026         if (*format == '#') {
1027             /* "u#" or "Z#" */
1028             REQUIRE_PY_SSIZE_T_CLEAN;
1029             Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
1030 
1031             if (c == 'Z' && arg == Py_None) {
1032                 *p = NULL;
1033                 *psize = 0;
1034             }
1035             else if (PyUnicode_Check(arg)) {
1036                 Py_ssize_t len;
1037                 *p = PyUnicode_AsUnicodeAndSize(arg, &len);
1038                 if (*p == NULL)
1039                     RETURN_ERR_OCCURRED;
1040                 *psize = len;
1041             }
1042             else
1043                 return converterr(c == 'Z' ? "str or None" : "str",
1044                                   arg, msgbuf, bufsize);
1045             format++;
1046         } else {
1047             /* "u" or "Z" */
1048             if (c == 'Z' && arg == Py_None)
1049                 *p = NULL;
1050             else if (PyUnicode_Check(arg)) {
1051                 Py_ssize_t len;
1052                 *p = PyUnicode_AsUnicodeAndSize(arg, &len);
1053                 if (*p == NULL)
1054                     RETURN_ERR_OCCURRED;
1055                 if (wcslen(*p) != (size_t)len) {
1056                     PyErr_SetString(PyExc_ValueError, "embedded null character");
1057                     RETURN_ERR_OCCURRED;
1058                 }
1059             } else
1060                 return converterr(c == 'Z' ? "str or None" : "str",
1061                                   arg, msgbuf, bufsize);
1062         }
1063         break;
1064 _Py_COMP_DIAG_POP
1065     }
1066 
1067     case 'e': {/* encoded string */
1068         char **buffer;
1069         const char *encoding;
1070         PyObject *s;
1071         int recode_strings;
1072         Py_ssize_t size;
1073         const char *ptr;
1074 
1075         /* Get 'e' parameter: the encoding name */
1076         encoding = (const char *)va_arg(*p_va, const char *);
1077         if (encoding == NULL)
1078             encoding = PyUnicode_GetDefaultEncoding();
1079 
1080         /* Get output buffer parameter:
1081            's' (recode all objects via Unicode) or
1082            't' (only recode non-string objects)
1083         */
1084         if (*format == 's')
1085             recode_strings = 1;
1086         else if (*format == 't')
1087             recode_strings = 0;
1088         else
1089             return converterr(
1090                 "(unknown parser marker combination)",
1091                 arg, msgbuf, bufsize);
1092         buffer = (char **)va_arg(*p_va, char **);
1093         format++;
1094         if (buffer == NULL)
1095             return converterr("(buffer is NULL)",
1096                               arg, msgbuf, bufsize);
1097 
1098         /* Encode object */
1099         if (!recode_strings &&
1100             (PyBytes_Check(arg) || PyByteArray_Check(arg))) {
1101             s = arg;
1102             Py_INCREF(s);
1103             if (PyBytes_Check(arg)) {
1104                 size = PyBytes_GET_SIZE(s);
1105                 ptr = PyBytes_AS_STRING(s);
1106             }
1107             else {
1108                 size = PyByteArray_GET_SIZE(s);
1109                 ptr = PyByteArray_AS_STRING(s);
1110             }
1111         }
1112         else if (PyUnicode_Check(arg)) {
1113             /* Encode object; use default error handling */
1114             s = PyUnicode_AsEncodedString(arg,
1115                                           encoding,
1116                                           NULL);
1117             if (s == NULL)
1118                 return converterr("(encoding failed)",
1119                                   arg, msgbuf, bufsize);
1120             assert(PyBytes_Check(s));
1121             size = PyBytes_GET_SIZE(s);
1122             ptr = PyBytes_AS_STRING(s);
1123             if (ptr == NULL)
1124                 ptr = "";
1125         }
1126         else {
1127             return converterr(
1128                 recode_strings ? "str" : "str, bytes or bytearray",
1129                 arg, msgbuf, bufsize);
1130         }
1131 
1132         /* Write output; output is guaranteed to be 0-terminated */
1133         if (*format == '#') {
1134             /* Using buffer length parameter '#':
1135 
1136                - if *buffer is NULL, a new buffer of the
1137                needed size is allocated and the data
1138                copied into it; *buffer is updated to point
1139                to the new buffer; the caller is
1140                responsible for PyMem_Free()ing it after
1141                usage
1142 
1143                - if *buffer is not NULL, the data is
1144                copied to *buffer; *buffer_len has to be
1145                set to the size of the buffer on input;
1146                buffer overflow is signalled with an error;
1147                buffer has to provide enough room for the
1148                encoded string plus the trailing 0-byte
1149 
1150                - in both cases, *buffer_len is updated to
1151                the size of the buffer /excluding/ the
1152                trailing 0-byte
1153 
1154             */
1155             REQUIRE_PY_SSIZE_T_CLEAN;
1156             Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
1157 
1158             format++;
1159             if (psize == NULL) {
1160                 Py_DECREF(s);
1161                 return converterr(
1162                     "(buffer_len is NULL)",
1163                     arg, msgbuf, bufsize);
1164             }
1165             if (*buffer == NULL) {
1166                 *buffer = PyMem_NEW(char, size + 1);
1167                 if (*buffer == NULL) {
1168                     Py_DECREF(s);
1169                     PyErr_NoMemory();
1170                     RETURN_ERR_OCCURRED;
1171                 }
1172                 if (addcleanup(buffer, freelist, cleanup_ptr)) {
1173                     Py_DECREF(s);
1174                     return converterr(
1175                         "(cleanup problem)",
1176                         arg, msgbuf, bufsize);
1177                 }
1178             } else {
1179                 if (size + 1 > *psize) {
1180                     Py_DECREF(s);
1181                     PyErr_Format(PyExc_ValueError,
1182                                  "encoded string too long "
1183                                  "(%zd, maximum length %zd)",
1184                                  (Py_ssize_t)size, (Py_ssize_t)(*psize - 1));
1185                     RETURN_ERR_OCCURRED;
1186                 }
1187             }
1188             memcpy(*buffer, ptr, size+1);
1189 
1190             *psize = size;
1191         }
1192         else {
1193             /* Using a 0-terminated buffer:
1194 
1195                - the encoded string has to be 0-terminated
1196                for this variant to work; if it is not, an
1197                error raised
1198 
1199                - a new buffer of the needed size is
1200                allocated and the data copied into it;
1201                *buffer is updated to point to the new
1202                buffer; the caller is responsible for
1203                PyMem_Free()ing it after usage
1204 
1205             */
1206             if ((Py_ssize_t)strlen(ptr) != size) {
1207                 Py_DECREF(s);
1208                 return converterr(
1209                     "encoded string without null bytes",
1210                     arg, msgbuf, bufsize);
1211             }
1212             *buffer = PyMem_NEW(char, size + 1);
1213             if (*buffer == NULL) {
1214                 Py_DECREF(s);
1215                 PyErr_NoMemory();
1216                 RETURN_ERR_OCCURRED;
1217             }
1218             if (addcleanup(buffer, freelist, cleanup_ptr)) {
1219                 Py_DECREF(s);
1220                 return converterr("(cleanup problem)",
1221                                 arg, msgbuf, bufsize);
1222             }
1223             memcpy(*buffer, ptr, size+1);
1224         }
1225         Py_DECREF(s);
1226         break;
1227     }
1228 
1229     case 'S': { /* PyBytes object */
1230         PyObject **p = va_arg(*p_va, PyObject **);
1231         if (PyBytes_Check(arg))
1232             *p = arg;
1233         else
1234             return converterr("bytes", arg, msgbuf, bufsize);
1235         break;
1236     }
1237 
1238     case 'Y': { /* PyByteArray object */
1239         PyObject **p = va_arg(*p_va, PyObject **);
1240         if (PyByteArray_Check(arg))
1241             *p = arg;
1242         else
1243             return converterr("bytearray", arg, msgbuf, bufsize);
1244         break;
1245     }
1246 
1247     case 'U': { /* PyUnicode object */
1248         PyObject **p = va_arg(*p_va, PyObject **);
1249         if (PyUnicode_Check(arg)) {
1250             if (PyUnicode_READY(arg) == -1)
1251                 RETURN_ERR_OCCURRED;
1252             *p = arg;
1253         }
1254         else
1255             return converterr("str", arg, msgbuf, bufsize);
1256         break;
1257     }
1258 
1259     case 'O': { /* object */
1260         PyTypeObject *type;
1261         PyObject **p;
1262         if (*format == '!') {
1263             type = va_arg(*p_va, PyTypeObject*);
1264             p = va_arg(*p_va, PyObject **);
1265             format++;
1266             if (PyType_IsSubtype(Py_TYPE(arg), type))
1267                 *p = arg;
1268             else
1269                 return converterr(type->tp_name, arg, msgbuf, bufsize);
1270 
1271         }
1272         else if (*format == '&') {
1273             typedef int (*converter)(PyObject *, void *);
1274             converter convert = va_arg(*p_va, converter);
1275             void *addr = va_arg(*p_va, void *);
1276             int res;
1277             format++;
1278             if (! (res = (*convert)(arg, addr)))
1279                 return converterr("(unspecified)",
1280                                   arg, msgbuf, bufsize);
1281             if (res == Py_CLEANUP_SUPPORTED &&
1282                 addcleanup(addr, freelist, convert) == -1)
1283                 return converterr("(cleanup problem)",
1284                                 arg, msgbuf, bufsize);
1285         }
1286         else {
1287             p = va_arg(*p_va, PyObject **);
1288             *p = arg;
1289         }
1290         break;
1291     }
1292 
1293 
1294     case 'w': { /* "w*": memory buffer, read-write access */
1295         void **p = va_arg(*p_va, void **);
1296 
1297         if (*format != '*')
1298             return converterr(
1299                 "(invalid use of 'w' format character)",
1300                 arg, msgbuf, bufsize);
1301         format++;
1302 
1303         /* Caller is interested in Py_buffer, and the object
1304            supports it directly. */
1305         if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) {
1306             PyErr_Clear();
1307             return converterr("read-write bytes-like object",
1308                               arg, msgbuf, bufsize);
1309         }
1310         if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) {
1311             PyBuffer_Release((Py_buffer*)p);
1312             return converterr("contiguous buffer", arg, msgbuf, bufsize);
1313         }
1314         if (addcleanup(p, freelist, cleanup_buffer)) {
1315             return converterr(
1316                 "(cleanup problem)",
1317                 arg, msgbuf, bufsize);
1318         }
1319         break;
1320     }
1321 
1322     default:
1323         return converterr("(impossible<bad format char>)", arg, msgbuf, bufsize);
1324 
1325     }
1326 
1327     *p_format = format;
1328     return NULL;
1329 
1330 #undef REQUIRE_PY_SSIZE_T_CLEAN
1331 #undef RETURN_ERR_OCCURRED
1332 }
1333 
1334 static Py_ssize_t
convertbuffer(PyObject * arg,const void ** p,const char ** errmsg)1335 convertbuffer(PyObject *arg, const void **p, const char **errmsg)
1336 {
1337     PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer;
1338     Py_ssize_t count;
1339     Py_buffer view;
1340 
1341     *errmsg = NULL;
1342     *p = NULL;
1343     if (pb != NULL && pb->bf_releasebuffer != NULL) {
1344         *errmsg = "read-only bytes-like object";
1345         return -1;
1346     }
1347 
1348     if (getbuffer(arg, &view, errmsg) < 0)
1349         return -1;
1350     count = view.len;
1351     *p = view.buf;
1352     PyBuffer_Release(&view);
1353     return count;
1354 }
1355 
1356 static int
getbuffer(PyObject * arg,Py_buffer * view,const char ** errmsg)1357 getbuffer(PyObject *arg, Py_buffer *view, const char **errmsg)
1358 {
1359     if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) {
1360         *errmsg = "bytes-like object";
1361         return -1;
1362     }
1363     if (!PyBuffer_IsContiguous(view, 'C')) {
1364         PyBuffer_Release(view);
1365         *errmsg = "contiguous buffer";
1366         return -1;
1367     }
1368     return 0;
1369 }
1370 
1371 /* Support for keyword arguments donated by
1372    Geoff Philbrick <[email protected]> */
1373 
1374 /* Return false (0) for error, else true. */
1375 int
PyArg_ParseTupleAndKeywords(PyObject * args,PyObject * keywords,const char * format,char ** kwlist,...)1376 PyArg_ParseTupleAndKeywords(PyObject *args,
1377                             PyObject *keywords,
1378                             const char *format,
1379                             char **kwlist, ...)
1380 {
1381     int retval;
1382     va_list va;
1383 
1384     if ((args == NULL || !PyTuple_Check(args)) ||
1385         (keywords != NULL && !PyDict_Check(keywords)) ||
1386         format == NULL ||
1387         kwlist == NULL)
1388     {
1389         PyErr_BadInternalCall();
1390         return 0;
1391     }
1392 
1393     va_start(va, kwlist);
1394     retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0);
1395     va_end(va);
1396     return retval;
1397 }
1398 
1399 PyAPI_FUNC(int)
_PyArg_ParseTupleAndKeywords_SizeT(PyObject * args,PyObject * keywords,const char * format,char ** kwlist,...)1400 _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
1401                                   PyObject *keywords,
1402                                   const char *format,
1403                                   char **kwlist, ...)
1404 {
1405     int retval;
1406     va_list va;
1407 
1408     if ((args == NULL || !PyTuple_Check(args)) ||
1409         (keywords != NULL && !PyDict_Check(keywords)) ||
1410         format == NULL ||
1411         kwlist == NULL)
1412     {
1413         PyErr_BadInternalCall();
1414         return 0;
1415     }
1416 
1417     va_start(va, kwlist);
1418     retval = vgetargskeywords(args, keywords, format,
1419                               kwlist, &va, FLAG_SIZE_T);
1420     va_end(va);
1421     return retval;
1422 }
1423 
1424 
1425 int
PyArg_VaParseTupleAndKeywords(PyObject * args,PyObject * keywords,const char * format,char ** kwlist,va_list va)1426 PyArg_VaParseTupleAndKeywords(PyObject *args,
1427                               PyObject *keywords,
1428                               const char *format,
1429                               char **kwlist, va_list va)
1430 {
1431     int retval;
1432     va_list lva;
1433 
1434     if ((args == NULL || !PyTuple_Check(args)) ||
1435         (keywords != NULL && !PyDict_Check(keywords)) ||
1436         format == NULL ||
1437         kwlist == NULL)
1438     {
1439         PyErr_BadInternalCall();
1440         return 0;
1441     }
1442 
1443     va_copy(lva, va);
1444 
1445     retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
1446     va_end(lva);
1447     return retval;
1448 }
1449 
1450 PyAPI_FUNC(int)
_PyArg_VaParseTupleAndKeywords_SizeT(PyObject * args,PyObject * keywords,const char * format,char ** kwlist,va_list va)1451 _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
1452                                     PyObject *keywords,
1453                                     const char *format,
1454                                     char **kwlist, va_list va)
1455 {
1456     int retval;
1457     va_list lva;
1458 
1459     if ((args == NULL || !PyTuple_Check(args)) ||
1460         (keywords != NULL && !PyDict_Check(keywords)) ||
1461         format == NULL ||
1462         kwlist == NULL)
1463     {
1464         PyErr_BadInternalCall();
1465         return 0;
1466     }
1467 
1468     va_copy(lva, va);
1469 
1470     retval = vgetargskeywords(args, keywords, format,
1471                               kwlist, &lva, FLAG_SIZE_T);
1472     va_end(lva);
1473     return retval;
1474 }
1475 
1476 PyAPI_FUNC(int)
_PyArg_ParseTupleAndKeywordsFast(PyObject * args,PyObject * keywords,struct _PyArg_Parser * parser,...)1477 _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
1478                             struct _PyArg_Parser *parser, ...)
1479 {
1480     int retval;
1481     va_list va;
1482 
1483     va_start(va, parser);
1484     retval = vgetargskeywordsfast(args, keywords, parser, &va, 0);
1485     va_end(va);
1486     return retval;
1487 }
1488 
1489 PyAPI_FUNC(int)
_PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject * args,PyObject * keywords,struct _PyArg_Parser * parser,...)1490 _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
1491                             struct _PyArg_Parser *parser, ...)
1492 {
1493     int retval;
1494     va_list va;
1495 
1496     va_start(va, parser);
1497     retval = vgetargskeywordsfast(args, keywords, parser, &va, FLAG_SIZE_T);
1498     va_end(va);
1499     return retval;
1500 }
1501 
1502 PyAPI_FUNC(int)
_PyArg_ParseStackAndKeywords(PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames,struct _PyArg_Parser * parser,...)1503 _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
1504                   struct _PyArg_Parser *parser, ...)
1505 {
1506     int retval;
1507     va_list va;
1508 
1509     va_start(va, parser);
1510     retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0);
1511     va_end(va);
1512     return retval;
1513 }
1514 
1515 PyAPI_FUNC(int)
_PyArg_ParseStackAndKeywords_SizeT(PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames,struct _PyArg_Parser * parser,...)1516 _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
1517                         struct _PyArg_Parser *parser, ...)
1518 {
1519     int retval;
1520     va_list va;
1521 
1522     va_start(va, parser);
1523     retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, FLAG_SIZE_T);
1524     va_end(va);
1525     return retval;
1526 }
1527 
1528 
1529 PyAPI_FUNC(int)
_PyArg_VaParseTupleAndKeywordsFast(PyObject * args,PyObject * keywords,struct _PyArg_Parser * parser,va_list va)1530 _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
1531                             struct _PyArg_Parser *parser, va_list va)
1532 {
1533     int retval;
1534     va_list lva;
1535 
1536     va_copy(lva, va);
1537 
1538     retval = vgetargskeywordsfast(args, keywords, parser, &lva, 0);
1539     va_end(lva);
1540     return retval;
1541 }
1542 
1543 PyAPI_FUNC(int)
_PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject * args,PyObject * keywords,struct _PyArg_Parser * parser,va_list va)1544 _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
1545                             struct _PyArg_Parser *parser, va_list va)
1546 {
1547     int retval;
1548     va_list lva;
1549 
1550     va_copy(lva, va);
1551 
1552     retval = vgetargskeywordsfast(args, keywords, parser, &lva, FLAG_SIZE_T);
1553     va_end(lva);
1554     return retval;
1555 }
1556 
1557 static void
error_unexpected_keyword_arg(PyObject * kwargs,PyObject * kwnames,PyObject * kwtuple,const char * fname)1558 error_unexpected_keyword_arg(PyObject *kwargs, PyObject *kwnames, PyObject *kwtuple, const char *fname)
1559 {
1560     /* make sure there are no extraneous keyword arguments */
1561     Py_ssize_t j = 0;
1562     while (1) {
1563         PyObject *keyword;
1564         if (kwargs != NULL) {
1565             if (!PyDict_Next(kwargs, &j, &keyword, NULL))
1566                 break;
1567         }
1568         else {
1569             if (j >= PyTuple_GET_SIZE(kwnames))
1570                 break;
1571             keyword = PyTuple_GET_ITEM(kwnames, j);
1572             j++;
1573         }
1574         if (!PyUnicode_Check(keyword)) {
1575             PyErr_SetString(PyExc_TypeError,
1576                             "keywords must be strings");
1577             return;
1578         }
1579 
1580         int match = PySequence_Contains(kwtuple, keyword);
1581         if (match <= 0) {
1582             if (!match) {
1583                 PyErr_Format(PyExc_TypeError,
1584                              "'%S' is an invalid keyword "
1585                              "argument for %.200s%s",
1586                              keyword,
1587                              (fname == NULL) ? "this function" : fname,
1588                              (fname == NULL) ? "" : "()");
1589             }
1590             return;
1591         }
1592     }
1593     /* Something wrong happened. There are extraneous keyword arguments,
1594      * but we don't know what. And we don't bother. */
1595     PyErr_Format(PyExc_TypeError,
1596                  "invalid keyword argument for %.200s%s",
1597                  (fname == NULL) ? "this function" : fname,
1598                  (fname == NULL) ? "" : "()");
1599 }
1600 
1601 int
PyArg_ValidateKeywordArguments(PyObject * kwargs)1602 PyArg_ValidateKeywordArguments(PyObject *kwargs)
1603 {
1604     if (!PyDict_Check(kwargs)) {
1605         PyErr_BadInternalCall();
1606         return 0;
1607     }
1608     if (!_PyDict_HasOnlyStringKeys(kwargs)) {
1609         PyErr_SetString(PyExc_TypeError,
1610                         "keywords must be strings");
1611         return 0;
1612     }
1613     return 1;
1614 }
1615 
1616 #define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':')
1617 
1618 static int
vgetargskeywords(PyObject * args,PyObject * kwargs,const char * format,char ** kwlist,va_list * p_va,int flags)1619 vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format,
1620                  char **kwlist, va_list *p_va, int flags)
1621 {
1622     char msgbuf[512];
1623     int levels[32];
1624     const char *fname, *msg, *custom_msg;
1625     int min = INT_MAX;
1626     int max = INT_MAX;
1627     int i, pos, len;
1628     int skip = 0;
1629     Py_ssize_t nargs, nkwargs;
1630     PyObject *current_arg;
1631     freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
1632     freelist_t freelist;
1633 
1634     freelist.entries = static_entries;
1635     freelist.first_available = 0;
1636     freelist.entries_malloced = 0;
1637 
1638     assert(args != NULL && PyTuple_Check(args));
1639     assert(kwargs == NULL || PyDict_Check(kwargs));
1640     assert(format != NULL);
1641     assert(kwlist != NULL);
1642     assert(p_va != NULL);
1643 
1644     /* grab the function name or custom error msg first (mutually exclusive) */
1645     fname = strchr(format, ':');
1646     if (fname) {
1647         fname++;
1648         custom_msg = NULL;
1649     }
1650     else {
1651         custom_msg = strchr(format,';');
1652         if (custom_msg)
1653             custom_msg++;
1654     }
1655 
1656     /* scan kwlist and count the number of positional-only parameters */
1657     for (pos = 0; kwlist[pos] && !*kwlist[pos]; pos++) {
1658     }
1659     /* scan kwlist and get greatest possible nbr of args */
1660     for (len = pos; kwlist[len]; len++) {
1661         if (!*kwlist[len]) {
1662             PyErr_SetString(PyExc_SystemError,
1663                             "Empty keyword parameter name");
1664             return cleanreturn(0, &freelist);
1665         }
1666     }
1667 
1668     if (len > STATIC_FREELIST_ENTRIES) {
1669         freelist.entries = PyMem_NEW(freelistentry_t, len);
1670         if (freelist.entries == NULL) {
1671             PyErr_NoMemory();
1672             return 0;
1673         }
1674         freelist.entries_malloced = 1;
1675     }
1676 
1677     nargs = PyTuple_GET_SIZE(args);
1678     nkwargs = (kwargs == NULL) ? 0 : PyDict_GET_SIZE(kwargs);
1679     if (nargs + nkwargs > len) {
1680         /* Adding "keyword" (when nargs == 0) prevents producing wrong error
1681            messages in some special cases (see bpo-31229). */
1682         PyErr_Format(PyExc_TypeError,
1683                      "%.200s%s takes at most %d %sargument%s (%zd given)",
1684                      (fname == NULL) ? "function" : fname,
1685                      (fname == NULL) ? "" : "()",
1686                      len,
1687                      (nargs == 0) ? "keyword " : "",
1688                      (len == 1) ? "" : "s",
1689                      nargs + nkwargs);
1690         return cleanreturn(0, &freelist);
1691     }
1692 
1693     /* convert tuple args and keyword args in same loop, using kwlist to drive process */
1694     for (i = 0; i < len; i++) {
1695         if (*format == '|') {
1696             if (min != INT_MAX) {
1697                 PyErr_SetString(PyExc_SystemError,
1698                                 "Invalid format string (| specified twice)");
1699                 return cleanreturn(0, &freelist);
1700             }
1701 
1702             min = i;
1703             format++;
1704 
1705             if (max != INT_MAX) {
1706                 PyErr_SetString(PyExc_SystemError,
1707                                 "Invalid format string ($ before |)");
1708                 return cleanreturn(0, &freelist);
1709             }
1710         }
1711         if (*format == '$') {
1712             if (max != INT_MAX) {
1713                 PyErr_SetString(PyExc_SystemError,
1714                                 "Invalid format string ($ specified twice)");
1715                 return cleanreturn(0, &freelist);
1716             }
1717 
1718             max = i;
1719             format++;
1720 
1721             if (max < pos) {
1722                 PyErr_SetString(PyExc_SystemError,
1723                                 "Empty parameter name after $");
1724                 return cleanreturn(0, &freelist);
1725             }
1726             if (skip) {
1727                 /* Now we know the minimal and the maximal numbers of
1728                  * positional arguments and can raise an exception with
1729                  * informative message (see below). */
1730                 break;
1731             }
1732             if (max < nargs) {
1733                 if (max == 0) {
1734                     PyErr_Format(PyExc_TypeError,
1735                                  "%.200s%s takes no positional arguments",
1736                                  (fname == NULL) ? "function" : fname,
1737                                  (fname == NULL) ? "" : "()");
1738                 }
1739                 else {
1740                     PyErr_Format(PyExc_TypeError,
1741                                  "%.200s%s takes %s %d positional argument%s"
1742                                  " (%zd given)",
1743                                  (fname == NULL) ? "function" : fname,
1744                                  (fname == NULL) ? "" : "()",
1745                                  (min != INT_MAX) ? "at most" : "exactly",
1746                                  max,
1747                                  max == 1 ? "" : "s",
1748                                  nargs);
1749                 }
1750                 return cleanreturn(0, &freelist);
1751             }
1752         }
1753         if (IS_END_OF_FORMAT(*format)) {
1754             PyErr_Format(PyExc_SystemError,
1755                          "More keyword list entries (%d) than "
1756                          "format specifiers (%d)", len, i);
1757             return cleanreturn(0, &freelist);
1758         }
1759         if (!skip) {
1760             if (i < nargs) {
1761                 current_arg = PyTuple_GET_ITEM(args, i);
1762             }
1763             else if (nkwargs && i >= pos) {
1764                 current_arg = _PyDict_GetItemStringWithError(kwargs, kwlist[i]);
1765                 if (current_arg) {
1766                     --nkwargs;
1767                 }
1768                 else if (PyErr_Occurred()) {
1769                     return cleanreturn(0, &freelist);
1770                 }
1771             }
1772             else {
1773                 current_arg = NULL;
1774             }
1775 
1776             if (current_arg) {
1777                 msg = convertitem(current_arg, &format, p_va, flags,
1778                     levels, msgbuf, sizeof(msgbuf), &freelist);
1779                 if (msg) {
1780                     seterror(i+1, msg, levels, fname, custom_msg);
1781                     return cleanreturn(0, &freelist);
1782                 }
1783                 continue;
1784             }
1785 
1786             if (i < min) {
1787                 if (i < pos) {
1788                     assert (min == INT_MAX);
1789                     assert (max == INT_MAX);
1790                     skip = 1;
1791                     /* At that moment we still don't know the minimal and
1792                      * the maximal numbers of positional arguments.  Raising
1793                      * an exception is deferred until we encounter | and $
1794                      * or the end of the format. */
1795                 }
1796                 else {
1797                     PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
1798                                  "argument '%s' (pos %d)",
1799                                  (fname == NULL) ? "function" : fname,
1800                                  (fname == NULL) ? "" : "()",
1801                                  kwlist[i], i+1);
1802                     return cleanreturn(0, &freelist);
1803                 }
1804             }
1805             /* current code reports success when all required args
1806              * fulfilled and no keyword args left, with no further
1807              * validation. XXX Maybe skip this in debug build ?
1808              */
1809             if (!nkwargs && !skip) {
1810                 return cleanreturn(1, &freelist);
1811             }
1812         }
1813 
1814         /* We are into optional args, skip through to any remaining
1815          * keyword args */
1816         msg = skipitem(&format, p_va, flags);
1817         if (msg) {
1818             PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
1819                          format);
1820             return cleanreturn(0, &freelist);
1821         }
1822     }
1823 
1824     if (skip) {
1825         PyErr_Format(PyExc_TypeError,
1826                      "%.200s%s takes %s %d positional argument%s"
1827                      " (%zd given)",
1828                      (fname == NULL) ? "function" : fname,
1829                      (fname == NULL) ? "" : "()",
1830                      (Py_MIN(pos, min) < i) ? "at least" : "exactly",
1831                      Py_MIN(pos, min),
1832                      Py_MIN(pos, min) == 1 ? "" : "s",
1833                      nargs);
1834         return cleanreturn(0, &freelist);
1835     }
1836 
1837     if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
1838         PyErr_Format(PyExc_SystemError,
1839             "more argument specifiers than keyword list entries "
1840             "(remaining format:'%s')", format);
1841         return cleanreturn(0, &freelist);
1842     }
1843 
1844     if (nkwargs > 0) {
1845         PyObject *key;
1846         Py_ssize_t j;
1847         /* make sure there are no arguments given by name and position */
1848         for (i = pos; i < nargs; i++) {
1849             current_arg = _PyDict_GetItemStringWithError(kwargs, kwlist[i]);
1850             if (current_arg) {
1851                 /* arg present in tuple and in dict */
1852                 PyErr_Format(PyExc_TypeError,
1853                              "argument for %.200s%s given by name ('%s') "
1854                              "and position (%d)",
1855                              (fname == NULL) ? "function" : fname,
1856                              (fname == NULL) ? "" : "()",
1857                              kwlist[i], i+1);
1858                 return cleanreturn(0, &freelist);
1859             }
1860             else if (PyErr_Occurred()) {
1861                 return cleanreturn(0, &freelist);
1862             }
1863         }
1864         /* make sure there are no extraneous keyword arguments */
1865         j = 0;
1866         while (PyDict_Next(kwargs, &j, &key, NULL)) {
1867             int match = 0;
1868             if (!PyUnicode_Check(key)) {
1869                 PyErr_SetString(PyExc_TypeError,
1870                                 "keywords must be strings");
1871                 return cleanreturn(0, &freelist);
1872             }
1873             for (i = pos; i < len; i++) {
1874                 if (_PyUnicode_EqualToASCIIString(key, kwlist[i])) {
1875                     match = 1;
1876                     break;
1877                 }
1878             }
1879             if (!match) {
1880                 PyErr_Format(PyExc_TypeError,
1881                              "'%U' is an invalid keyword "
1882                              "argument for %.200s%s",
1883                              key,
1884                              (fname == NULL) ? "this function" : fname,
1885                              (fname == NULL) ? "" : "()");
1886                 return cleanreturn(0, &freelist);
1887             }
1888         }
1889         /* Something wrong happened. There are extraneous keyword arguments,
1890          * but we don't know what. And we don't bother. */
1891         PyErr_Format(PyExc_TypeError,
1892                      "invalid keyword argument for %.200s%s",
1893                      (fname == NULL) ? "this function" : fname,
1894                      (fname == NULL) ? "" : "()");
1895         return cleanreturn(0, &freelist);
1896     }
1897 
1898     return cleanreturn(1, &freelist);
1899 }
1900 
1901 
1902 /* List of static parsers. */
1903 static struct _PyArg_Parser *static_arg_parsers = NULL;
1904 
1905 static int
parser_init(struct _PyArg_Parser * parser)1906 parser_init(struct _PyArg_Parser *parser)
1907 {
1908     const char * const *keywords;
1909     const char *format, *msg;
1910     int i, len, min, max, nkw;
1911     PyObject *kwtuple;
1912 
1913     assert(parser->keywords != NULL);
1914     if (parser->kwtuple != NULL) {
1915         return 1;
1916     }
1917 
1918     keywords = parser->keywords;
1919     /* scan keywords and count the number of positional-only parameters */
1920     for (i = 0; keywords[i] && !*keywords[i]; i++) {
1921     }
1922     parser->pos = i;
1923     /* scan keywords and get greatest possible nbr of args */
1924     for (; keywords[i]; i++) {
1925         if (!*keywords[i]) {
1926             PyErr_SetString(PyExc_SystemError,
1927                             "Empty keyword parameter name");
1928             return 0;
1929         }
1930     }
1931     len = i;
1932 
1933     format = parser->format;
1934     if (format) {
1935         /* grab the function name or custom error msg first (mutually exclusive) */
1936         parser->fname = strchr(parser->format, ':');
1937         if (parser->fname) {
1938             parser->fname++;
1939             parser->custom_msg = NULL;
1940         }
1941         else {
1942             parser->custom_msg = strchr(parser->format,';');
1943             if (parser->custom_msg)
1944                 parser->custom_msg++;
1945         }
1946 
1947         min = max = INT_MAX;
1948         for (i = 0; i < len; i++) {
1949             if (*format == '|') {
1950                 if (min != INT_MAX) {
1951                     PyErr_SetString(PyExc_SystemError,
1952                                     "Invalid format string (| specified twice)");
1953                     return 0;
1954                 }
1955                 if (max != INT_MAX) {
1956                     PyErr_SetString(PyExc_SystemError,
1957                                     "Invalid format string ($ before |)");
1958                     return 0;
1959                 }
1960                 min = i;
1961                 format++;
1962             }
1963             if (*format == '$') {
1964                 if (max != INT_MAX) {
1965                     PyErr_SetString(PyExc_SystemError,
1966                                     "Invalid format string ($ specified twice)");
1967                     return 0;
1968                 }
1969                 if (i < parser->pos) {
1970                     PyErr_SetString(PyExc_SystemError,
1971                                     "Empty parameter name after $");
1972                     return 0;
1973                 }
1974                 max = i;
1975                 format++;
1976             }
1977             if (IS_END_OF_FORMAT(*format)) {
1978                 PyErr_Format(PyExc_SystemError,
1979                             "More keyword list entries (%d) than "
1980                             "format specifiers (%d)", len, i);
1981                 return 0;
1982             }
1983 
1984             msg = skipitem(&format, NULL, 0);
1985             if (msg) {
1986                 PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
1987                             format);
1988                 return 0;
1989             }
1990         }
1991         parser->min = Py_MIN(min, len);
1992         parser->max = Py_MIN(max, len);
1993 
1994         if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
1995             PyErr_Format(PyExc_SystemError,
1996                 "more argument specifiers than keyword list entries "
1997                 "(remaining format:'%s')", format);
1998             return 0;
1999         }
2000     }
2001 
2002     nkw = len - parser->pos;
2003     kwtuple = PyTuple_New(nkw);
2004     if (kwtuple == NULL) {
2005         return 0;
2006     }
2007     keywords = parser->keywords + parser->pos;
2008     for (i = 0; i < nkw; i++) {
2009         PyObject *str = PyUnicode_FromString(keywords[i]);
2010         if (str == NULL) {
2011             Py_DECREF(kwtuple);
2012             return 0;
2013         }
2014         PyUnicode_InternInPlace(&str);
2015         PyTuple_SET_ITEM(kwtuple, i, str);
2016     }
2017     parser->kwtuple = kwtuple;
2018 
2019     assert(parser->next == NULL);
2020     parser->next = static_arg_parsers;
2021     static_arg_parsers = parser;
2022     return 1;
2023 }
2024 
2025 static void
parser_clear(struct _PyArg_Parser * parser)2026 parser_clear(struct _PyArg_Parser *parser)
2027 {
2028     Py_CLEAR(parser->kwtuple);
2029 }
2030 
2031 static PyObject*
find_keyword(PyObject * kwnames,PyObject * const * kwstack,PyObject * key)2032 find_keyword(PyObject *kwnames, PyObject *const *kwstack, PyObject *key)
2033 {
2034     Py_ssize_t i, nkwargs;
2035 
2036     nkwargs = PyTuple_GET_SIZE(kwnames);
2037     for (i = 0; i < nkwargs; i++) {
2038         PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);
2039 
2040         /* kwname == key will normally find a match in since keyword keys
2041            should be interned strings; if not retry below in a new loop. */
2042         if (kwname == key) {
2043             return kwstack[i];
2044         }
2045     }
2046 
2047     for (i = 0; i < nkwargs; i++) {
2048         PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);
2049         assert(PyUnicode_Check(kwname));
2050         if (_PyUnicode_EQ(kwname, key)) {
2051             return kwstack[i];
2052         }
2053     }
2054     return NULL;
2055 }
2056 
2057 static int
vgetargskeywordsfast_impl(PyObject * const * args,Py_ssize_t nargs,PyObject * kwargs,PyObject * kwnames,struct _PyArg_Parser * parser,va_list * p_va,int flags)2058 vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
2059                           PyObject *kwargs, PyObject *kwnames,
2060                           struct _PyArg_Parser *parser,
2061                           va_list *p_va, int flags)
2062 {
2063     PyObject *kwtuple;
2064     char msgbuf[512];
2065     int levels[32];
2066     const char *format;
2067     const char *msg;
2068     PyObject *keyword;
2069     int i, pos, len;
2070     Py_ssize_t nkwargs;
2071     PyObject *current_arg;
2072     freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
2073     freelist_t freelist;
2074     PyObject *const *kwstack = NULL;
2075 
2076     freelist.entries = static_entries;
2077     freelist.first_available = 0;
2078     freelist.entries_malloced = 0;
2079 
2080     assert(kwargs == NULL || PyDict_Check(kwargs));
2081     assert(kwargs == NULL || kwnames == NULL);
2082     assert(p_va != NULL);
2083 
2084     if (parser == NULL) {
2085         PyErr_BadInternalCall();
2086         return 0;
2087     }
2088 
2089     if (kwnames != NULL && !PyTuple_Check(kwnames)) {
2090         PyErr_BadInternalCall();
2091         return 0;
2092     }
2093 
2094     if (!parser_init(parser)) {
2095         return 0;
2096     }
2097 
2098     kwtuple = parser->kwtuple;
2099     pos = parser->pos;
2100     len = pos + (int)PyTuple_GET_SIZE(kwtuple);
2101 
2102     if (len > STATIC_FREELIST_ENTRIES) {
2103         freelist.entries = PyMem_NEW(freelistentry_t, len);
2104         if (freelist.entries == NULL) {
2105             PyErr_NoMemory();
2106             return 0;
2107         }
2108         freelist.entries_malloced = 1;
2109     }
2110 
2111     if (kwargs != NULL) {
2112         nkwargs = PyDict_GET_SIZE(kwargs);
2113     }
2114     else if (kwnames != NULL) {
2115         nkwargs = PyTuple_GET_SIZE(kwnames);
2116         kwstack = args + nargs;
2117     }
2118     else {
2119         nkwargs = 0;
2120     }
2121     if (nargs + nkwargs > len) {
2122         /* Adding "keyword" (when nargs == 0) prevents producing wrong error
2123            messages in some special cases (see bpo-31229). */
2124         PyErr_Format(PyExc_TypeError,
2125                      "%.200s%s takes at most %d %sargument%s (%zd given)",
2126                      (parser->fname == NULL) ? "function" : parser->fname,
2127                      (parser->fname == NULL) ? "" : "()",
2128                      len,
2129                      (nargs == 0) ? "keyword " : "",
2130                      (len == 1) ? "" : "s",
2131                      nargs + nkwargs);
2132         return cleanreturn(0, &freelist);
2133     }
2134     if (parser->max < nargs) {
2135         if (parser->max == 0) {
2136             PyErr_Format(PyExc_TypeError,
2137                          "%.200s%s takes no positional arguments",
2138                          (parser->fname == NULL) ? "function" : parser->fname,
2139                          (parser->fname == NULL) ? "" : "()");
2140         }
2141         else {
2142             PyErr_Format(PyExc_TypeError,
2143                          "%.200s%s takes %s %d positional argument%s (%zd given)",
2144                          (parser->fname == NULL) ? "function" : parser->fname,
2145                          (parser->fname == NULL) ? "" : "()",
2146                          (parser->min < parser->max) ? "at most" : "exactly",
2147                          parser->max,
2148                          parser->max == 1 ? "" : "s",
2149                          nargs);
2150         }
2151         return cleanreturn(0, &freelist);
2152     }
2153 
2154     format = parser->format;
2155     /* convert tuple args and keyword args in same loop, using kwtuple to drive process */
2156     for (i = 0; i < len; i++) {
2157         if (*format == '|') {
2158             format++;
2159         }
2160         if (*format == '$') {
2161             format++;
2162         }
2163         assert(!IS_END_OF_FORMAT(*format));
2164 
2165         if (i < nargs) {
2166             current_arg = args[i];
2167         }
2168         else if (nkwargs && i >= pos) {
2169             keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
2170             if (kwargs != NULL) {
2171                 current_arg = PyDict_GetItemWithError(kwargs, keyword);
2172                 if (!current_arg && PyErr_Occurred()) {
2173                     return cleanreturn(0, &freelist);
2174                 }
2175             }
2176             else {
2177                 current_arg = find_keyword(kwnames, kwstack, keyword);
2178             }
2179             if (current_arg) {
2180                 --nkwargs;
2181             }
2182         }
2183         else {
2184             current_arg = NULL;
2185         }
2186 
2187         if (current_arg) {
2188             msg = convertitem(current_arg, &format, p_va, flags,
2189                 levels, msgbuf, sizeof(msgbuf), &freelist);
2190             if (msg) {
2191                 seterror(i+1, msg, levels, parser->fname, parser->custom_msg);
2192                 return cleanreturn(0, &freelist);
2193             }
2194             continue;
2195         }
2196 
2197         if (i < parser->min) {
2198             /* Less arguments than required */
2199             if (i < pos) {
2200                 Py_ssize_t min = Py_MIN(pos, parser->min);
2201                 PyErr_Format(PyExc_TypeError,
2202                              "%.200s%s takes %s %d positional argument%s"
2203                              " (%zd given)",
2204                              (parser->fname == NULL) ? "function" : parser->fname,
2205                              (parser->fname == NULL) ? "" : "()",
2206                              min < parser->max ? "at least" : "exactly",
2207                              min,
2208                              min == 1 ? "" : "s",
2209                              nargs);
2210             }
2211             else {
2212                 keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
2213                 PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
2214                              "argument '%U' (pos %d)",
2215                              (parser->fname == NULL) ? "function" : parser->fname,
2216                              (parser->fname == NULL) ? "" : "()",
2217                              keyword, i+1);
2218             }
2219             return cleanreturn(0, &freelist);
2220         }
2221         /* current code reports success when all required args
2222          * fulfilled and no keyword args left, with no further
2223          * validation. XXX Maybe skip this in debug build ?
2224          */
2225         if (!nkwargs) {
2226             return cleanreturn(1, &freelist);
2227         }
2228 
2229         /* We are into optional args, skip through to any remaining
2230          * keyword args */
2231         msg = skipitem(&format, p_va, flags);
2232         assert(msg == NULL);
2233     }
2234 
2235     assert(IS_END_OF_FORMAT(*format) || (*format == '|') || (*format == '$'));
2236 
2237     if (nkwargs > 0) {
2238         /* make sure there are no arguments given by name and position */
2239         for (i = pos; i < nargs; i++) {
2240             keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
2241             if (kwargs != NULL) {
2242                 current_arg = PyDict_GetItemWithError(kwargs, keyword);
2243                 if (!current_arg && PyErr_Occurred()) {
2244                     return cleanreturn(0, &freelist);
2245                 }
2246             }
2247             else {
2248                 current_arg = find_keyword(kwnames, kwstack, keyword);
2249             }
2250             if (current_arg) {
2251                 /* arg present in tuple and in dict */
2252                 PyErr_Format(PyExc_TypeError,
2253                              "argument for %.200s%s given by name ('%U') "
2254                              "and position (%d)",
2255                              (parser->fname == NULL) ? "function" : parser->fname,
2256                              (parser->fname == NULL) ? "" : "()",
2257                              keyword, i+1);
2258                 return cleanreturn(0, &freelist);
2259             }
2260         }
2261 
2262         error_unexpected_keyword_arg(kwargs, kwnames, kwtuple, parser->fname);
2263         return cleanreturn(0, &freelist);
2264     }
2265 
2266     return cleanreturn(1, &freelist);
2267 }
2268 
2269 static int
vgetargskeywordsfast(PyObject * args,PyObject * keywords,struct _PyArg_Parser * parser,va_list * p_va,int flags)2270 vgetargskeywordsfast(PyObject *args, PyObject *keywords,
2271                      struct _PyArg_Parser *parser, va_list *p_va, int flags)
2272 {
2273     PyObject **stack;
2274     Py_ssize_t nargs;
2275 
2276     if (args == NULL
2277         || !PyTuple_Check(args)
2278         || (keywords != NULL && !PyDict_Check(keywords)))
2279     {
2280         PyErr_BadInternalCall();
2281         return 0;
2282     }
2283 
2284     stack = _PyTuple_ITEMS(args);
2285     nargs = PyTuple_GET_SIZE(args);
2286     return vgetargskeywordsfast_impl(stack, nargs, keywords, NULL,
2287                                      parser, p_va, flags);
2288 }
2289 
2290 
2291 #undef _PyArg_UnpackKeywords
2292 
2293 PyObject * const *
_PyArg_UnpackKeywords(PyObject * const * args,Py_ssize_t nargs,PyObject * kwargs,PyObject * kwnames,struct _PyArg_Parser * parser,int minpos,int maxpos,int minkw,PyObject ** buf)2294 _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs,
2295                       PyObject *kwargs, PyObject *kwnames,
2296                       struct _PyArg_Parser *parser,
2297                       int minpos, int maxpos, int minkw,
2298                       PyObject **buf)
2299 {
2300     PyObject *kwtuple;
2301     PyObject *keyword;
2302     int i, posonly, minposonly, maxargs;
2303     int reqlimit = minkw ? maxpos + minkw : minpos;
2304     Py_ssize_t nkwargs;
2305     PyObject *current_arg;
2306     PyObject * const *kwstack = NULL;
2307 
2308     assert(kwargs == NULL || PyDict_Check(kwargs));
2309     assert(kwargs == NULL || kwnames == NULL);
2310 
2311     if (parser == NULL) {
2312         PyErr_BadInternalCall();
2313         return NULL;
2314     }
2315 
2316     if (kwnames != NULL && !PyTuple_Check(kwnames)) {
2317         PyErr_BadInternalCall();
2318         return NULL;
2319     }
2320 
2321     if (args == NULL && nargs == 0) {
2322         args = buf;
2323     }
2324 
2325     if (!parser_init(parser)) {
2326         return NULL;
2327     }
2328 
2329     kwtuple = parser->kwtuple;
2330     posonly = parser->pos;
2331     minposonly = Py_MIN(posonly, minpos);
2332     maxargs = posonly + (int)PyTuple_GET_SIZE(kwtuple);
2333 
2334     if (kwargs != NULL) {
2335         nkwargs = PyDict_GET_SIZE(kwargs);
2336     }
2337     else if (kwnames != NULL) {
2338         nkwargs = PyTuple_GET_SIZE(kwnames);
2339         kwstack = args + nargs;
2340     }
2341     else {
2342         nkwargs = 0;
2343     }
2344     if (nkwargs == 0 && minkw == 0 && minpos <= nargs && nargs <= maxpos) {
2345         /* Fast path. */
2346         return args;
2347     }
2348     if (nargs + nkwargs > maxargs) {
2349         /* Adding "keyword" (when nargs == 0) prevents producing wrong error
2350            messages in some special cases (see bpo-31229). */
2351         PyErr_Format(PyExc_TypeError,
2352                      "%.200s%s takes at most %d %sargument%s (%zd given)",
2353                      (parser->fname == NULL) ? "function" : parser->fname,
2354                      (parser->fname == NULL) ? "" : "()",
2355                      maxargs,
2356                      (nargs == 0) ? "keyword " : "",
2357                      (maxargs == 1) ? "" : "s",
2358                      nargs + nkwargs);
2359         return NULL;
2360     }
2361     if (nargs > maxpos) {
2362         if (maxpos == 0) {
2363             PyErr_Format(PyExc_TypeError,
2364                          "%.200s%s takes no positional arguments",
2365                          (parser->fname == NULL) ? "function" : parser->fname,
2366                          (parser->fname == NULL) ? "" : "()");
2367         }
2368         else {
2369             PyErr_Format(PyExc_TypeError,
2370                          "%.200s%s takes %s %d positional argument%s (%zd given)",
2371                          (parser->fname == NULL) ? "function" : parser->fname,
2372                          (parser->fname == NULL) ? "" : "()",
2373                          (minpos < maxpos) ? "at most" : "exactly",
2374                          maxpos,
2375                          (maxpos == 1) ? "" : "s",
2376                          nargs);
2377         }
2378         return NULL;
2379     }
2380     if (nargs < minposonly) {
2381         PyErr_Format(PyExc_TypeError,
2382                      "%.200s%s takes %s %d positional argument%s"
2383                      " (%zd given)",
2384                      (parser->fname == NULL) ? "function" : parser->fname,
2385                      (parser->fname == NULL) ? "" : "()",
2386                      minposonly < maxpos ? "at least" : "exactly",
2387                      minposonly,
2388                      minposonly == 1 ? "" : "s",
2389                      nargs);
2390         return NULL;
2391     }
2392 
2393     /* copy tuple args */
2394     for (i = 0; i < nargs; i++) {
2395         buf[i] = args[i];
2396     }
2397 
2398     /* copy keyword args using kwtuple to drive process */
2399     for (i = Py_MAX((int)nargs, posonly); i < maxargs; i++) {
2400         if (nkwargs) {
2401             keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2402             if (kwargs != NULL) {
2403                 current_arg = PyDict_GetItemWithError(kwargs, keyword);
2404                 if (!current_arg && PyErr_Occurred()) {
2405                     return NULL;
2406                 }
2407             }
2408             else {
2409                 current_arg = find_keyword(kwnames, kwstack, keyword);
2410             }
2411         }
2412         else if (i >= reqlimit) {
2413             break;
2414         }
2415         else {
2416             current_arg = NULL;
2417         }
2418 
2419         buf[i] = current_arg;
2420 
2421         if (current_arg) {
2422             --nkwargs;
2423         }
2424         else if (i < minpos || (maxpos <= i && i < reqlimit)) {
2425             /* Less arguments than required */
2426             keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2427             PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
2428                          "argument '%U' (pos %d)",
2429                          (parser->fname == NULL) ? "function" : parser->fname,
2430                          (parser->fname == NULL) ? "" : "()",
2431                          keyword, i+1);
2432             return NULL;
2433         }
2434     }
2435 
2436     if (nkwargs > 0) {
2437         /* make sure there are no arguments given by name and position */
2438         for (i = posonly; i < nargs; i++) {
2439             keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2440             if (kwargs != NULL) {
2441                 current_arg = PyDict_GetItemWithError(kwargs, keyword);
2442                 if (!current_arg && PyErr_Occurred()) {
2443                     return NULL;
2444                 }
2445             }
2446             else {
2447                 current_arg = find_keyword(kwnames, kwstack, keyword);
2448             }
2449             if (current_arg) {
2450                 /* arg present in tuple and in dict */
2451                 PyErr_Format(PyExc_TypeError,
2452                              "argument for %.200s%s given by name ('%U') "
2453                              "and position (%d)",
2454                              (parser->fname == NULL) ? "function" : parser->fname,
2455                              (parser->fname == NULL) ? "" : "()",
2456                              keyword, i+1);
2457                 return NULL;
2458             }
2459         }
2460 
2461         error_unexpected_keyword_arg(kwargs, kwnames, kwtuple, parser->fname);
2462         return NULL;
2463     }
2464 
2465     return buf;
2466 }
2467 
2468 PyObject * const *
_PyArg_UnpackKeywordsWithVararg(PyObject * const * args,Py_ssize_t nargs,PyObject * kwargs,PyObject * kwnames,struct _PyArg_Parser * parser,int minpos,int maxpos,int minkw,int vararg,PyObject ** buf)2469 _PyArg_UnpackKeywordsWithVararg(PyObject *const *args, Py_ssize_t nargs,
2470                                 PyObject *kwargs, PyObject *kwnames,
2471                                 struct _PyArg_Parser *parser,
2472                                 int minpos, int maxpos, int minkw,
2473                                 int vararg, PyObject **buf)
2474 {
2475     PyObject *kwtuple;
2476     PyObject *keyword;
2477     Py_ssize_t varargssize = 0;
2478     int i, posonly, minposonly, maxargs;
2479     int reqlimit = minkw ? maxpos + minkw : minpos;
2480     Py_ssize_t nkwargs;
2481     PyObject *current_arg;
2482     PyObject * const *kwstack = NULL;
2483 
2484     assert(kwargs == NULL || PyDict_Check(kwargs));
2485     assert(kwargs == NULL || kwnames == NULL);
2486 
2487     if (parser == NULL) {
2488         PyErr_BadInternalCall();
2489         return NULL;
2490     }
2491 
2492     if (kwnames != NULL && !PyTuple_Check(kwnames)) {
2493         PyErr_BadInternalCall();
2494         return NULL;
2495     }
2496 
2497     if (args == NULL && nargs == 0) {
2498         args = buf;
2499     }
2500 
2501     if (!parser_init(parser)) {
2502         return NULL;
2503     }
2504 
2505     kwtuple = parser->kwtuple;
2506     posonly = parser->pos;
2507     minposonly = Py_MIN(posonly, minpos);
2508     maxargs = posonly + (int)PyTuple_GET_SIZE(kwtuple);
2509     if (kwargs != NULL) {
2510         nkwargs = PyDict_GET_SIZE(kwargs);
2511     }
2512     else if (kwnames != NULL) {
2513         nkwargs = PyTuple_GET_SIZE(kwnames);
2514         kwstack = args + nargs;
2515     }
2516     else {
2517         nkwargs = 0;
2518     }
2519     if (nargs < minposonly) {
2520         PyErr_Format(PyExc_TypeError,
2521                      "%.200s%s takes %s %d positional argument%s"
2522                      " (%zd given)",
2523                      (parser->fname == NULL) ? "function" : parser->fname,
2524                      (parser->fname == NULL) ? "" : "()",
2525                      minposonly < maxpos ? "at least" : "exactly",
2526                      minposonly,
2527                      minposonly == 1 ? "" : "s",
2528                      nargs);
2529         return NULL;
2530     }
2531 
2532     /* create varargs tuple */
2533     varargssize = nargs - maxpos;
2534     if (varargssize < 0) {
2535         varargssize = 0;
2536     }
2537     buf[vararg] = PyTuple_New(varargssize);
2538     if (!buf[vararg]) {
2539         return NULL;
2540     }
2541 
2542     /* copy tuple args */
2543     for (i = 0; i < nargs; i++) {
2544         if (i >= vararg) {
2545             Py_INCREF(args[i]);
2546             PyTuple_SET_ITEM(buf[vararg], i - vararg, args[i]);
2547             continue;
2548         }
2549         else {
2550             buf[i] = args[i];
2551         }
2552     }
2553 
2554     /* copy keyword args using kwtuple to drive process */
2555     for (i = Py_MAX((int)nargs, posonly) -
2556          Py_SAFE_DOWNCAST(varargssize, Py_ssize_t, int); i < maxargs; i++) {
2557         if (nkwargs) {
2558             keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2559             if (kwargs != NULL) {
2560                 current_arg = PyDict_GetItemWithError(kwargs, keyword);
2561                 if (!current_arg && PyErr_Occurred()) {
2562                     goto exit;
2563                 }
2564             }
2565             else {
2566                 current_arg = find_keyword(kwnames, kwstack, keyword);
2567             }
2568         }
2569         else {
2570             current_arg = NULL;
2571         }
2572 
2573         /* If an arguments is passed in as a keyword argument,
2574          * it should be placed before `buf[vararg]`.
2575          *
2576          * For example:
2577          * def f(a, /, b, *args):
2578          *     pass
2579          * f(1, b=2)
2580          *
2581          * This `buf` array should be: [1, 2, NULL].
2582          * In this case, nargs < vararg.
2583          *
2584          * Otherwise, we leave a place at `buf[vararg]` for vararg tuple
2585          * so the index is `i + 1`. */
2586         if (nargs < vararg) {
2587             buf[i] = current_arg;
2588         }
2589         else {
2590             buf[i + 1] = current_arg;
2591         }
2592 
2593         if (current_arg) {
2594             --nkwargs;
2595         }
2596         else if (i < minpos || (maxpos <= i && i < reqlimit)) {
2597             /* Less arguments than required */
2598             keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2599             PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
2600                          "argument '%U' (pos %d)",
2601                          (parser->fname == NULL) ? "function" : parser->fname,
2602                          (parser->fname == NULL) ? "" : "()",
2603                          keyword, i+1);
2604             goto exit;
2605         }
2606     }
2607 
2608     if (nkwargs > 0) {
2609         error_unexpected_keyword_arg(kwargs, kwnames, kwtuple, parser->fname);
2610         goto exit;
2611     }
2612 
2613     return buf;
2614 
2615 exit:
2616     Py_XDECREF(buf[vararg]);
2617     return NULL;
2618 }
2619 
2620 
2621 static const char *
skipitem(const char ** p_format,va_list * p_va,int flags)2622 skipitem(const char **p_format, va_list *p_va, int flags)
2623 {
2624     const char *format = *p_format;
2625     char c = *format++;
2626 
2627     switch (c) {
2628 
2629     /*
2630      * codes that take a single data pointer as an argument
2631      * (the type of the pointer is irrelevant)
2632      */
2633 
2634     case 'b': /* byte -- very short int */
2635     case 'B': /* byte as bitfield */
2636     case 'h': /* short int */
2637     case 'H': /* short int as bitfield */
2638     case 'i': /* int */
2639     case 'I': /* int sized bitfield */
2640     case 'l': /* long int */
2641     case 'k': /* long int sized bitfield */
2642     case 'L': /* long long */
2643     case 'K': /* long long sized bitfield */
2644     case 'n': /* Py_ssize_t */
2645     case 'f': /* float */
2646     case 'd': /* double */
2647     case 'D': /* complex double */
2648     case 'c': /* char */
2649     case 'C': /* unicode char */
2650     case 'p': /* boolean predicate */
2651     case 'S': /* string object */
2652     case 'Y': /* string object */
2653     case 'U': /* unicode string object */
2654         {
2655             if (p_va != NULL) {
2656                 (void) va_arg(*p_va, void *);
2657             }
2658             break;
2659         }
2660 
2661     /* string codes */
2662 
2663     case 'e': /* string with encoding */
2664         {
2665             if (p_va != NULL) {
2666                 (void) va_arg(*p_va, const char *);
2667             }
2668             if (!(*format == 's' || *format == 't'))
2669                 /* after 'e', only 's' and 't' is allowed */
2670                 goto err;
2671             format++;
2672         }
2673         /* fall through */
2674 
2675     case 's': /* string */
2676     case 'z': /* string or None */
2677     case 'y': /* bytes */
2678     case 'u': /* unicode string */
2679     case 'Z': /* unicode string or None */
2680     case 'w': /* buffer, read-write */
2681         {
2682             if (p_va != NULL) {
2683                 (void) va_arg(*p_va, char **);
2684             }
2685             if (*format == '#') {
2686                 if (p_va != NULL) {
2687                     if (!(flags & FLAG_SIZE_T)) {
2688                         return "PY_SSIZE_T_CLEAN macro must be defined for '#' formats";
2689                     }
2690                     (void) va_arg(*p_va, Py_ssize_t *);
2691                 }
2692                 format++;
2693             } else if ((c == 's' || c == 'z' || c == 'y' || c == 'w')
2694                        && *format == '*')
2695             {
2696                 format++;
2697             }
2698             break;
2699         }
2700 
2701     case 'O': /* object */
2702         {
2703             if (*format == '!') {
2704                 format++;
2705                 if (p_va != NULL) {
2706                     (void) va_arg(*p_va, PyTypeObject*);
2707                     (void) va_arg(*p_va, PyObject **);
2708                 }
2709             }
2710             else if (*format == '&') {
2711                 typedef int (*converter)(PyObject *, void *);
2712                 if (p_va != NULL) {
2713                     (void) va_arg(*p_va, converter);
2714                     (void) va_arg(*p_va, void *);
2715                 }
2716                 format++;
2717             }
2718             else {
2719                 if (p_va != NULL) {
2720                     (void) va_arg(*p_va, PyObject **);
2721                 }
2722             }
2723             break;
2724         }
2725 
2726     case '(':           /* bypass tuple, not handled at all previously */
2727         {
2728             const char *msg;
2729             for (;;) {
2730                 if (*format==')')
2731                     break;
2732                 if (IS_END_OF_FORMAT(*format))
2733                     return "Unmatched left paren in format "
2734                            "string";
2735                 msg = skipitem(&format, p_va, flags);
2736                 if (msg)
2737                     return msg;
2738             }
2739             format++;
2740             break;
2741         }
2742 
2743     case ')':
2744         return "Unmatched right paren in format string";
2745 
2746     default:
2747 err:
2748         return "impossible<bad format char>";
2749 
2750     }
2751 
2752     *p_format = format;
2753     return NULL;
2754 }
2755 
2756 
2757 #undef _PyArg_CheckPositional
2758 
2759 int
_PyArg_CheckPositional(const char * name,Py_ssize_t nargs,Py_ssize_t min,Py_ssize_t max)2760 _PyArg_CheckPositional(const char *name, Py_ssize_t nargs,
2761                        Py_ssize_t min, Py_ssize_t max)
2762 {
2763     assert(min >= 0);
2764     assert(min <= max);
2765 
2766     if (nargs < min) {
2767         if (name != NULL)
2768             PyErr_Format(
2769                 PyExc_TypeError,
2770                 "%.200s expected %s%zd argument%s, got %zd",
2771                 name, (min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs);
2772         else
2773             PyErr_Format(
2774                 PyExc_TypeError,
2775                 "unpacked tuple should have %s%zd element%s,"
2776                 " but has %zd",
2777                 (min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs);
2778         return 0;
2779     }
2780 
2781     if (nargs == 0) {
2782         return 1;
2783     }
2784 
2785     if (nargs > max) {
2786         if (name != NULL)
2787             PyErr_Format(
2788                 PyExc_TypeError,
2789                 "%.200s expected %s%zd argument%s, got %zd",
2790                 name, (min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs);
2791         else
2792             PyErr_Format(
2793                 PyExc_TypeError,
2794                 "unpacked tuple should have %s%zd element%s,"
2795                 " but has %zd",
2796                 (min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs);
2797         return 0;
2798     }
2799 
2800     return 1;
2801 }
2802 
2803 static int
unpack_stack(PyObject * const * args,Py_ssize_t nargs,const char * name,Py_ssize_t min,Py_ssize_t max,va_list vargs)2804 unpack_stack(PyObject *const *args, Py_ssize_t nargs, const char *name,
2805              Py_ssize_t min, Py_ssize_t max, va_list vargs)
2806 {
2807     Py_ssize_t i;
2808     PyObject **o;
2809 
2810     if (!_PyArg_CheckPositional(name, nargs, min, max)) {
2811         return 0;
2812     }
2813 
2814     for (i = 0; i < nargs; i++) {
2815         o = va_arg(vargs, PyObject **);
2816         *o = args[i];
2817     }
2818     return 1;
2819 }
2820 
2821 int
PyArg_UnpackTuple(PyObject * args,const char * name,Py_ssize_t min,Py_ssize_t max,...)2822 PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
2823 {
2824     PyObject **stack;
2825     Py_ssize_t nargs;
2826     int retval;
2827     va_list vargs;
2828 
2829     if (!PyTuple_Check(args)) {
2830         PyErr_SetString(PyExc_SystemError,
2831             "PyArg_UnpackTuple() argument list is not a tuple");
2832         return 0;
2833     }
2834     stack = _PyTuple_ITEMS(args);
2835     nargs = PyTuple_GET_SIZE(args);
2836 
2837 #ifdef HAVE_STDARG_PROTOTYPES
2838     va_start(vargs, max);
2839 #else
2840     va_start(vargs);
2841 #endif
2842     retval = unpack_stack(stack, nargs, name, min, max, vargs);
2843     va_end(vargs);
2844     return retval;
2845 }
2846 
2847 int
_PyArg_UnpackStack(PyObject * const * args,Py_ssize_t nargs,const char * name,Py_ssize_t min,Py_ssize_t max,...)2848 _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name,
2849                    Py_ssize_t min, Py_ssize_t max, ...)
2850 {
2851     int retval;
2852     va_list vargs;
2853 
2854 #ifdef HAVE_STDARG_PROTOTYPES
2855     va_start(vargs, max);
2856 #else
2857     va_start(vargs);
2858 #endif
2859     retval = unpack_stack(args, nargs, name, min, max, vargs);
2860     va_end(vargs);
2861     return retval;
2862 }
2863 
2864 
2865 #undef _PyArg_NoKeywords
2866 #undef _PyArg_NoKwnames
2867 #undef _PyArg_NoPositional
2868 
2869 /* For type constructors that don't take keyword args
2870  *
2871  * Sets a TypeError and returns 0 if the args/kwargs is
2872  * not empty, returns 1 otherwise
2873  */
2874 int
_PyArg_NoKeywords(const char * funcname,PyObject * kwargs)2875 _PyArg_NoKeywords(const char *funcname, PyObject *kwargs)
2876 {
2877     if (kwargs == NULL) {
2878         return 1;
2879     }
2880     if (!PyDict_CheckExact(kwargs)) {
2881         PyErr_BadInternalCall();
2882         return 0;
2883     }
2884     if (PyDict_GET_SIZE(kwargs) == 0) {
2885         return 1;
2886     }
2887 
2888     PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
2889                     funcname);
2890     return 0;
2891 }
2892 
2893 int
_PyArg_NoPositional(const char * funcname,PyObject * args)2894 _PyArg_NoPositional(const char *funcname, PyObject *args)
2895 {
2896     if (args == NULL)
2897         return 1;
2898     if (!PyTuple_CheckExact(args)) {
2899         PyErr_BadInternalCall();
2900         return 0;
2901     }
2902     if (PyTuple_GET_SIZE(args) == 0)
2903         return 1;
2904 
2905     PyErr_Format(PyExc_TypeError, "%.200s() takes no positional arguments",
2906                     funcname);
2907     return 0;
2908 }
2909 
2910 int
_PyArg_NoKwnames(const char * funcname,PyObject * kwnames)2911 _PyArg_NoKwnames(const char *funcname, PyObject *kwnames)
2912 {
2913     if (kwnames == NULL) {
2914         return 1;
2915     }
2916 
2917     assert(PyTuple_CheckExact(kwnames));
2918 
2919     if (PyTuple_GET_SIZE(kwnames) == 0) {
2920         return 1;
2921     }
2922 
2923     PyErr_Format(PyExc_TypeError, "%s() takes no keyword arguments", funcname);
2924     return 0;
2925 }
2926 
2927 void
_PyArg_Fini(void)2928 _PyArg_Fini(void)
2929 {
2930     struct _PyArg_Parser *tmp, *s = static_arg_parsers;
2931     while (s) {
2932         tmp = s->next;
2933         s->next = NULL;
2934         parser_clear(s);
2935         s = tmp;
2936     }
2937     static_arg_parsers = NULL;
2938 }
2939 
2940 #ifdef __cplusplus
2941 };
2942 #endif
2943