61
61
#include "zlib.h"
62
62
#endif
63
63
64
- static PyObject * Error ;
65
- static PyObject * Incomplete ;
64
+ typedef struct binascii_state {
65
+ PyObject * Error ;
66
+ PyObject * Incomplete ;
67
+ } binascii_state ;
66
68
67
69
/*
68
70
** hqx lookup table, ascii->binary.
@@ -263,6 +265,7 @@ binascii_a2b_uu_impl(PyObject *module, Py_buffer *data)
263
265
unsigned int leftchar = 0 ;
264
266
PyObject * rv ;
265
267
Py_ssize_t ascii_len , bin_len ;
268
+ binascii_state * state ;
266
269
267
270
ascii_data = data -> buf ;
268
271
ascii_len = data -> len ;
@@ -294,7 +297,11 @@ binascii_a2b_uu_impl(PyObject *module, Py_buffer *data)
294
297
** '`' as zero instead of space.
295
298
*/
296
299
if ( this_ch < ' ' || this_ch > (' ' + 64 )) {
297
- PyErr_SetString (Error , "Illegal char" );
300
+ state = PyModule_GetState (module );
301
+ if (state == NULL ) {
302
+ return NULL ;
303
+ }
304
+ PyErr_SetString (state -> Error , "Illegal char" );
298
305
Py_DECREF (rv );
299
306
return NULL ;
300
307
}
@@ -322,7 +329,11 @@ binascii_a2b_uu_impl(PyObject *module, Py_buffer *data)
322
329
/* Extra '`' may be written as padding in some cases */
323
330
if ( this_ch != ' ' && this_ch != ' ' + 64 &&
324
331
this_ch != '\n' && this_ch != '\r' ) {
325
- PyErr_SetString (Error , "Trailing garbage" );
332
+ state = PyModule_GetState (module );
333
+ if (state == NULL ) {
334
+ return NULL ;
335
+ }
336
+ PyErr_SetString (state -> Error , "Trailing garbage" );
326
337
Py_DECREF (rv );
327
338
return NULL ;
328
339
}
@@ -350,6 +361,7 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick)
350
361
int leftbits = 0 ;
351
362
unsigned char this_ch ;
352
363
unsigned int leftchar = 0 ;
364
+ binascii_state * state ;
353
365
Py_ssize_t bin_len , out_len ;
354
366
_PyBytesWriter writer ;
355
367
@@ -358,7 +370,11 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick)
358
370
bin_len = data -> len ;
359
371
if ( bin_len > 45 ) {
360
372
/* The 45 is a limit that appears in all uuencode's */
361
- PyErr_SetString (Error , "At most 45 bytes at once" );
373
+ state = PyModule_GetState (module );
374
+ if (state == NULL ) {
375
+ return NULL ;
376
+ }
377
+ PyErr_SetString (state -> Error , "At most 45 bytes at once" );
362
378
return NULL ;
363
379
}
364
380
@@ -445,6 +461,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data)
445
461
Py_ssize_t ascii_len , bin_len ;
446
462
int quad_pos = 0 ;
447
463
_PyBytesWriter writer ;
464
+ binascii_state * state ;
448
465
449
466
ascii_data = data -> buf ;
450
467
ascii_len = data -> len ;
@@ -512,19 +529,23 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data)
512
529
}
513
530
514
531
if (leftbits != 0 ) {
532
+ state = PyModule_GetState (module );
533
+ if (state == NULL ) {
534
+ return NULL ;
535
+ }
515
536
if (leftbits == 6 ) {
516
537
/*
517
538
** There is exactly one extra valid, non-padding, base64 character.
518
539
** This is an invalid length, as there is no possible input that
519
540
** could encoded into such a base64 string.
520
541
*/
521
- PyErr_Format (Error ,
542
+ PyErr_Format (state -> Error ,
522
543
"Invalid base64-encoded string: "
523
544
"number of data characters (%zd) cannot be 1 more "
524
545
"than a multiple of 4" ,
525
546
(bin_data - bin_data_start ) / 3 * 4 + 1 );
526
547
} else {
527
- PyErr_SetString (Error , "Incorrect padding" );
548
+ PyErr_SetString (state -> Error , "Incorrect padding" );
528
549
}
529
550
_PyBytesWriter_Dealloc (& writer );
530
551
return NULL ;
@@ -556,6 +577,7 @@ binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, int newline)
556
577
unsigned int leftchar = 0 ;
557
578
Py_ssize_t bin_len , out_len ;
558
579
_PyBytesWriter writer ;
580
+ binascii_state * state ;
559
581
560
582
bin_data = data -> buf ;
561
583
bin_len = data -> len ;
@@ -564,7 +586,11 @@ binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, int newline)
564
586
assert (bin_len >= 0 );
565
587
566
588
if ( bin_len > BASE64_MAXBIN ) {
567
- PyErr_SetString (Error , "Too much data for base64 line" );
589
+ state = PyModule_GetState (module );
590
+ if (state == NULL ) {
591
+ return NULL ;
592
+ }
593
+ PyErr_SetString (state -> Error , "Too much data for base64 line" );
568
594
return NULL ;
569
595
}
570
596
@@ -626,6 +652,7 @@ binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data)
626
652
Py_ssize_t len ;
627
653
int done = 0 ;
628
654
_PyBytesWriter writer ;
655
+ binascii_state * state ;
629
656
630
657
ascii_data = data -> buf ;
631
658
len = data -> len ;
@@ -649,7 +676,11 @@ binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data)
649
676
if ( this_ch == SKIP )
650
677
continue ;
651
678
if ( this_ch == FAIL ) {
652
- PyErr_SetString (Error , "Illegal char" );
679
+ state = PyModule_GetState (module );
680
+ if (state == NULL ) {
681
+ return NULL ;
682
+ }
683
+ PyErr_SetString (state -> Error , "Illegal char" );
653
684
_PyBytesWriter_Dealloc (& writer );
654
685
return NULL ;
655
686
}
@@ -670,7 +701,11 @@ binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data)
670
701
}
671
702
672
703
if ( leftbits && !done ) {
673
- PyErr_SetString (Incomplete ,
704
+ state = PyModule_GetState (module );
705
+ if (state == NULL ) {
706
+ return NULL ;
707
+ }
708
+ PyErr_SetString (state -> Incomplete ,
674
709
"String has incomplete number of bytes" );
675
710
_PyBytesWriter_Dealloc (& writer );
676
711
return NULL ;
@@ -822,6 +857,7 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data)
822
857
in_data = data -> buf ;
823
858
in_len = data -> len ;
824
859
_PyBytesWriter_Init (& writer );
860
+ binascii_state * state ;
825
861
826
862
assert (in_len >= 0 );
827
863
@@ -846,7 +882,11 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data)
846
882
#define INBYTE (b ) \
847
883
do { \
848
884
if ( --in_len < 0 ) { \
849
- PyErr_SetString(Incomplete, ""); \
885
+ state = PyModule_GetState(module); \
886
+ if (state == NULL) { \
887
+ return NULL; \
888
+ } \
889
+ PyErr_SetString(state->Incomplete, ""); \
850
890
goto error; \
851
891
} \
852
892
b = *in_data++; \
@@ -868,7 +908,11 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data)
868
908
/* Note Error, not Incomplete (which is at the end
869
909
** of the string only). This is a programmer error.
870
910
*/
871
- PyErr_SetString (Error , "Orphaned RLE code at start" );
911
+ state = PyModule_GetState (module );
912
+ if (state == NULL ) {
913
+ return NULL ;
914
+ }
915
+ PyErr_SetString (state -> Error , "Orphaned RLE code at start" );
872
916
goto error ;
873
917
}
874
918
* out_data ++ = RUNCHAR ;
@@ -1166,6 +1210,7 @@ binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr)
1166
1210
PyObject * retval ;
1167
1211
char * retbuf ;
1168
1212
Py_ssize_t i , j ;
1213
+ binascii_state * state ;
1169
1214
1170
1215
argbuf = hexstr -> buf ;
1171
1216
arglen = hexstr -> len ;
@@ -1177,7 +1222,11 @@ binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr)
1177
1222
* raise an exception.
1178
1223
*/
1179
1224
if (arglen % 2 ) {
1180
- PyErr_SetString (Error , "Odd-length string" );
1225
+ state = PyModule_GetState (module );
1226
+ if (state == NULL ) {
1227
+ return NULL ;
1228
+ }
1229
+ PyErr_SetString (state -> Error , "Odd-length string" );
1181
1230
return NULL ;
1182
1231
}
1183
1232
@@ -1190,7 +1239,11 @@ binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr)
1190
1239
unsigned int top = _PyLong_DigitValue [Py_CHARMASK (argbuf [i ])];
1191
1240
unsigned int bot = _PyLong_DigitValue [Py_CHARMASK (argbuf [i + 1 ])];
1192
1241
if (top >= 16 || bot >= 16 ) {
1193
- PyErr_SetString (Error ,
1242
+ state = PyModule_GetState (module );
1243
+ if (state == NULL ) {
1244
+ return NULL ;
1245
+ }
1246
+ PyErr_SetString (state -> Error ,
1194
1247
"Non-hexadecimal digit found" );
1195
1248
goto finally ;
1196
1249
}
@@ -1545,14 +1598,47 @@ static struct PyMethodDef binascii_module_methods[] = {
1545
1598
/* Initialization function for the module (*must* be called PyInit_binascii) */
1546
1599
PyDoc_STRVAR (doc_binascii , "Conversion between binary data and ASCII" );
1547
1600
1601
+ static int
1602
+ binascii_exec (PyObject * m ) {
1603
+ int result ;
1604
+ binascii_state * state = PyModule_GetState (m );
1605
+ if (state == NULL ) {
1606
+ return -1 ;
1607
+ }
1608
+
1609
+ state -> Error = PyErr_NewException ("binascii.Error" , PyExc_ValueError , NULL );
1610
+ if (state -> Error == NULL ) {
1611
+ return -1 ;
1612
+ }
1613
+ result = PyModule_AddObject (m , "Error" , state -> Error );
1614
+ if (result == -1 ) {
1615
+ return -1 ;
1616
+ }
1617
+
1618
+ state -> Incomplete = PyErr_NewException ("binascii.Incomplete" , NULL , NULL );
1619
+ if (state -> Incomplete == NULL ) {
1620
+ return -1 ;
1621
+ }
1622
+ result = PyModule_AddObject (m , "Incomplete" , state -> Incomplete );
1623
+ if (result == -1 ) {
1624
+ return -1 ;
1625
+ }
1626
+
1627
+ return 0 ;
1628
+ }
1629
+
1630
+ static PyModuleDef_Slot binascii_slots [] = {
1631
+ {Py_mod_exec , binascii_exec },
1632
+ {0 , NULL }
1633
+ };
1548
1634
1549
1635
static struct PyModuleDef binasciimodule = {
1550
1636
PyModuleDef_HEAD_INIT ,
1551
1637
"binascii" ,
1552
1638
doc_binascii ,
1553
- -1 ,
1639
+ sizeof ( binascii_state ) ,
1554
1640
binascii_module_methods ,
1555
- NULL ,
1641
+ binascii_slots ,
1556
1642
NULL ,
1557
1643
NULL ,
1558
1644
NULL
@@ -1561,22 +1647,5 @@ static struct PyModuleDef binasciimodule = {
1561
1647
PyMODINIT_FUNC
1562
1648
PyInit_binascii (void )
1563
1649
{
1564
- PyObject * m , * d ;
1565
-
1566
- /* Create the module and add the functions */
1567
- m = PyModule_Create (& binasciimodule );
1568
- if (m == NULL )
1569
- return NULL ;
1570
-
1571
- d = PyModule_GetDict (m );
1572
-
1573
- Error = PyErr_NewException ("binascii.Error" , PyExc_ValueError , NULL );
1574
- PyDict_SetItemString (d , "Error" , Error );
1575
- Incomplete = PyErr_NewException ("binascii.Incomplete" , NULL , NULL );
1576
- PyDict_SetItemString (d , "Incomplete" , Incomplete );
1577
- if (PyErr_Occurred ()) {
1578
- Py_DECREF (m );
1579
- m = NULL ;
1580
- }
1581
- return m ;
1650
+ return PyModuleDef_Init (& binasciimodule );
1582
1651
}
0 commit comments