1 /* struct module -- pack values into and (out of) bytes objects */
2 
3 /* New version supporting byte order, alignment and size options,
4    character strings, and unsigned numbers */
5 
6 #ifndef Py_BUILD_CORE_BUILTIN
7 #  define Py_BUILD_CORE_MODULE 1
8 #endif
9 
10 #define PY_SSIZE_T_CLEAN
11 
12 #include "Python.h"
13 #include "pycore_moduleobject.h"  // _PyModule_GetState()
14 #include "structmember.h"         // PyMemberDef
15 #include <ctype.h>
16 
17 /*[clinic input]
18 class Struct "PyStructObject *" "&PyStructType"
19 [clinic start generated code]*/
20 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=9b032058a83ed7c3]*/
21 
22 typedef struct {
23     PyObject *cache;
24     PyObject *PyStructType;
25     PyObject *unpackiter_type;
26     PyObject *StructError;
27 } _structmodulestate;
28 
29 static inline _structmodulestate*
get_struct_state(PyObject * module)30 get_struct_state(PyObject *module)
31 {
32     void *state = _PyModule_GetState(module);
33     assert(state != NULL);
34     return (_structmodulestate *)state;
35 }
36 
37 static struct PyModuleDef _structmodule;
38 
39 #define get_struct_state_structinst(self) \
40     (get_struct_state(PyType_GetModuleByDef(Py_TYPE(self), &_structmodule)))
41 #define get_struct_state_iterinst(self) \
42     (get_struct_state(PyType_GetModule(Py_TYPE(self))))
43 
44 /* The translation function for each format character is table driven */
45 typedef struct _formatdef {
46     char format;
47     Py_ssize_t size;
48     Py_ssize_t alignment;
49     PyObject* (*unpack)(_structmodulestate *, const char *,
50                         const struct _formatdef *);
51     int (*pack)(_structmodulestate *, char *, PyObject *,
52                 const struct _formatdef *);
53 } formatdef;
54 
55 typedef struct _formatcode {
56     const struct _formatdef *fmtdef;
57     Py_ssize_t offset;
58     Py_ssize_t size;
59     Py_ssize_t repeat;
60 } formatcode;
61 
62 /* Struct object interface */
63 
64 typedef struct {
65     PyObject_HEAD
66     Py_ssize_t s_size;
67     Py_ssize_t s_len;
68     formatcode *s_codes;
69     PyObject *s_format;
70     PyObject *weakreflist; /* List of weak references */
71 } PyStructObject;
72 
73 #define PyStruct_Check(op, state) PyObject_TypeCheck(op, (PyTypeObject *)(state)->PyStructType)
74 
75 /* Define various structs to figure out the alignments of types */
76 
77 
78 typedef struct { char c; short x; } st_short;
79 typedef struct { char c; int x; } st_int;
80 typedef struct { char c; long x; } st_long;
81 typedef struct { char c; float x; } st_float;
82 typedef struct { char c; double x; } st_double;
83 typedef struct { char c; void *x; } st_void_p;
84 typedef struct { char c; size_t x; } st_size_t;
85 typedef struct { char c; _Bool x; } st_bool;
86 
87 #define SHORT_ALIGN (sizeof(st_short) - sizeof(short))
88 #define INT_ALIGN (sizeof(st_int) - sizeof(int))
89 #define LONG_ALIGN (sizeof(st_long) - sizeof(long))
90 #define FLOAT_ALIGN (sizeof(st_float) - sizeof(float))
91 #define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double))
92 #define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *))
93 #define SIZE_T_ALIGN (sizeof(st_size_t) - sizeof(size_t))
94 #define BOOL_ALIGN (sizeof(st_bool) - sizeof(_Bool))
95 
96 /* We can't support q and Q in native mode unless the compiler does;
97    in std mode, they're 8 bytes on all platforms. */
98 typedef struct { char c; long long x; } s_long_long;
99 #define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(long long))
100 
101 #ifdef __powerc
102 #pragma options align=reset
103 #endif
104 
105 /*[python input]
106 class cache_struct_converter(CConverter):
107     type = 'PyStructObject *'
108     converter = 'cache_struct_converter'
109     c_default = "NULL"
110 
111     def parse_arg(self, argname, displayname):
112         return """
113             if (!{converter}(module, {argname}, &{paramname})) {{{{
114                 goto exit;
115             }}}}
116             """.format(argname=argname, paramname=self.name,
117                        converter=self.converter)
118 
119     def cleanup(self):
120         return "Py_XDECREF(%s);\n" % self.name
121 [python start generated code]*/
122 /*[python end generated code: output=da39a3ee5e6b4b0d input=d6746621c2fb1a7d]*/
123 
124 static int cache_struct_converter(PyObject *, PyObject *, PyStructObject **);
125 
126 #include "clinic/_struct.c.h"
127 
128 /* Helper for integer format codes: converts an arbitrary Python object to a
129    PyLongObject if possible, otherwise fails.  Caller should decref. */
130 
131 static PyObject *
get_pylong(_structmodulestate * state,PyObject * v)132 get_pylong(_structmodulestate *state, PyObject *v)
133 {
134     assert(v != NULL);
135     if (!PyLong_Check(v)) {
136         /* Not an integer;  try to use __index__ to convert. */
137         if (PyIndex_Check(v)) {
138             v = _PyNumber_Index(v);
139             if (v == NULL)
140                 return NULL;
141         }
142         else {
143             PyErr_SetString(state->StructError,
144                             "required argument is not an integer");
145             return NULL;
146         }
147     }
148     else
149         Py_INCREF(v);
150 
151     assert(PyLong_Check(v));
152     return v;
153 }
154 
155 /* Helper routine to get a C long and raise the appropriate error if it isn't
156    one */
157 
158 static int
get_long(_structmodulestate * state,PyObject * v,long * p)159 get_long(_structmodulestate *state, PyObject *v, long *p)
160 {
161     long x;
162 
163     v = get_pylong(state, v);
164     if (v == NULL)
165         return -1;
166     assert(PyLong_Check(v));
167     x = PyLong_AsLong(v);
168     Py_DECREF(v);
169     if (x == (long)-1 && PyErr_Occurred()) {
170         if (PyErr_ExceptionMatches(PyExc_OverflowError))
171             PyErr_SetString(state->StructError,
172                             "argument out of range");
173         return -1;
174     }
175     *p = x;
176     return 0;
177 }
178 
179 
180 /* Same, but handling unsigned long */
181 
182 static int
get_ulong(_structmodulestate * state,PyObject * v,unsigned long * p)183 get_ulong(_structmodulestate *state, PyObject *v, unsigned long *p)
184 {
185     unsigned long x;
186 
187     v = get_pylong(state, v);
188     if (v == NULL)
189         return -1;
190     assert(PyLong_Check(v));
191     x = PyLong_AsUnsignedLong(v);
192     Py_DECREF(v);
193     if (x == (unsigned long)-1 && PyErr_Occurred()) {
194         if (PyErr_ExceptionMatches(PyExc_OverflowError))
195             PyErr_SetString(state->StructError,
196                             "argument out of range");
197         return -1;
198     }
199     *p = x;
200     return 0;
201 }
202 
203 /* Same, but handling native long long. */
204 
205 static int
get_longlong(_structmodulestate * state,PyObject * v,long long * p)206 get_longlong(_structmodulestate *state, PyObject *v, long long *p)
207 {
208     long long x;
209 
210     v = get_pylong(state, v);
211     if (v == NULL)
212         return -1;
213     assert(PyLong_Check(v));
214     x = PyLong_AsLongLong(v);
215     Py_DECREF(v);
216     if (x == (long long)-1 && PyErr_Occurred()) {
217         if (PyErr_ExceptionMatches(PyExc_OverflowError))
218             PyErr_SetString(state->StructError,
219                             "argument out of range");
220         return -1;
221     }
222     *p = x;
223     return 0;
224 }
225 
226 /* Same, but handling native unsigned long long. */
227 
228 static int
get_ulonglong(_structmodulestate * state,PyObject * v,unsigned long long * p)229 get_ulonglong(_structmodulestate *state, PyObject *v, unsigned long long *p)
230 {
231     unsigned long long x;
232 
233     v = get_pylong(state, v);
234     if (v == NULL)
235         return -1;
236     assert(PyLong_Check(v));
237     x = PyLong_AsUnsignedLongLong(v);
238     Py_DECREF(v);
239     if (x == (unsigned long long)-1 && PyErr_Occurred()) {
240         if (PyErr_ExceptionMatches(PyExc_OverflowError))
241             PyErr_SetString(state->StructError,
242                             "argument out of range");
243         return -1;
244     }
245     *p = x;
246     return 0;
247 }
248 
249 /* Same, but handling Py_ssize_t */
250 
251 static int
get_ssize_t(_structmodulestate * state,PyObject * v,Py_ssize_t * p)252 get_ssize_t(_structmodulestate *state, PyObject *v, Py_ssize_t *p)
253 {
254     Py_ssize_t x;
255 
256     v = get_pylong(state, v);
257     if (v == NULL)
258         return -1;
259     assert(PyLong_Check(v));
260     x = PyLong_AsSsize_t(v);
261     Py_DECREF(v);
262     if (x == (Py_ssize_t)-1 && PyErr_Occurred()) {
263         if (PyErr_ExceptionMatches(PyExc_OverflowError))
264             PyErr_SetString(state->StructError,
265                             "argument out of range");
266         return -1;
267     }
268     *p = x;
269     return 0;
270 }
271 
272 /* Same, but handling size_t */
273 
274 static int
get_size_t(_structmodulestate * state,PyObject * v,size_t * p)275 get_size_t(_structmodulestate *state, PyObject *v, size_t *p)
276 {
277     size_t x;
278 
279     v = get_pylong(state, v);
280     if (v == NULL)
281         return -1;
282     assert(PyLong_Check(v));
283     x = PyLong_AsSize_t(v);
284     Py_DECREF(v);
285     if (x == (size_t)-1 && PyErr_Occurred()) {
286         if (PyErr_ExceptionMatches(PyExc_OverflowError))
287             PyErr_SetString(state->StructError,
288                             "argument out of range");
289         return -1;
290     }
291     *p = x;
292     return 0;
293 }
294 
295 
296 #define RANGE_ERROR(state, x, f, flag, mask) return _range_error(state, f, flag)
297 
298 
299 /* Floating point helpers */
300 
301 static PyObject *
unpack_halffloat(const char * p,int le)302 unpack_halffloat(const char *p,  /* start of 2-byte string */
303                  int le)         /* true for little-endian, false for big-endian */
304 {
305     double x = PyFloat_Unpack2(p, le);
306     if (x == -1.0 && PyErr_Occurred()) {
307         return NULL;
308     }
309     return PyFloat_FromDouble(x);
310 }
311 
312 static int
pack_halffloat(_structmodulestate * state,char * p,PyObject * v,int le)313 pack_halffloat(_structmodulestate *state,
314                char *p,      /* start of 2-byte string */
315                PyObject *v,  /* value to pack */
316                int le)       /* true for little-endian, false for big-endian */
317 {
318     double x = PyFloat_AsDouble(v);
319     if (x == -1.0 && PyErr_Occurred()) {
320         PyErr_SetString(state->StructError,
321                         "required argument is not a float");
322         return -1;
323     }
324     return PyFloat_Pack2(x, p, le);
325 }
326 
327 static PyObject *
unpack_float(const char * p,int le)328 unpack_float(const char *p,  /* start of 4-byte string */
329          int le)             /* true for little-endian, false for big-endian */
330 {
331     double x;
332 
333     x = PyFloat_Unpack4(p, le);
334     if (x == -1.0 && PyErr_Occurred())
335         return NULL;
336     return PyFloat_FromDouble(x);
337 }
338 
339 static PyObject *
unpack_double(const char * p,int le)340 unpack_double(const char *p,  /* start of 8-byte string */
341           int le)         /* true for little-endian, false for big-endian */
342 {
343     double x;
344 
345     x = PyFloat_Unpack8(p, le);
346     if (x == -1.0 && PyErr_Occurred())
347         return NULL;
348     return PyFloat_FromDouble(x);
349 }
350 
351 /* Helper to format the range error exceptions */
352 static int
_range_error(_structmodulestate * state,const formatdef * f,int is_unsigned)353 _range_error(_structmodulestate *state, const formatdef *f, int is_unsigned)
354 {
355     /* ulargest is the largest unsigned value with f->size bytes.
356      * Note that the simpler:
357      *     ((size_t)1 << (f->size * 8)) - 1
358      * doesn't work when f->size == sizeof(size_t) because C doesn't
359      * define what happens when a left shift count is >= the number of
360      * bits in the integer being shifted; e.g., on some boxes it doesn't
361      * shift at all when they're equal.
362      */
363     const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8);
364     assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T);
365     if (is_unsigned)
366         PyErr_Format(state->StructError,
367             "'%c' format requires 0 <= number <= %zu",
368             f->format,
369             ulargest);
370     else {
371         const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1);
372         PyErr_Format(state->StructError,
373             "'%c' format requires %zd <= number <= %zd",
374             f->format,
375             ~ largest,
376             largest);
377     }
378 
379     return -1;
380 }
381 
382 
383 
384 /* A large number of small routines follow, with names of the form
385 
386    [bln][up]_TYPE
387 
388    [bln] distinguishes among big-endian, little-endian and native.
389    [pu] distinguishes between pack (to struct) and unpack (from struct).
390    TYPE is one of char, byte, ubyte, etc.
391 */
392 
393 /* Native mode routines. ****************************************************/
394 /* NOTE:
395    In all n[up]_<type> routines handling types larger than 1 byte, there is
396    *no* guarantee that the p pointer is properly aligned for each type,
397    therefore memcpy is called.  An intermediate variable is used to
398    compensate for big-endian architectures.
399    Normally both the intermediate variable and the memcpy call will be
400    skipped by C optimisation in little-endian architectures (gcc >= 2.91
401    does this). */
402 
403 static PyObject *
nu_char(_structmodulestate * state,const char * p,const formatdef * f)404 nu_char(_structmodulestate *state, const char *p, const formatdef *f)
405 {
406     return PyBytes_FromStringAndSize(p, 1);
407 }
408 
409 static PyObject *
nu_byte(_structmodulestate * state,const char * p,const formatdef * f)410 nu_byte(_structmodulestate *state, const char *p, const formatdef *f)
411 {
412     return PyLong_FromLong((long) *(signed char *)p);
413 }
414 
415 static PyObject *
nu_ubyte(_structmodulestate * state,const char * p,const formatdef * f)416 nu_ubyte(_structmodulestate *state, const char *p, const formatdef *f)
417 {
418     return PyLong_FromLong((long) *(unsigned char *)p);
419 }
420 
421 static PyObject *
nu_short(_structmodulestate * state,const char * p,const formatdef * f)422 nu_short(_structmodulestate *state, const char *p, const formatdef *f)
423 {
424     short x;
425     memcpy((char *)&x, p, sizeof x);
426     return PyLong_FromLong((long)x);
427 }
428 
429 static PyObject *
nu_ushort(_structmodulestate * state,const char * p,const formatdef * f)430 nu_ushort(_structmodulestate *state, const char *p, const formatdef *f)
431 {
432     unsigned short x;
433     memcpy((char *)&x, p, sizeof x);
434     return PyLong_FromLong((long)x);
435 }
436 
437 static PyObject *
nu_int(_structmodulestate * state,const char * p,const formatdef * f)438 nu_int(_structmodulestate *state, const char *p, const formatdef *f)
439 {
440     int x;
441     memcpy((char *)&x, p, sizeof x);
442     return PyLong_FromLong((long)x);
443 }
444 
445 static PyObject *
nu_uint(_structmodulestate * state,const char * p,const formatdef * f)446 nu_uint(_structmodulestate *state, const char *p, const formatdef *f)
447 {
448     unsigned int x;
449     memcpy((char *)&x, p, sizeof x);
450     return PyLong_FromUnsignedLong((unsigned long)x);
451 }
452 
453 static PyObject *
nu_long(_structmodulestate * state,const char * p,const formatdef * f)454 nu_long(_structmodulestate *state, const char *p, const formatdef *f)
455 {
456     long x;
457     memcpy((char *)&x, p, sizeof x);
458     return PyLong_FromLong(x);
459 }
460 
461 static PyObject *
nu_ulong(_structmodulestate * state,const char * p,const formatdef * f)462 nu_ulong(_structmodulestate *state, const char *p, const formatdef *f)
463 {
464     unsigned long x;
465     memcpy((char *)&x, p, sizeof x);
466     return PyLong_FromUnsignedLong(x);
467 }
468 
469 static PyObject *
nu_ssize_t(_structmodulestate * state,const char * p,const formatdef * f)470 nu_ssize_t(_structmodulestate *state, const char *p, const formatdef *f)
471 {
472     Py_ssize_t x;
473     memcpy((char *)&x, p, sizeof x);
474     return PyLong_FromSsize_t(x);
475 }
476 
477 static PyObject *
nu_size_t(_structmodulestate * state,const char * p,const formatdef * f)478 nu_size_t(_structmodulestate *state, const char *p, const formatdef *f)
479 {
480     size_t x;
481     memcpy((char *)&x, p, sizeof x);
482     return PyLong_FromSize_t(x);
483 }
484 
485 static PyObject *
nu_longlong(_structmodulestate * state,const char * p,const formatdef * f)486 nu_longlong(_structmodulestate *state, const char *p, const formatdef *f)
487 {
488     long long x;
489     memcpy((char *)&x, p, sizeof x);
490     return PyLong_FromLongLong(x);
491 }
492 
493 static PyObject *
nu_ulonglong(_structmodulestate * state,const char * p,const formatdef * f)494 nu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f)
495 {
496     unsigned long long x;
497     memcpy((char *)&x, p, sizeof x);
498     return PyLong_FromUnsignedLongLong(x);
499 }
500 
501 static PyObject *
nu_bool(_structmodulestate * state,const char * p,const formatdef * f)502 nu_bool(_structmodulestate *state, const char *p, const formatdef *f)
503 {
504     _Bool x;
505     memcpy((char *)&x, p, sizeof x);
506     return PyBool_FromLong(x != 0);
507 }
508 
509 
510 static PyObject *
nu_halffloat(_structmodulestate * state,const char * p,const formatdef * f)511 nu_halffloat(_structmodulestate *state, const char *p, const formatdef *f)
512 {
513 #if PY_LITTLE_ENDIAN
514     return unpack_halffloat(p, 1);
515 #else
516     return unpack_halffloat(p, 0);
517 #endif
518 }
519 
520 static PyObject *
nu_float(_structmodulestate * state,const char * p,const formatdef * f)521 nu_float(_structmodulestate *state, const char *p, const formatdef *f)
522 {
523     float x;
524     memcpy((char *)&x, p, sizeof x);
525     return PyFloat_FromDouble((double)x);
526 }
527 
528 static PyObject *
nu_double(_structmodulestate * state,const char * p,const formatdef * f)529 nu_double(_structmodulestate *state, const char *p, const formatdef *f)
530 {
531     double x;
532     memcpy((char *)&x, p, sizeof x);
533     return PyFloat_FromDouble(x);
534 }
535 
536 static PyObject *
nu_void_p(_structmodulestate * state,const char * p,const formatdef * f)537 nu_void_p(_structmodulestate *state, const char *p, const formatdef *f)
538 {
539     void *x;
540     memcpy((char *)&x, p, sizeof x);
541     return PyLong_FromVoidPtr(x);
542 }
543 
544 static int
np_byte(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)545 np_byte(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
546 {
547     long x;
548     if (get_long(state, v, &x) < 0)
549         return -1;
550     if (x < -128 || x > 127) {
551         PyErr_SetString(state->StructError,
552                         "byte format requires -128 <= number <= 127");
553         return -1;
554     }
555     *p = (char)x;
556     return 0;
557 }
558 
559 static int
np_ubyte(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)560 np_ubyte(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
561 {
562     long x;
563     if (get_long(state, v, &x) < 0)
564         return -1;
565     if (x < 0 || x > 255) {
566         PyErr_SetString(state->StructError,
567                         "ubyte format requires 0 <= number <= 255");
568         return -1;
569     }
570     *(unsigned char *)p = (unsigned char)x;
571     return 0;
572 }
573 
574 static int
np_char(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)575 np_char(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
576 {
577     if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) {
578         PyErr_SetString(state->StructError,
579                         "char format requires a bytes object of length 1");
580         return -1;
581     }
582     *p = *PyBytes_AS_STRING(v);
583     return 0;
584 }
585 
586 static int
np_short(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)587 np_short(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
588 {
589     long x;
590     short y;
591     if (get_long(state, v, &x) < 0)
592         return -1;
593     if (x < SHRT_MIN || x > SHRT_MAX) {
594         PyErr_Format(state->StructError,
595                      "short format requires %d <= number <= %d",
596                      (int)SHRT_MIN, (int)SHRT_MAX);
597         return -1;
598     }
599     y = (short)x;
600     memcpy(p, (char *)&y, sizeof y);
601     return 0;
602 }
603 
604 static int
np_ushort(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)605 np_ushort(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
606 {
607     long x;
608     unsigned short y;
609     if (get_long(state, v, &x) < 0)
610         return -1;
611     if (x < 0 || x > USHRT_MAX) {
612         PyErr_Format(state->StructError,
613                      "ushort format requires 0 <= number <= %u",
614                      (unsigned int)USHRT_MAX);
615         return -1;
616     }
617     y = (unsigned short)x;
618     memcpy(p, (char *)&y, sizeof y);
619     return 0;
620 }
621 
622 static int
np_int(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)623 np_int(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
624 {
625     long x;
626     int y;
627     if (get_long(state, v, &x) < 0)
628         return -1;
629 #if (SIZEOF_LONG > SIZEOF_INT)
630     if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
631         RANGE_ERROR(state, x, f, 0, -1);
632 #endif
633     y = (int)x;
634     memcpy(p, (char *)&y, sizeof y);
635     return 0;
636 }
637 
638 static int
np_uint(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)639 np_uint(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
640 {
641     unsigned long x;
642     unsigned int y;
643     if (get_ulong(state, v, &x) < 0)
644         return -1;
645     y = (unsigned int)x;
646 #if (SIZEOF_LONG > SIZEOF_INT)
647     if (x > ((unsigned long)UINT_MAX))
648         RANGE_ERROR(state, y, f, 1, -1);
649 #endif
650     memcpy(p, (char *)&y, sizeof y);
651     return 0;
652 }
653 
654 static int
np_long(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)655 np_long(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
656 {
657     long x;
658     if (get_long(state, v, &x) < 0)
659         return -1;
660     memcpy(p, (char *)&x, sizeof x);
661     return 0;
662 }
663 
664 static int
np_ulong(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)665 np_ulong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
666 {
667     unsigned long x;
668     if (get_ulong(state, v, &x) < 0)
669         return -1;
670     memcpy(p, (char *)&x, sizeof x);
671     return 0;
672 }
673 
674 static int
np_ssize_t(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)675 np_ssize_t(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
676 {
677     Py_ssize_t x;
678     if (get_ssize_t(state, v, &x) < 0)
679         return -1;
680     memcpy(p, (char *)&x, sizeof x);
681     return 0;
682 }
683 
684 static int
np_size_t(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)685 np_size_t(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
686 {
687     size_t x;
688     if (get_size_t(state, v, &x) < 0)
689         return -1;
690     memcpy(p, (char *)&x, sizeof x);
691     return 0;
692 }
693 
694 static int
np_longlong(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)695 np_longlong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
696 {
697     long long x;
698     if (get_longlong(state, v, &x) < 0)
699         return -1;
700     memcpy(p, (char *)&x, sizeof x);
701     return 0;
702 }
703 
704 static int
np_ulonglong(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)705 np_ulonglong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
706 {
707     unsigned long long x;
708     if (get_ulonglong(state, v, &x) < 0)
709         return -1;
710     memcpy(p, (char *)&x, sizeof x);
711     return 0;
712 }
713 
714 
715 static int
np_bool(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)716 np_bool(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
717 {
718     int y;
719     _Bool x;
720     y = PyObject_IsTrue(v);
721     if (y < 0)
722         return -1;
723     x = y;
724     memcpy(p, (char *)&x, sizeof x);
725     return 0;
726 }
727 
728 static int
np_halffloat(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)729 np_halffloat(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
730 {
731 #if PY_LITTLE_ENDIAN
732     return pack_halffloat(state, p, v, 1);
733 #else
734     return pack_halffloat(state, p, v, 0);
735 #endif
736 }
737 
738 static int
np_float(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)739 np_float(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
740 {
741     float x = (float)PyFloat_AsDouble(v);
742     if (x == -1 && PyErr_Occurred()) {
743         PyErr_SetString(state->StructError,
744                         "required argument is not a float");
745         return -1;
746     }
747     memcpy(p, (char *)&x, sizeof x);
748     return 0;
749 }
750 
751 static int
np_double(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)752 np_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
753 {
754     double x = PyFloat_AsDouble(v);
755     if (x == -1 && PyErr_Occurred()) {
756         PyErr_SetString(state->StructError,
757                         "required argument is not a float");
758         return -1;
759     }
760     memcpy(p, (char *)&x, sizeof(double));
761     return 0;
762 }
763 
764 static int
np_void_p(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)765 np_void_p(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
766 {
767     void *x;
768 
769     v = get_pylong(state, v);
770     if (v == NULL)
771         return -1;
772     assert(PyLong_Check(v));
773     x = PyLong_AsVoidPtr(v);
774     Py_DECREF(v);
775     if (x == NULL && PyErr_Occurred())
776         return -1;
777     memcpy(p, (char *)&x, sizeof x);
778     return 0;
779 }
780 
781 static const formatdef native_table[] = {
782     {'x',       sizeof(char),   0,              NULL},
783     {'b',       sizeof(char),   0,              nu_byte,        np_byte},
784     {'B',       sizeof(char),   0,              nu_ubyte,       np_ubyte},
785     {'c',       sizeof(char),   0,              nu_char,        np_char},
786     {'s',       sizeof(char),   0,              NULL},
787     {'p',       sizeof(char),   0,              NULL},
788     {'h',       sizeof(short),  SHORT_ALIGN,    nu_short,       np_short},
789     {'H',       sizeof(short),  SHORT_ALIGN,    nu_ushort,      np_ushort},
790     {'i',       sizeof(int),    INT_ALIGN,      nu_int,         np_int},
791     {'I',       sizeof(int),    INT_ALIGN,      nu_uint,        np_uint},
792     {'l',       sizeof(long),   LONG_ALIGN,     nu_long,        np_long},
793     {'L',       sizeof(long),   LONG_ALIGN,     nu_ulong,       np_ulong},
794     {'n',       sizeof(size_t), SIZE_T_ALIGN,   nu_ssize_t,     np_ssize_t},
795     {'N',       sizeof(size_t), SIZE_T_ALIGN,   nu_size_t,      np_size_t},
796     {'q',       sizeof(long long), LONG_LONG_ALIGN, nu_longlong, np_longlong},
797     {'Q',       sizeof(long long), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong},
798     {'?',       sizeof(_Bool),      BOOL_ALIGN,     nu_bool,        np_bool},
799     {'e',       sizeof(short),  SHORT_ALIGN,    nu_halffloat,   np_halffloat},
800     {'f',       sizeof(float),  FLOAT_ALIGN,    nu_float,       np_float},
801     {'d',       sizeof(double), DOUBLE_ALIGN,   nu_double,      np_double},
802     {'P',       sizeof(void *), VOID_P_ALIGN,   nu_void_p,      np_void_p},
803     {0}
804 };
805 
806 /* Big-endian routines. *****************************************************/
807 
808 static PyObject *
bu_int(_structmodulestate * state,const char * p,const formatdef * f)809 bu_int(_structmodulestate *state, const char *p, const formatdef *f)
810 {
811     long x = 0;
812     Py_ssize_t i = f->size;
813     const unsigned char *bytes = (const unsigned char *)p;
814     do {
815         x = (x<<8) | *bytes++;
816     } while (--i > 0);
817     /* Extend the sign bit. */
818     if (SIZEOF_LONG > f->size)
819         x |= -(x & (1L << ((8 * f->size) - 1)));
820     return PyLong_FromLong(x);
821 }
822 
823 static PyObject *
bu_uint(_structmodulestate * state,const char * p,const formatdef * f)824 bu_uint(_structmodulestate *state, const char *p, const formatdef *f)
825 {
826     unsigned long x = 0;
827     Py_ssize_t i = f->size;
828     const unsigned char *bytes = (const unsigned char *)p;
829     do {
830         x = (x<<8) | *bytes++;
831     } while (--i > 0);
832     return PyLong_FromUnsignedLong(x);
833 }
834 
835 static PyObject *
bu_longlong(_structmodulestate * state,const char * p,const formatdef * f)836 bu_longlong(_structmodulestate *state, const char *p, const formatdef *f)
837 {
838     long long x = 0;
839     Py_ssize_t i = f->size;
840     const unsigned char *bytes = (const unsigned char *)p;
841     do {
842         x = (x<<8) | *bytes++;
843     } while (--i > 0);
844     /* Extend the sign bit. */
845     if (SIZEOF_LONG_LONG > f->size)
846         x |= -(x & ((long long)1 << ((8 * f->size) - 1)));
847     return PyLong_FromLongLong(x);
848 }
849 
850 static PyObject *
bu_ulonglong(_structmodulestate * state,const char * p,const formatdef * f)851 bu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f)
852 {
853     unsigned long long x = 0;
854     Py_ssize_t i = f->size;
855     const unsigned char *bytes = (const unsigned char *)p;
856     do {
857         x = (x<<8) | *bytes++;
858     } while (--i > 0);
859     return PyLong_FromUnsignedLongLong(x);
860 }
861 
862 static PyObject *
bu_halffloat(_structmodulestate * state,const char * p,const formatdef * f)863 bu_halffloat(_structmodulestate *state, const char *p, const formatdef *f)
864 {
865     return unpack_halffloat(p, 0);
866 }
867 
868 static PyObject *
bu_float(_structmodulestate * state,const char * p,const formatdef * f)869 bu_float(_structmodulestate *state, const char *p, const formatdef *f)
870 {
871     return unpack_float(p, 0);
872 }
873 
874 static PyObject *
bu_double(_structmodulestate * state,const char * p,const formatdef * f)875 bu_double(_structmodulestate *state, const char *p, const formatdef *f)
876 {
877     return unpack_double(p, 0);
878 }
879 
880 static PyObject *
bu_bool(_structmodulestate * state,const char * p,const formatdef * f)881 bu_bool(_structmodulestate *state, const char *p, const formatdef *f)
882 {
883     return PyBool_FromLong(*p != 0);
884 }
885 
886 static int
bp_int(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)887 bp_int(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
888 {
889     long x;
890     Py_ssize_t i;
891     unsigned char *q = (unsigned char *)p;
892     if (get_long(state, v, &x) < 0)
893         return -1;
894     i = f->size;
895     if (i != SIZEOF_LONG) {
896         if ((i == 2) && (x < -32768 || x > 32767))
897             RANGE_ERROR(state, x, f, 0, 0xffffL);
898 #if (SIZEOF_LONG != 4)
899         else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
900             RANGE_ERROR(state, x, f, 0, 0xffffffffL);
901 #endif
902     }
903     do {
904         q[--i] = (unsigned char)(x & 0xffL);
905         x >>= 8;
906     } while (i > 0);
907     return 0;
908 }
909 
910 static int
bp_uint(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)911 bp_uint(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
912 {
913     unsigned long x;
914     Py_ssize_t i;
915     unsigned char *q = (unsigned char *)p;
916     if (get_ulong(state, v, &x) < 0)
917         return -1;
918     i = f->size;
919     if (i != SIZEOF_LONG) {
920         unsigned long maxint = 1;
921         maxint <<= (unsigned long)(i * 8);
922         if (x >= maxint)
923             RANGE_ERROR(state, x, f, 1, maxint - 1);
924     }
925     do {
926         q[--i] = (unsigned char)(x & 0xffUL);
927         x >>= 8;
928     } while (i > 0);
929     return 0;
930 }
931 
932 static int
bp_longlong(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)933 bp_longlong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
934 {
935     int res;
936     v = get_pylong(state, v);
937     if (v == NULL)
938         return -1;
939     res = _PyLong_AsByteArray((PyLongObject *)v,
940                               (unsigned char *)p,
941                               8,
942                               0, /* little_endian */
943                               1  /* signed */);
944     Py_DECREF(v);
945     return res;
946 }
947 
948 static int
bp_ulonglong(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)949 bp_ulonglong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
950 {
951     int res;
952     v = get_pylong(state, v);
953     if (v == NULL)
954         return -1;
955     res = _PyLong_AsByteArray((PyLongObject *)v,
956                               (unsigned char *)p,
957                               8,
958                               0, /* little_endian */
959                               0  /* signed */);
960     Py_DECREF(v);
961     return res;
962 }
963 
964 static int
bp_halffloat(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)965 bp_halffloat(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
966 {
967     return pack_halffloat(state, p, v, 0);
968 }
969 
970 static int
bp_float(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)971 bp_float(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
972 {
973     double x = PyFloat_AsDouble(v);
974     if (x == -1 && PyErr_Occurred()) {
975         PyErr_SetString(state->StructError,
976                         "required argument is not a float");
977         return -1;
978     }
979     return PyFloat_Pack4(x, p, 0);
980 }
981 
982 static int
bp_double(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)983 bp_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
984 {
985     double x = PyFloat_AsDouble(v);
986     if (x == -1 && PyErr_Occurred()) {
987         PyErr_SetString(state->StructError,
988                         "required argument is not a float");
989         return -1;
990     }
991     return PyFloat_Pack8(x, p, 0);
992 }
993 
994 static int
bp_bool(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)995 bp_bool(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
996 {
997     int y;
998     y = PyObject_IsTrue(v);
999     if (y < 0)
1000         return -1;
1001     *p = (char)y;
1002     return 0;
1003 }
1004 
1005 static formatdef bigendian_table[] = {
1006     {'x',       1,              0,              NULL},
1007     {'b',       1,              0,              nu_byte,        np_byte},
1008     {'B',       1,              0,              nu_ubyte,       np_ubyte},
1009     {'c',       1,              0,              nu_char,        np_char},
1010     {'s',       1,              0,              NULL},
1011     {'p',       1,              0,              NULL},
1012     {'h',       2,              0,              bu_int,         bp_int},
1013     {'H',       2,              0,              bu_uint,        bp_uint},
1014     {'i',       4,              0,              bu_int,         bp_int},
1015     {'I',       4,              0,              bu_uint,        bp_uint},
1016     {'l',       4,              0,              bu_int,         bp_int},
1017     {'L',       4,              0,              bu_uint,        bp_uint},
1018     {'q',       8,              0,              bu_longlong,    bp_longlong},
1019     {'Q',       8,              0,              bu_ulonglong,   bp_ulonglong},
1020     {'?',       1,              0,              bu_bool,        bp_bool},
1021     {'e',       2,              0,              bu_halffloat,   bp_halffloat},
1022     {'f',       4,              0,              bu_float,       bp_float},
1023     {'d',       8,              0,              bu_double,      bp_double},
1024     {0}
1025 };
1026 
1027 /* Little-endian routines. *****************************************************/
1028 
1029 static PyObject *
lu_int(_structmodulestate * state,const char * p,const formatdef * f)1030 lu_int(_structmodulestate *state, const char *p, const formatdef *f)
1031 {
1032     long x = 0;
1033     Py_ssize_t i = f->size;
1034     const unsigned char *bytes = (const unsigned char *)p;
1035     do {
1036         x = (x<<8) | bytes[--i];
1037     } while (i > 0);
1038     /* Extend the sign bit. */
1039     if (SIZEOF_LONG > f->size)
1040         x |= -(x & (1L << ((8 * f->size) - 1)));
1041     return PyLong_FromLong(x);
1042 }
1043 
1044 static PyObject *
lu_uint(_structmodulestate * state,const char * p,const formatdef * f)1045 lu_uint(_structmodulestate *state, const char *p, const formatdef *f)
1046 {
1047     unsigned long x = 0;
1048     Py_ssize_t i = f->size;
1049     const unsigned char *bytes = (const unsigned char *)p;
1050     do {
1051         x = (x<<8) | bytes[--i];
1052     } while (i > 0);
1053     return PyLong_FromUnsignedLong(x);
1054 }
1055 
1056 static PyObject *
lu_longlong(_structmodulestate * state,const char * p,const formatdef * f)1057 lu_longlong(_structmodulestate *state, const char *p, const formatdef *f)
1058 {
1059     long long x = 0;
1060     Py_ssize_t i = f->size;
1061     const unsigned char *bytes = (const unsigned char *)p;
1062     do {
1063         x = (x<<8) | bytes[--i];
1064     } while (i > 0);
1065     /* Extend the sign bit. */
1066     if (SIZEOF_LONG_LONG > f->size)
1067         x |= -(x & ((long long)1 << ((8 * f->size) - 1)));
1068     return PyLong_FromLongLong(x);
1069 }
1070 
1071 static PyObject *
lu_ulonglong(_structmodulestate * state,const char * p,const formatdef * f)1072 lu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f)
1073 {
1074     unsigned long long x = 0;
1075     Py_ssize_t i = f->size;
1076     const unsigned char *bytes = (const unsigned char *)p;
1077     do {
1078         x = (x<<8) | bytes[--i];
1079     } while (i > 0);
1080     return PyLong_FromUnsignedLongLong(x);
1081 }
1082 
1083 static PyObject *
lu_halffloat(_structmodulestate * state,const char * p,const formatdef * f)1084 lu_halffloat(_structmodulestate *state, const char *p, const formatdef *f)
1085 {
1086     return unpack_halffloat(p, 1);
1087 }
1088 
1089 static PyObject *
lu_float(_structmodulestate * state,const char * p,const formatdef * f)1090 lu_float(_structmodulestate *state, const char *p, const formatdef *f)
1091 {
1092     return unpack_float(p, 1);
1093 }
1094 
1095 static PyObject *
lu_double(_structmodulestate * state,const char * p,const formatdef * f)1096 lu_double(_structmodulestate *state, const char *p, const formatdef *f)
1097 {
1098     return unpack_double(p, 1);
1099 }
1100 
1101 static int
lp_int(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)1102 lp_int(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
1103 {
1104     long x;
1105     Py_ssize_t i;
1106     unsigned char *q = (unsigned char *)p;
1107     if (get_long(state, v, &x) < 0)
1108         return -1;
1109     i = f->size;
1110     if (i != SIZEOF_LONG) {
1111         if ((i == 2) && (x < -32768 || x > 32767))
1112             RANGE_ERROR(state, x, f, 0, 0xffffL);
1113 #if (SIZEOF_LONG != 4)
1114         else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
1115             RANGE_ERROR(state, x, f, 0, 0xffffffffL);
1116 #endif
1117     }
1118     do {
1119         *q++ = (unsigned char)(x & 0xffL);
1120         x >>= 8;
1121     } while (--i > 0);
1122     return 0;
1123 }
1124 
1125 static int
lp_uint(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)1126 lp_uint(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
1127 {
1128     unsigned long x;
1129     Py_ssize_t i;
1130     unsigned char *q = (unsigned char *)p;
1131     if (get_ulong(state, v, &x) < 0)
1132         return -1;
1133     i = f->size;
1134     if (i != SIZEOF_LONG) {
1135         unsigned long maxint = 1;
1136         maxint <<= (unsigned long)(i * 8);
1137         if (x >= maxint)
1138             RANGE_ERROR(state, x, f, 1, maxint - 1);
1139     }
1140     do {
1141         *q++ = (unsigned char)(x & 0xffUL);
1142         x >>= 8;
1143     } while (--i > 0);
1144     return 0;
1145 }
1146 
1147 static int
lp_longlong(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)1148 lp_longlong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
1149 {
1150     int res;
1151     v = get_pylong(state, v);
1152     if (v == NULL)
1153         return -1;
1154     res = _PyLong_AsByteArray((PyLongObject*)v,
1155                               (unsigned char *)p,
1156                               8,
1157                               1, /* little_endian */
1158                               1  /* signed */);
1159     Py_DECREF(v);
1160     return res;
1161 }
1162 
1163 static int
lp_ulonglong(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)1164 lp_ulonglong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
1165 {
1166     int res;
1167     v = get_pylong(state, v);
1168     if (v == NULL)
1169         return -1;
1170     res = _PyLong_AsByteArray((PyLongObject*)v,
1171                               (unsigned char *)p,
1172                               8,
1173                               1, /* little_endian */
1174                               0  /* signed */);
1175     Py_DECREF(v);
1176     return res;
1177 }
1178 
1179 static int
lp_halffloat(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)1180 lp_halffloat(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
1181 {
1182     return pack_halffloat(state, p, v, 1);
1183 }
1184 
1185 static int
lp_float(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)1186 lp_float(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
1187 {
1188     double x = PyFloat_AsDouble(v);
1189     if (x == -1 && PyErr_Occurred()) {
1190         PyErr_SetString(state->StructError,
1191                         "required argument is not a float");
1192         return -1;
1193     }
1194     return PyFloat_Pack4(x, p, 1);
1195 }
1196 
1197 static int
lp_double(_structmodulestate * state,char * p,PyObject * v,const formatdef * f)1198 lp_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f)
1199 {
1200     double x = PyFloat_AsDouble(v);
1201     if (x == -1 && PyErr_Occurred()) {
1202         PyErr_SetString(state->StructError,
1203                         "required argument is not a float");
1204         return -1;
1205     }
1206     return PyFloat_Pack8(x, p, 1);
1207 }
1208 
1209 static formatdef lilendian_table[] = {
1210     {'x',       1,              0,              NULL},
1211     {'b',       1,              0,              nu_byte,        np_byte},
1212     {'B',       1,              0,              nu_ubyte,       np_ubyte},
1213     {'c',       1,              0,              nu_char,        np_char},
1214     {'s',       1,              0,              NULL},
1215     {'p',       1,              0,              NULL},
1216     {'h',       2,              0,              lu_int,         lp_int},
1217     {'H',       2,              0,              lu_uint,        lp_uint},
1218     {'i',       4,              0,              lu_int,         lp_int},
1219     {'I',       4,              0,              lu_uint,        lp_uint},
1220     {'l',       4,              0,              lu_int,         lp_int},
1221     {'L',       4,              0,              lu_uint,        lp_uint},
1222     {'q',       8,              0,              lu_longlong,    lp_longlong},
1223     {'Q',       8,              0,              lu_ulonglong,   lp_ulonglong},
1224     {'?',       1,              0,              bu_bool,        bp_bool}, /* Std rep not endian dep,
1225         but potentially different from native rep -- reuse bx_bool funcs. */
1226     {'e',       2,              0,              lu_halffloat,   lp_halffloat},
1227     {'f',       4,              0,              lu_float,       lp_float},
1228     {'d',       8,              0,              lu_double,      lp_double},
1229     {0}
1230 };
1231 
1232 
1233 static const formatdef *
whichtable(const char ** pfmt)1234 whichtable(const char **pfmt)
1235 {
1236     const char *fmt = (*pfmt)++; /* May be backed out of later */
1237     switch (*fmt) {
1238     case '<':
1239         return lilendian_table;
1240     case '>':
1241     case '!': /* Network byte order is big-endian */
1242         return bigendian_table;
1243     case '=': { /* Host byte order -- different from native in alignment! */
1244 #if PY_LITTLE_ENDIAN
1245         return lilendian_table;
1246 #else
1247         return bigendian_table;
1248 #endif
1249     }
1250     default:
1251         --*pfmt; /* Back out of pointer increment */
1252         /* Fall through */
1253     case '@':
1254         return native_table;
1255     }
1256 }
1257 
1258 
1259 /* Get the table entry for a format code */
1260 
1261 static const formatdef *
getentry(_structmodulestate * state,int c,const formatdef * f)1262 getentry(_structmodulestate *state, int c, const formatdef *f)
1263 {
1264     for (; f->format != '\0'; f++) {
1265         if (f->format == c) {
1266             return f;
1267         }
1268     }
1269     PyErr_SetString(state->StructError, "bad char in struct format");
1270     return NULL;
1271 }
1272 
1273 
1274 /* Align a size according to a format code.  Return -1 on overflow. */
1275 
1276 static Py_ssize_t
align(Py_ssize_t size,char c,const formatdef * e)1277 align(Py_ssize_t size, char c, const formatdef *e)
1278 {
1279     Py_ssize_t extra;
1280 
1281     if (e->format == c) {
1282         if (e->alignment && size > 0) {
1283             extra = (e->alignment - 1) - (size - 1) % (e->alignment);
1284             if (extra > PY_SSIZE_T_MAX - size)
1285                 return -1;
1286             size += extra;
1287         }
1288     }
1289     return size;
1290 }
1291 
1292 /*
1293  * Struct object implementation.
1294  */
1295 
1296 /* calculate the size of a format string */
1297 
1298 static int
prepare_s(PyStructObject * self)1299 prepare_s(PyStructObject *self)
1300 {
1301     const formatdef *f;
1302     const formatdef *e;
1303     formatcode *codes;
1304 
1305     const char *s;
1306     const char *fmt;
1307     char c;
1308     Py_ssize_t size, len, num, itemsize;
1309     size_t ncodes;
1310 
1311     _structmodulestate *state = get_struct_state_structinst(self);
1312 
1313     fmt = PyBytes_AS_STRING(self->s_format);
1314     if (strlen(fmt) != (size_t)PyBytes_GET_SIZE(self->s_format)) {
1315         PyErr_SetString(state->StructError,
1316                         "embedded null character");
1317         return -1;
1318     }
1319 
1320     f = whichtable(&fmt);
1321 
1322     s = fmt;
1323     size = 0;
1324     len = 0;
1325     ncodes = 0;
1326     while ((c = *s++) != '\0') {
1327         if (Py_ISSPACE(c))
1328             continue;
1329         if ('0' <= c && c <= '9') {
1330             num = c - '0';
1331             while ('0' <= (c = *s++) && c <= '9') {
1332                 /* overflow-safe version of
1333                    if (num*10 + (c - '0') > PY_SSIZE_T_MAX) { ... } */
1334                 if (num >= PY_SSIZE_T_MAX / 10 && (
1335                         num > PY_SSIZE_T_MAX / 10 ||
1336                         (c - '0') > PY_SSIZE_T_MAX % 10))
1337                     goto overflow;
1338                 num = num*10 + (c - '0');
1339             }
1340             if (c == '\0') {
1341                 PyErr_SetString(state->StructError,
1342                                 "repeat count given without format specifier");
1343                 return -1;
1344             }
1345         }
1346         else
1347             num = 1;
1348 
1349         e = getentry(state, c, f);
1350         if (e == NULL)
1351             return -1;
1352 
1353         switch (c) {
1354             case 's': /* fall through */
1355             case 'p': len++; ncodes++; break;
1356             case 'x': break;
1357             default: len += num; if (num) ncodes++; break;
1358         }
1359 
1360         itemsize = e->size;
1361         size = align(size, c, e);
1362         if (size == -1)
1363             goto overflow;
1364 
1365         /* if (size + num * itemsize > PY_SSIZE_T_MAX) { ... } */
1366         if (num > (PY_SSIZE_T_MAX - size) / itemsize)
1367             goto overflow;
1368         size += num * itemsize;
1369     }
1370 
1371     /* check for overflow */
1372     if ((ncodes + 1) > ((size_t)PY_SSIZE_T_MAX / sizeof(formatcode))) {
1373         PyErr_NoMemory();
1374         return -1;
1375     }
1376 
1377     self->s_size = size;
1378     self->s_len = len;
1379     codes = PyMem_Malloc((ncodes + 1) * sizeof(formatcode));
1380     if (codes == NULL) {
1381         PyErr_NoMemory();
1382         return -1;
1383     }
1384     /* Free any s_codes value left over from a previous initialization. */
1385     if (self->s_codes != NULL)
1386         PyMem_Free(self->s_codes);
1387     self->s_codes = codes;
1388 
1389     s = fmt;
1390     size = 0;
1391     while ((c = *s++) != '\0') {
1392         if (Py_ISSPACE(c))
1393             continue;
1394         if ('0' <= c && c <= '9') {
1395             num = c - '0';
1396             while ('0' <= (c = *s++) && c <= '9')
1397                 num = num*10 + (c - '0');
1398         }
1399         else
1400             num = 1;
1401 
1402         e = getentry(state, c, f);
1403 
1404         size = align(size, c, e);
1405         if (c == 's' || c == 'p') {
1406             codes->offset = size;
1407             codes->size = num;
1408             codes->fmtdef = e;
1409             codes->repeat = 1;
1410             codes++;
1411             size += num;
1412         } else if (c == 'x') {
1413             size += num;
1414         } else if (num) {
1415             codes->offset = size;
1416             codes->size = e->size;
1417             codes->fmtdef = e;
1418             codes->repeat = num;
1419             codes++;
1420             size += e->size * num;
1421         }
1422     }
1423     codes->fmtdef = NULL;
1424     codes->offset = size;
1425     codes->size = 0;
1426     codes->repeat = 0;
1427 
1428     return 0;
1429 
1430   overflow:
1431     PyErr_SetString(state->StructError,
1432                     "total struct size too long");
1433     return -1;
1434 }
1435 
1436 static PyObject *
s_new(PyTypeObject * type,PyObject * args,PyObject * kwds)1437 s_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1438 {
1439     PyObject *self;
1440 
1441     assert(type != NULL);
1442     allocfunc alloc_func = PyType_GetSlot(type, Py_tp_alloc);
1443     assert(alloc_func != NULL);
1444 
1445     self = alloc_func(type, 0);
1446     if (self != NULL) {
1447         PyStructObject *s = (PyStructObject*)self;
1448         s->s_format = Py_NewRef(Py_None);
1449         s->s_codes = NULL;
1450         s->s_size = -1;
1451         s->s_len = -1;
1452     }
1453     return self;
1454 }
1455 
1456 /*[clinic input]
1457 Struct.__init__
1458 
1459     format: object
1460 
1461 Create a compiled struct object.
1462 
1463 Return a new Struct object which writes and reads binary data according to
1464 the format string.
1465 
1466 See help(struct) for more on format strings.
1467 [clinic start generated code]*/
1468 
1469 static int
Struct___init___impl(PyStructObject * self,PyObject * format)1470 Struct___init___impl(PyStructObject *self, PyObject *format)
1471 /*[clinic end generated code: output=b8e80862444e92d0 input=192a4575a3dde802]*/
1472 {
1473     int ret = 0;
1474 
1475     if (PyUnicode_Check(format)) {
1476         format = PyUnicode_AsASCIIString(format);
1477         if (format == NULL)
1478             return -1;
1479     }
1480     else {
1481         Py_INCREF(format);
1482     }
1483 
1484     if (!PyBytes_Check(format)) {
1485         Py_DECREF(format);
1486         PyErr_Format(PyExc_TypeError,
1487                      "Struct() argument 1 must be a str or bytes object, "
1488                      "not %.200s",
1489                      _PyType_Name(Py_TYPE(format)));
1490         return -1;
1491     }
1492 
1493     Py_SETREF(self->s_format, format);
1494 
1495     ret = prepare_s(self);
1496     return ret;
1497 }
1498 
1499 static int
s_clear(PyStructObject * s)1500 s_clear(PyStructObject *s)
1501 {
1502     Py_CLEAR(s->s_format);
1503     return 0;
1504 }
1505 
1506 static int
s_traverse(PyStructObject * s,visitproc visit,void * arg)1507 s_traverse(PyStructObject *s, visitproc visit, void *arg)
1508 {
1509     Py_VISIT(Py_TYPE(s));
1510     Py_VISIT(s->s_format);
1511     return 0;
1512 }
1513 
1514 static void
s_dealloc(PyStructObject * s)1515 s_dealloc(PyStructObject *s)
1516 {
1517     PyTypeObject *tp = Py_TYPE(s);
1518     PyObject_GC_UnTrack(s);
1519     if (s->weakreflist != NULL)
1520         PyObject_ClearWeakRefs((PyObject *)s);
1521     if (s->s_codes != NULL) {
1522         PyMem_Free(s->s_codes);
1523     }
1524     Py_XDECREF(s->s_format);
1525     freefunc free_func = PyType_GetSlot(Py_TYPE(s), Py_tp_free);
1526     free_func(s);
1527     Py_DECREF(tp);
1528 }
1529 
1530 static PyObject *
s_unpack_internal(PyStructObject * soself,const char * startfrom,_structmodulestate * state)1531 s_unpack_internal(PyStructObject *soself, const char *startfrom,
1532                   _structmodulestate *state) {
1533     formatcode *code;
1534     Py_ssize_t i = 0;
1535     PyObject *result = PyTuple_New(soself->s_len);
1536     if (result == NULL)
1537         return NULL;
1538 
1539     for (code = soself->s_codes; code->fmtdef != NULL; code++) {
1540         const formatdef *e = code->fmtdef;
1541         const char *res = startfrom + code->offset;
1542         Py_ssize_t j = code->repeat;
1543         while (j--) {
1544             PyObject *v;
1545             if (e->format == 's') {
1546                 v = PyBytes_FromStringAndSize(res, code->size);
1547             } else if (e->format == 'p') {
1548                 Py_ssize_t n = *(unsigned char*)res;
1549                 if (n >= code->size)
1550                     n = code->size - 1;
1551                 v = PyBytes_FromStringAndSize(res + 1, n);
1552             } else {
1553                 v = e->unpack(state, res, e);
1554             }
1555             if (v == NULL)
1556                 goto fail;
1557             PyTuple_SET_ITEM(result, i++, v);
1558             res += code->size;
1559         }
1560     }
1561 
1562     return result;
1563 fail:
1564     Py_DECREF(result);
1565     return NULL;
1566 }
1567 
1568 
1569 /*[clinic input]
1570 Struct.unpack
1571 
1572     buffer: Py_buffer
1573     /
1574 
1575 Return a tuple containing unpacked values.
1576 
1577 Unpack according to the format string Struct.format. The buffer's size
1578 in bytes must be Struct.size.
1579 
1580 See help(struct) for more on format strings.
1581 [clinic start generated code]*/
1582 
1583 static PyObject *
Struct_unpack_impl(PyStructObject * self,Py_buffer * buffer)1584 Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer)
1585 /*[clinic end generated code: output=873a24faf02e848a input=3113f8e7038b2f6c]*/
1586 {
1587     _structmodulestate *state = get_struct_state_structinst(self);
1588     assert(self->s_codes != NULL);
1589     if (buffer->len != self->s_size) {
1590         PyErr_Format(state->StructError,
1591                      "unpack requires a buffer of %zd bytes",
1592                      self->s_size);
1593         return NULL;
1594     }
1595     return s_unpack_internal(self, buffer->buf, state);
1596 }
1597 
1598 /*[clinic input]
1599 Struct.unpack_from
1600 
1601     buffer: Py_buffer
1602     offset: Py_ssize_t = 0
1603 
1604 Return a tuple containing unpacked values.
1605 
1606 Values are unpacked according to the format string Struct.format.
1607 
1608 The buffer's size in bytes, starting at position offset, must be
1609 at least Struct.size.
1610 
1611 See help(struct) for more on format strings.
1612 [clinic start generated code]*/
1613 
1614 static PyObject *
Struct_unpack_from_impl(PyStructObject * self,Py_buffer * buffer,Py_ssize_t offset)1615 Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer,
1616                         Py_ssize_t offset)
1617 /*[clinic end generated code: output=57fac875e0977316 input=cafd4851d473c894]*/
1618 {
1619     _structmodulestate *state = get_struct_state_structinst(self);
1620     assert(self->s_codes != NULL);
1621 
1622     if (offset < 0) {
1623         if (offset + self->s_size > 0) {
1624             PyErr_Format(state->StructError,
1625                          "not enough data to unpack %zd bytes at offset %zd",
1626                          self->s_size,
1627                          offset);
1628             return NULL;
1629         }
1630 
1631         if (offset + buffer->len < 0) {
1632             PyErr_Format(state->StructError,
1633                          "offset %zd out of range for %zd-byte buffer",
1634                          offset,
1635                          buffer->len);
1636             return NULL;
1637         }
1638         offset += buffer->len;
1639     }
1640 
1641     if ((buffer->len - offset) < self->s_size) {
1642         PyErr_Format(state->StructError,
1643                      "unpack_from requires a buffer of at least %zu bytes for "
1644                      "unpacking %zd bytes at offset %zd "
1645                      "(actual buffer size is %zd)",
1646                      (size_t)self->s_size + (size_t)offset,
1647                      self->s_size,
1648                      offset,
1649                      buffer->len);
1650         return NULL;
1651     }
1652     return s_unpack_internal(self, (char*)buffer->buf + offset, state);
1653 }
1654 
1655 
1656 
1657 /* Unpack iterator type */
1658 
1659 typedef struct {
1660     PyObject_HEAD
1661     PyStructObject *so;
1662     Py_buffer buf;
1663     Py_ssize_t index;
1664 } unpackiterobject;
1665 
1666 static void
unpackiter_dealloc(unpackiterobject * self)1667 unpackiter_dealloc(unpackiterobject *self)
1668 {
1669     /* bpo-31095: UnTrack is needed before calling any callbacks */
1670     PyTypeObject *tp = Py_TYPE(self);
1671     PyObject_GC_UnTrack(self);
1672     Py_XDECREF(self->so);
1673     PyBuffer_Release(&self->buf);
1674     PyObject_GC_Del(self);
1675     Py_DECREF(tp);
1676 }
1677 
1678 static int
unpackiter_traverse(unpackiterobject * self,visitproc visit,void * arg)1679 unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg)
1680 {
1681     Py_VISIT(Py_TYPE(self));
1682     Py_VISIT(self->so);
1683     Py_VISIT(self->buf.obj);
1684     return 0;
1685 }
1686 
1687 static PyObject *
unpackiter_len(unpackiterobject * self,PyObject * Py_UNUSED (ignored))1688 unpackiter_len(unpackiterobject *self, PyObject *Py_UNUSED(ignored))
1689 {
1690     Py_ssize_t len;
1691     if (self->so == NULL)
1692         len = 0;
1693     else
1694         len = (self->buf.len - self->index) / self->so->s_size;
1695     return PyLong_FromSsize_t(len);
1696 }
1697 
1698 static PyMethodDef unpackiter_methods[] = {
1699     {"__length_hint__", (PyCFunction) unpackiter_len, METH_NOARGS, NULL},
1700     {NULL,              NULL}           /* sentinel */
1701 };
1702 
1703 static PyObject *
unpackiter_iternext(unpackiterobject * self)1704 unpackiter_iternext(unpackiterobject *self)
1705 {
1706     _structmodulestate *state = get_struct_state_iterinst(self);
1707     PyObject *result;
1708     if (self->so == NULL)
1709         return NULL;
1710     if (self->index >= self->buf.len) {
1711         /* Iterator exhausted */
1712         Py_CLEAR(self->so);
1713         PyBuffer_Release(&self->buf);
1714         return NULL;
1715     }
1716     assert(self->index + self->so->s_size <= self->buf.len);
1717     result = s_unpack_internal(self->so,
1718                                (char*) self->buf.buf + self->index,
1719                                state);
1720     self->index += self->so->s_size;
1721     return result;
1722 }
1723 
unpackiter_new(PyTypeObject * type,PyObject * args,PyObject * kwds)1724 PyObject *unpackiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
1725     PyErr_Format(PyExc_TypeError, "Cannot create '%.200s objects", _PyType_Name(type));
1726     return NULL;
1727 }
1728 
1729 static PyType_Slot unpackiter_type_slots[] = {
1730     {Py_tp_dealloc, unpackiter_dealloc},
1731     {Py_tp_getattro, PyObject_GenericGetAttr},
1732     {Py_tp_traverse, unpackiter_traverse},
1733     {Py_tp_iter, PyObject_SelfIter},
1734     {Py_tp_iternext, unpackiter_iternext},
1735     {Py_tp_methods, unpackiter_methods},
1736     {Py_tp_new, unpackiter_new},
1737     {0, 0},
1738 };
1739 
1740 static PyType_Spec unpackiter_type_spec = {
1741     "_struct.unpack_iterator",
1742     sizeof(unpackiterobject),
1743     0,
1744     (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1745      Py_TPFLAGS_IMMUTABLETYPE),
1746     unpackiter_type_slots
1747 };
1748 
1749 /*[clinic input]
1750 Struct.iter_unpack
1751 
1752     buffer: object
1753     /
1754 
1755 Return an iterator yielding tuples.
1756 
1757 Tuples are unpacked from the given bytes source, like a repeated
1758 invocation of unpack_from().
1759 
1760 Requires that the bytes length be a multiple of the struct size.
1761 [clinic start generated code]*/
1762 
1763 static PyObject *
Struct_iter_unpack(PyStructObject * self,PyObject * buffer)1764 Struct_iter_unpack(PyStructObject *self, PyObject *buffer)
1765 /*[clinic end generated code: output=172d83d0cd15dbab input=6d65b3f3107dbc99]*/
1766 {
1767     _structmodulestate *state = get_struct_state_structinst(self);
1768     unpackiterobject *iter;
1769 
1770     assert(self->s_codes != NULL);
1771 
1772     if (self->s_size == 0) {
1773         PyErr_Format(state->StructError,
1774                      "cannot iteratively unpack with a struct of length 0");
1775         return NULL;
1776     }
1777 
1778     iter = (unpackiterobject *) PyType_GenericAlloc((PyTypeObject *)state->unpackiter_type, 0);
1779     if (iter == NULL)
1780         return NULL;
1781 
1782     if (PyObject_GetBuffer(buffer, &iter->buf, PyBUF_SIMPLE) < 0) {
1783         Py_DECREF(iter);
1784         return NULL;
1785     }
1786     if (iter->buf.len % self->s_size != 0) {
1787         PyErr_Format(state->StructError,
1788                      "iterative unpacking requires a buffer of "
1789                      "a multiple of %zd bytes",
1790                      self->s_size);
1791         Py_DECREF(iter);
1792         return NULL;
1793     }
1794     Py_INCREF(self);
1795     iter->so = self;
1796     iter->index = 0;
1797     return (PyObject *)iter;
1798 }
1799 
1800 
1801 /*
1802  * Guts of the pack function.
1803  *
1804  * Takes a struct object, a tuple of arguments, and offset in that tuple of
1805  * argument for where to start processing the arguments for packing, and a
1806  * character buffer for writing the packed string.  The caller must insure
1807  * that the buffer may contain the required length for packing the arguments.
1808  * 0 is returned on success, 1 is returned if there is an error.
1809  *
1810  */
1811 static int
s_pack_internal(PyStructObject * soself,PyObject * const * args,int offset,char * buf,_structmodulestate * state)1812 s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset,
1813                 char* buf, _structmodulestate *state)
1814 {
1815     formatcode *code;
1816     /* XXX(nnorwitz): why does i need to be a local?  can we use
1817        the offset parameter or do we need the wider width? */
1818     Py_ssize_t i;
1819 
1820     memset(buf, '\0', soself->s_size);
1821     i = offset;
1822     for (code = soself->s_codes; code->fmtdef != NULL; code++) {
1823         const formatdef *e = code->fmtdef;
1824         char *res = buf + code->offset;
1825         Py_ssize_t j = code->repeat;
1826         while (j--) {
1827             PyObject *v = args[i++];
1828             if (e->format == 's') {
1829                 Py_ssize_t n;
1830                 int isstring;
1831                 const void *p;
1832                 isstring = PyBytes_Check(v);
1833                 if (!isstring && !PyByteArray_Check(v)) {
1834                     PyErr_SetString(state->StructError,
1835                                     "argument for 's' must be a bytes object");
1836                     return -1;
1837                 }
1838                 if (isstring) {
1839                     n = PyBytes_GET_SIZE(v);
1840                     p = PyBytes_AS_STRING(v);
1841                 }
1842                 else {
1843                     n = PyByteArray_GET_SIZE(v);
1844                     p = PyByteArray_AS_STRING(v);
1845                 }
1846                 if (n > code->size)
1847                     n = code->size;
1848                 if (n > 0)
1849                     memcpy(res, p, n);
1850             } else if (e->format == 'p') {
1851                 Py_ssize_t n;
1852                 int isstring;
1853                 const void *p;
1854                 isstring = PyBytes_Check(v);
1855                 if (!isstring && !PyByteArray_Check(v)) {
1856                     PyErr_SetString(state->StructError,
1857                                     "argument for 'p' must be a bytes object");
1858                     return -1;
1859                 }
1860                 if (isstring) {
1861                     n = PyBytes_GET_SIZE(v);
1862                     p = PyBytes_AS_STRING(v);
1863                 }
1864                 else {
1865                     n = PyByteArray_GET_SIZE(v);
1866                     p = PyByteArray_AS_STRING(v);
1867                 }
1868                 if (n > (code->size - 1))
1869                     n = code->size - 1;
1870                 if (n > 0)
1871                     memcpy(res + 1, p, n);
1872                 if (n > 255)
1873                     n = 255;
1874                 *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
1875             } else {
1876                 if (e->pack(state, res, v, e) < 0) {
1877                     if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError))
1878                         PyErr_SetString(state->StructError,
1879                                         "int too large to convert");
1880                     return -1;
1881                 }
1882             }
1883             res += code->size;
1884         }
1885     }
1886 
1887     /* Success */
1888     return 0;
1889 }
1890 
1891 
1892 PyDoc_STRVAR(s_pack__doc__,
1893 "S.pack(v1, v2, ...) -> bytes\n\
1894 \n\
1895 Return a bytes object containing values v1, v2, ... packed according\n\
1896 to the format string S.format.  See help(struct) for more on format\n\
1897 strings.");
1898 
1899 static PyObject *
s_pack(PyObject * self,PyObject * const * args,Py_ssize_t nargs)1900 s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
1901 {
1902     char *buf;
1903     PyStructObject *soself;
1904     _structmodulestate *state = get_struct_state_structinst(self);
1905 
1906     /* Validate arguments. */
1907     soself = (PyStructObject *)self;
1908     assert(PyStruct_Check(self, state));
1909     assert(soself->s_codes != NULL);
1910     if (nargs != soself->s_len)
1911     {
1912         PyErr_Format(state->StructError,
1913             "pack expected %zd items for packing (got %zd)", soself->s_len, nargs);
1914         return NULL;
1915     }
1916 
1917     /* Allocate a new string */
1918     _PyBytesWriter writer;
1919     _PyBytesWriter_Init(&writer);
1920     buf = _PyBytesWriter_Alloc(&writer, soself->s_size);
1921     if (buf == NULL) {
1922         _PyBytesWriter_Dealloc(&writer);
1923         return NULL;
1924     }
1925 
1926     /* Call the guts */
1927     if ( s_pack_internal(soself, args, 0, buf, state) != 0 ) {
1928         _PyBytesWriter_Dealloc(&writer);
1929         return NULL;
1930     }
1931 
1932     return _PyBytesWriter_Finish(&writer, buf + soself->s_size);
1933 }
1934 
1935 PyDoc_STRVAR(s_pack_into__doc__,
1936 "S.pack_into(buffer, offset, v1, v2, ...)\n\
1937 \n\
1938 Pack the values v1, v2, ... according to the format string S.format\n\
1939 and write the packed bytes into the writable buffer buf starting at\n\
1940 offset.  Note that the offset is a required argument.  See\n\
1941 help(struct) for more on format strings.");
1942 
1943 static PyObject *
s_pack_into(PyObject * self,PyObject * const * args,Py_ssize_t nargs)1944 s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
1945 {
1946     PyStructObject *soself;
1947     Py_buffer buffer;
1948     Py_ssize_t offset;
1949     _structmodulestate *state = get_struct_state_structinst(self);
1950 
1951     /* Validate arguments.  +1 is for the first arg as buffer. */
1952     soself = (PyStructObject *)self;
1953     assert(PyStruct_Check(self, state));
1954     assert(soself->s_codes != NULL);
1955     if (nargs != (soself->s_len + 2))
1956     {
1957         if (nargs == 0) {
1958             PyErr_Format(state->StructError,
1959                         "pack_into expected buffer argument");
1960         }
1961         else if (nargs == 1) {
1962             PyErr_Format(state->StructError,
1963                         "pack_into expected offset argument");
1964         }
1965         else {
1966             PyErr_Format(state->StructError,
1967                         "pack_into expected %zd items for packing (got %zd)",
1968                         soself->s_len, (nargs - 2));
1969         }
1970         return NULL;
1971     }
1972 
1973     /* Extract a writable memory buffer from the first argument */
1974     if (!PyArg_Parse(args[0], "w*", &buffer))
1975         return NULL;
1976     assert(buffer.len >= 0);
1977 
1978     /* Extract the offset from the first argument */
1979     offset = PyNumber_AsSsize_t(args[1], PyExc_IndexError);
1980     if (offset == -1 && PyErr_Occurred()) {
1981         PyBuffer_Release(&buffer);
1982         return NULL;
1983     }
1984 
1985     /* Support negative offsets. */
1986     if (offset < 0) {
1987          /* Check that negative offset is low enough to fit data */
1988         if (offset + soself->s_size > 0) {
1989             PyErr_Format(state->StructError,
1990                          "no space to pack %zd bytes at offset %zd",
1991                          soself->s_size,
1992                          offset);
1993             PyBuffer_Release(&buffer);
1994             return NULL;
1995         }
1996 
1997         /* Check that negative offset is not crossing buffer boundary */
1998         if (offset + buffer.len < 0) {
1999             PyErr_Format(state->StructError,
2000                          "offset %zd out of range for %zd-byte buffer",
2001                          offset,
2002                          buffer.len);
2003             PyBuffer_Release(&buffer);
2004             return NULL;
2005         }
2006 
2007         offset += buffer.len;
2008     }
2009 
2010     /* Check boundaries */
2011     if ((buffer.len - offset) < soself->s_size) {
2012         assert(offset >= 0);
2013         assert(soself->s_size >= 0);
2014 
2015         PyErr_Format(state->StructError,
2016                      "pack_into requires a buffer of at least %zu bytes for "
2017                      "packing %zd bytes at offset %zd "
2018                      "(actual buffer size is %zd)",
2019                      (size_t)soself->s_size + (size_t)offset,
2020                      soself->s_size,
2021                      offset,
2022                      buffer.len);
2023         PyBuffer_Release(&buffer);
2024         return NULL;
2025     }
2026 
2027     /* Call the guts */
2028     if (s_pack_internal(soself, args, 2, (char*)buffer.buf + offset, state) != 0) {
2029         PyBuffer_Release(&buffer);
2030         return NULL;
2031     }
2032 
2033     PyBuffer_Release(&buffer);
2034     Py_RETURN_NONE;
2035 }
2036 
2037 static PyObject *
s_get_format(PyStructObject * self,void * unused)2038 s_get_format(PyStructObject *self, void *unused)
2039 {
2040     return PyUnicode_FromStringAndSize(PyBytes_AS_STRING(self->s_format),
2041                                        PyBytes_GET_SIZE(self->s_format));
2042 }
2043 
2044 static PyObject *
s_get_size(PyStructObject * self,void * unused)2045 s_get_size(PyStructObject *self, void *unused)
2046 {
2047     return PyLong_FromSsize_t(self->s_size);
2048 }
2049 
2050 PyDoc_STRVAR(s_sizeof__doc__,
2051 "S.__sizeof__() -> size of S in memory, in bytes");
2052 
2053 static PyObject *
s_sizeof(PyStructObject * self,void * unused)2054 s_sizeof(PyStructObject *self, void *unused)
2055 {
2056     Py_ssize_t size;
2057     formatcode *code;
2058 
2059     size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);
2060     for (code = self->s_codes; code->fmtdef != NULL; code++)
2061         size += sizeof(formatcode);
2062     return PyLong_FromSsize_t(size);
2063 }
2064 
2065 /* List of functions */
2066 
2067 static struct PyMethodDef s_methods[] = {
2068     STRUCT_ITER_UNPACK_METHODDEF
2069     {"pack",            _PyCFunction_CAST(s_pack), METH_FASTCALL, s_pack__doc__},
2070     {"pack_into",       _PyCFunction_CAST(s_pack_into), METH_FASTCALL, s_pack_into__doc__},
2071     STRUCT_UNPACK_METHODDEF
2072     STRUCT_UNPACK_FROM_METHODDEF
2073     {"__sizeof__",      (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__},
2074     {NULL,       NULL}          /* sentinel */
2075 };
2076 
2077 static PyMemberDef s_members[] = {
2078     {"__weaklistoffset__", T_PYSSIZET, offsetof(PyStructObject, weakreflist), READONLY},
2079     {NULL}  /* sentinel */
2080 };
2081 
2082 static PyGetSetDef s_getsetlist[] = {
2083     {"format", (getter)s_get_format, (setter)NULL, "struct format string", NULL},
2084     {"size", (getter)s_get_size, (setter)NULL, "struct size in bytes", NULL},
2085     {NULL} /* sentinel */
2086 };
2087 
2088 PyDoc_STRVAR(s__doc__,
2089 "Struct(fmt) --> compiled struct object\n"
2090 "\n"
2091 );
2092 
2093 static PyType_Slot PyStructType_slots[] = {
2094     {Py_tp_dealloc, s_dealloc},
2095     {Py_tp_getattro, PyObject_GenericGetAttr},
2096     {Py_tp_setattro, PyObject_GenericSetAttr},
2097     {Py_tp_doc, (void*)s__doc__},
2098     {Py_tp_traverse, s_traverse},
2099     {Py_tp_clear, s_clear},
2100     {Py_tp_methods, s_methods},
2101     {Py_tp_members, s_members},
2102     {Py_tp_getset, s_getsetlist},
2103     {Py_tp_init, Struct___init__},
2104     {Py_tp_alloc, PyType_GenericAlloc},
2105     {Py_tp_new, s_new},
2106     {Py_tp_free, PyObject_GC_Del},
2107     {0, 0},
2108 };
2109 
2110 static PyType_Spec PyStructType_spec = {
2111     "_struct.Struct",
2112     sizeof(PyStructObject),
2113     0,
2114     (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2115      Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE),
2116     PyStructType_slots
2117 };
2118 
2119 
2120 /* ---- Standalone functions  ---- */
2121 
2122 #define MAXCACHE 100
2123 
2124 static int
cache_struct_converter(PyObject * module,PyObject * fmt,PyStructObject ** ptr)2125 cache_struct_converter(PyObject *module, PyObject *fmt, PyStructObject **ptr)
2126 {
2127     PyObject * s_object;
2128     _structmodulestate *state = get_struct_state(module);
2129 
2130     if (fmt == NULL) {
2131         Py_DECREF(*ptr);
2132         *ptr = NULL;
2133         return 1;
2134     }
2135 
2136     if (state->cache == NULL) {
2137         state->cache = PyDict_New();
2138         if (state->cache == NULL)
2139             return 0;
2140     }
2141 
2142     s_object = PyDict_GetItemWithError(state->cache, fmt);
2143     if (s_object != NULL) {
2144         Py_INCREF(s_object);
2145         *ptr = (PyStructObject *)s_object;
2146         return Py_CLEANUP_SUPPORTED;
2147     }
2148     else if (PyErr_Occurred()) {
2149         return 0;
2150     }
2151 
2152     s_object = PyObject_CallOneArg(state->PyStructType, fmt);
2153     if (s_object != NULL) {
2154         if (PyDict_GET_SIZE(state->cache) >= MAXCACHE)
2155             PyDict_Clear(state->cache);
2156         /* Attempt to cache the result */
2157         if (PyDict_SetItem(state->cache, fmt, s_object) == -1)
2158             PyErr_Clear();
2159         *ptr = (PyStructObject *)s_object;
2160         return Py_CLEANUP_SUPPORTED;
2161     }
2162     return 0;
2163 }
2164 
2165 /*[clinic input]
2166 _clearcache
2167 
2168 Clear the internal cache.
2169 [clinic start generated code]*/
2170 
2171 static PyObject *
_clearcache_impl(PyObject * module)2172 _clearcache_impl(PyObject *module)
2173 /*[clinic end generated code: output=ce4fb8a7bf7cb523 input=463eaae04bab3211]*/
2174 {
2175     Py_CLEAR(get_struct_state(module)->cache);
2176     Py_RETURN_NONE;
2177 }
2178 
2179 
2180 /*[clinic input]
2181 calcsize -> Py_ssize_t
2182 
2183     format as s_object: cache_struct
2184     /
2185 
2186 Return size in bytes of the struct described by the format string.
2187 [clinic start generated code]*/
2188 
2189 static Py_ssize_t
calcsize_impl(PyObject * module,PyStructObject * s_object)2190 calcsize_impl(PyObject *module, PyStructObject *s_object)
2191 /*[clinic end generated code: output=db7d23d09c6932c4 input=96a6a590c7717ecd]*/
2192 {
2193     return s_object->s_size;
2194 }
2195 
2196 PyDoc_STRVAR(pack_doc,
2197 "pack(format, v1, v2, ...) -> bytes\n\
2198 \n\
2199 Return a bytes object containing the values v1, v2, ... packed according\n\
2200 to the format string.  See help(struct) for more on format strings.");
2201 
2202 static PyObject *
pack(PyObject * module,PyObject * const * args,Py_ssize_t nargs)2203 pack(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
2204 {
2205     PyObject *s_object = NULL;
2206     PyObject *format, *result;
2207 
2208     if (nargs == 0) {
2209         PyErr_SetString(PyExc_TypeError, "missing format argument");
2210         return NULL;
2211     }
2212     format = args[0];
2213 
2214     if (!cache_struct_converter(module, format, (PyStructObject **)&s_object)) {
2215         return NULL;
2216     }
2217     result = s_pack(s_object, args + 1, nargs - 1);
2218     Py_DECREF(s_object);
2219     return result;
2220 }
2221 
2222 PyDoc_STRVAR(pack_into_doc,
2223 "pack_into(format, buffer, offset, v1, v2, ...)\n\
2224 \n\
2225 Pack the values v1, v2, ... according to the format string and write\n\
2226 the packed bytes into the writable buffer buf starting at offset.  Note\n\
2227 that the offset is a required argument.  See help(struct) for more\n\
2228 on format strings.");
2229 
2230 static PyObject *
pack_into(PyObject * module,PyObject * const * args,Py_ssize_t nargs)2231 pack_into(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
2232 {
2233     PyObject *s_object = NULL;
2234     PyObject *format, *result;
2235 
2236     if (nargs == 0) {
2237         PyErr_SetString(PyExc_TypeError, "missing format argument");
2238         return NULL;
2239     }
2240     format = args[0];
2241 
2242     if (!cache_struct_converter(module, format, (PyStructObject **)&s_object)) {
2243         return NULL;
2244     }
2245     result = s_pack_into(s_object, args + 1, nargs - 1);
2246     Py_DECREF(s_object);
2247     return result;
2248 }
2249 
2250 /*[clinic input]
2251 unpack
2252 
2253     format as s_object: cache_struct
2254     buffer: Py_buffer
2255     /
2256 
2257 Return a tuple containing values unpacked according to the format string.
2258 
2259 The buffer's size in bytes must be calcsize(format).
2260 
2261 See help(struct) for more on format strings.
2262 [clinic start generated code]*/
2263 
2264 static PyObject *
unpack_impl(PyObject * module,PyStructObject * s_object,Py_buffer * buffer)2265 unpack_impl(PyObject *module, PyStructObject *s_object, Py_buffer *buffer)
2266 /*[clinic end generated code: output=48ddd4d88eca8551 input=05fa3b91678da727]*/
2267 {
2268     return Struct_unpack_impl(s_object, buffer);
2269 }
2270 
2271 /*[clinic input]
2272 unpack_from
2273 
2274     format as s_object: cache_struct
2275     /
2276     buffer: Py_buffer
2277     offset: Py_ssize_t = 0
2278 
2279 Return a tuple containing values unpacked according to the format string.
2280 
2281 The buffer's size, minus offset, must be at least calcsize(format).
2282 
2283 See help(struct) for more on format strings.
2284 [clinic start generated code]*/
2285 
2286 static PyObject *
unpack_from_impl(PyObject * module,PyStructObject * s_object,Py_buffer * buffer,Py_ssize_t offset)2287 unpack_from_impl(PyObject *module, PyStructObject *s_object,
2288                  Py_buffer *buffer, Py_ssize_t offset)
2289 /*[clinic end generated code: output=1042631674c6e0d3 input=6e80a5398e985025]*/
2290 {
2291     return Struct_unpack_from_impl(s_object, buffer, offset);
2292 }
2293 
2294 /*[clinic input]
2295 iter_unpack
2296 
2297     format as s_object: cache_struct
2298     buffer: object
2299     /
2300 
2301 Return an iterator yielding tuples unpacked from the given bytes.
2302 
2303 The bytes are unpacked according to the format string, like
2304 a repeated invocation of unpack_from().
2305 
2306 Requires that the bytes length be a multiple of the format struct size.
2307 [clinic start generated code]*/
2308 
2309 static PyObject *
iter_unpack_impl(PyObject * module,PyStructObject * s_object,PyObject * buffer)2310 iter_unpack_impl(PyObject *module, PyStructObject *s_object,
2311                  PyObject *buffer)
2312 /*[clinic end generated code: output=0ae50e250d20e74d input=b214a58869a3c98d]*/
2313 {
2314     return Struct_iter_unpack(s_object, buffer);
2315 }
2316 
2317 static struct PyMethodDef module_functions[] = {
2318     _CLEARCACHE_METHODDEF
2319     CALCSIZE_METHODDEF
2320     ITER_UNPACK_METHODDEF
2321     {"pack",            _PyCFunction_CAST(pack), METH_FASTCALL,   pack_doc},
2322     {"pack_into",       _PyCFunction_CAST(pack_into), METH_FASTCALL,   pack_into_doc},
2323     UNPACK_METHODDEF
2324     UNPACK_FROM_METHODDEF
2325     {NULL,       NULL}          /* sentinel */
2326 };
2327 
2328 
2329 /* Module initialization */
2330 
2331 PyDoc_STRVAR(module_doc,
2332 "Functions to convert between Python values and C structs.\n\
2333 Python bytes objects are used to hold the data representing the C struct\n\
2334 and also as format strings (explained below) to describe the layout of data\n\
2335 in the C struct.\n\
2336 \n\
2337 The optional first format char indicates byte order, size and alignment:\n\
2338   @: native order, size & alignment (default)\n\
2339   =: native order, std. size & alignment\n\
2340   <: little-endian, std. size & alignment\n\
2341   >: big-endian, std. size & alignment\n\
2342   !: same as >\n\
2343 \n\
2344 The remaining chars indicate types of args and must match exactly;\n\
2345 these can be preceded by a decimal repeat count:\n\
2346   x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\
2347   ?: _Bool (requires C99; if not available, char is used instead)\n\
2348   h:short; H:unsigned short; i:int; I:unsigned int;\n\
2349   l:long; L:unsigned long; f:float; d:double; e:half-float.\n\
2350 Special cases (preceding decimal count indicates length):\n\
2351   s:string (array of char); p: pascal string (with count byte).\n\
2352 Special cases (only available in native format):\n\
2353   n:ssize_t; N:size_t;\n\
2354   P:an integer type that is wide enough to hold a pointer.\n\
2355 Special case (not in native mode unless 'long long' in platform C):\n\
2356   q:long long; Q:unsigned long long\n\
2357 Whitespace between formats is ignored.\n\
2358 \n\
2359 The variable struct.error is an exception raised on errors.\n");
2360 
2361 
2362 static int
_structmodule_traverse(PyObject * module,visitproc visit,void * arg)2363 _structmodule_traverse(PyObject *module, visitproc visit, void *arg)
2364 {
2365     _structmodulestate *state = get_struct_state(module);
2366     if (state) {
2367         Py_VISIT(state->cache);
2368         Py_VISIT(state->PyStructType);
2369         Py_VISIT(state->unpackiter_type);
2370         Py_VISIT(state->StructError);
2371     }
2372     return 0;
2373 }
2374 
2375 static int
_structmodule_clear(PyObject * module)2376 _structmodule_clear(PyObject *module)
2377 {
2378     _structmodulestate *state = get_struct_state(module);
2379     if (state) {
2380         Py_CLEAR(state->cache);
2381         Py_CLEAR(state->PyStructType);
2382         Py_CLEAR(state->unpackiter_type);
2383         Py_CLEAR(state->StructError);
2384     }
2385     return 0;
2386 }
2387 
2388 static void
_structmodule_free(void * module)2389 _structmodule_free(void *module)
2390 {
2391     _structmodule_clear((PyObject *)module);
2392 }
2393 
2394 static int
_structmodule_exec(PyObject * m)2395 _structmodule_exec(PyObject *m)
2396 {
2397     _structmodulestate *state = get_struct_state(m);
2398 
2399     state->PyStructType = PyType_FromModuleAndSpec(
2400         m, &PyStructType_spec, NULL);
2401     if (state->PyStructType == NULL) {
2402         return -1;
2403     }
2404     if (PyModule_AddType(m, (PyTypeObject *)state->PyStructType) < 0) {
2405         return -1;
2406     }
2407 
2408     state->unpackiter_type = PyType_FromModuleAndSpec(
2409         m, &unpackiter_type_spec, NULL);
2410     if (state->unpackiter_type == NULL) {
2411         return -1;
2412     }
2413 
2414     /* Check endian and swap in faster functions */
2415     {
2416         const formatdef *native = native_table;
2417         formatdef *other, *ptr;
2418 #if PY_LITTLE_ENDIAN
2419         other = lilendian_table;
2420 #else
2421         other = bigendian_table;
2422 #endif
2423         /* Scan through the native table, find a matching
2424            entry in the endian table and swap in the
2425            native implementations whenever possible
2426            (64-bit platforms may not have "standard" sizes) */
2427         while (native->format != '\0' && other->format != '\0') {
2428             ptr = other;
2429             while (ptr->format != '\0') {
2430                 if (ptr->format == native->format) {
2431                     /* Match faster when formats are
2432                        listed in the same order */
2433                     if (ptr == other)
2434                         other++;
2435                     /* Only use the trick if the
2436                        size matches */
2437                     if (ptr->size != native->size)
2438                         break;
2439                     /* Skip float and double, could be
2440                        "unknown" float format */
2441                     if (ptr->format == 'd' || ptr->format == 'f')
2442                         break;
2443                     /* Skip _Bool, semantics are different for standard size */
2444                     if (ptr->format == '?')
2445                         break;
2446                     ptr->pack = native->pack;
2447                     ptr->unpack = native->unpack;
2448                     break;
2449                 }
2450                 ptr++;
2451             }
2452             native++;
2453         }
2454     }
2455 
2456     /* Add some symbolic constants to the module */
2457     state->StructError = PyErr_NewException("struct.error", NULL, NULL);
2458     if (state->StructError == NULL) {
2459         return -1;
2460     }
2461     if (PyModule_AddObjectRef(m, "error", state->StructError) < 0) {
2462         return -1;
2463     }
2464 
2465     return 0;
2466 }
2467 
2468 static PyModuleDef_Slot _structmodule_slots[] = {
2469     {Py_mod_exec, _structmodule_exec},
2470     {0, NULL}
2471 };
2472 
2473 static struct PyModuleDef _structmodule = {
2474     PyModuleDef_HEAD_INIT,
2475     .m_name = "_struct",
2476     .m_doc = module_doc,
2477     .m_size = sizeof(_structmodulestate),
2478     .m_methods = module_functions,
2479     .m_slots = _structmodule_slots,
2480     .m_traverse = _structmodule_traverse,
2481     .m_clear = _structmodule_clear,
2482     .m_free = _structmodule_free,
2483 };
2484 
2485 PyMODINIT_FUNC
PyInit__struct(void)2486 PyInit__struct(void)
2487 {
2488     return PyModuleDef_Init(&_structmodule);
2489 }
2490