@@ -295,6 +295,11 @@ inline bool _read_length(ReaderT *reader, int32_t *length)
295
295
{
296
296
swap_any_inplace (length);
297
297
}
298
+ if (*length < 0 )
299
+ {
300
+ PyErr_SetString (PyExc_ValueError, " Negative length read from TypeTree" );
301
+ return false ;
302
+ }
298
303
reader->ptr += sizeof (int32_t );
299
304
return true ;
300
305
}
@@ -346,12 +351,12 @@ inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeRe
346
351
}
347
352
348
353
PyObject *first = read_typetree_value<swap>(reader, (TypeTreeNodeObject *)PyList_GET_ITEM (node->m_Children , 0 ), config);
349
- if (! first)
354
+ if (first == NULL )
350
355
{
351
356
return NULL ;
352
357
}
353
358
PyObject *second = read_typetree_value<swap>(reader, (TypeTreeNodeObject *)PyList_GET_ITEM (node->m_Children , 1 ), config);
354
- if (! second)
359
+ if (second == NULL )
355
360
{
356
361
Py_DECREF (first);
357
362
return NULL ;
@@ -380,13 +385,13 @@ inline PyObject *read_pair_array(ReaderT *reader, TypeTreeNodeObject *node, Type
380
385
for (auto i = 0 ; i < count; i++)
381
386
{
382
387
PyObject *first = read_typetree_value<swap>(reader, first_child, config);
383
- if (! first)
388
+ if (first == NULL )
384
389
{
385
390
Py_DECREF (list);
386
391
return NULL ;
387
392
}
388
393
PyObject *second = read_typetree_value<swap>(reader, second_child, config);
389
- if (! second)
394
+ if (second == NULL )
390
395
{
391
396
Py_DECREF (first);
392
397
Py_DECREF (list);
@@ -422,7 +427,7 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR
422
427
}
423
428
}
424
429
PyObject *child_value = read_typetree_value<swap>(reader, child, config); // child_value: 1 refcount
425
- if (! child_value)
430
+ if (child_value == NULL )
426
431
{
427
432
Py_DECREF (value); // value: 0 refcount
428
433
return NULL ;
@@ -488,6 +493,11 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre
488
493
// slots check
489
494
PyObject *slots = nullptr ;
490
495
496
+ if (kwargs == NULL )
497
+ {
498
+ return NULL ;
499
+ }
500
+
491
501
if (node->_data_type == NodeDataType::PPtr)
492
502
{
493
503
clz = PyObject_GetAttrString (config->classes , " PPtr" );
@@ -792,7 +802,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre
792
802
child_value = read_typetree_value<swap>(reader, child, config);
793
803
}
794
804
795
- if (! child_value)
805
+ if (child_value == NULL )
796
806
{
797
807
Py_DECREF (value);
798
808
return NULL ;
@@ -857,7 +867,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre
857
867
for (int i = 0 ; i < length; i++)
858
868
{
859
869
PyObject *item = read_typetree_value<swap>(reader, child, config);
860
- if (! item)
870
+ if (item == NULL )
861
871
{
862
872
Py_DECREF (value);
863
873
return NULL ;
@@ -885,7 +895,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre
885
895
}
886
896
}
887
897
888
- if (align)
898
+ if (align && value != NULL )
889
899
{
890
900
align4 (reader);
891
901
}
@@ -940,7 +950,7 @@ PyObject *read_typetree_value_array(ReaderT *reader, TypeTreeNodeObject *node, T
940
950
default :
941
951
value = PyErr_Format (PyExc_ValueError, " Unsupported type for read_typetree_value_array: %d" , node->_data_type );
942
952
}
943
- if (align)
953
+ if (align && value != NULL )
944
954
{
945
955
align4 (reader);
946
956
}
@@ -1050,7 +1060,7 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs)
1050
1060
Py_XDECREF (config.assetfile );
1051
1061
Py_XDECREF (config.classes );
1052
1062
1053
- return Py_BuildValue (" (Nn)" , value, bytes_read);
1063
+ return (value != NULL ) ? Py_BuildValue (" (Nn)" , value, bytes_read) : NULL ;
1054
1064
}
1055
1065
1056
1066
// TypeTreeNode impl
@@ -1206,6 +1216,16 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject
1206
1216
return 0 ;
1207
1217
}
1208
1218
1219
+ static PyObject *TypeTreeNode_repr (TypeTreeNodeObject *self)
1220
+ {
1221
+ return PyUnicode_FromFormat (
1222
+ " TypeTreeNode(m_Level=%R, m_Type=%R, m_Name=%R, m_MetaFlag=%R)" ,
1223
+ self->m_Level ,
1224
+ self->m_Type ,
1225
+ self->m_Name ,
1226
+ self->m_MetaFlag );
1227
+ }
1228
+
1209
1229
static PyMemberDef TypeTreeNode_members[] = {
1210
1230
{" m_Level" , T_OBJECT_EX, offsetof (TypeTreeNodeObject, m_Level), 0 , " " },
1211
1231
{" m_Type" , T_OBJECT_EX, offsetof (TypeTreeNodeObject, m_Type), 0 , " " },
@@ -1240,6 +1260,7 @@ static PyTypeObject TypeTreeNodeType = []() -> PyTypeObject
1240
1260
type.tp_init = (initproc)TypeTreeNode_init;
1241
1261
type.tp_members = TypeTreeNode_members;
1242
1262
type.tp_finalize = (destructor)TypeTreeNode_finalize;
1263
+ type.tp_repr = (reprfunc)TypeTreeNode_repr;
1243
1264
return type;
1244
1265
}();
1245
1266
0 commit comments