Skip to content

Commit acd9c56

Browse files
committed
small edits and fixes
1 parent 4f23211 commit acd9c56

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

Modules/_functoolsmodule.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -361,11 +361,8 @@ partial_descr_get(PyObject *self, PyObject *obj, PyObject *type)
361361
stack = small_stack; \
362362
} \
363363
else { \
364+
/* NOTE, size * elsize in theory could overflow */ \
364365
stack = PyMem_Malloc(size * elsize); \
365-
if (stack == NULL) { \
366-
PyErr_NoMemory(); \
367-
return NULL; \
368-
} \
369366
} \
370367
} while (0)
371368

@@ -438,12 +435,17 @@ partial_vectorcall(PyObject *self, PyObject *const *args,
438435
Py_ssize_t tot_nargskw = tot_nargs + tot_nkwds;
439436

440437
PyObject **stack, *small_stack[_PY_FASTCALL_SMALL_STACK];
441-
PyObject *tot_kwnames = kwnames;
438+
PyObject *tot_kwnames;
442439

443440
/* Initialize stack & copy keywords to stack */
444441
if (!pto_nkwds) {
445442
/* Allocate Stack */
446443
ALLOCATE_STACK(sizeof(PyObject *), tot_nargskw, small_stack, stack);
444+
if (stack == NULL) {
445+
PyErr_NoMemory();
446+
return NULL;
447+
}
448+
tot_kwnames = kwnames;
447449

448450
if (nkwds) {
449451
/* if !pto_nkwds & nkwds, then simply append kw */
@@ -457,6 +459,10 @@ partial_vectorcall(PyObject *self, PyObject *const *args,
457459
/* Temporary stack for keywords that are not in pto->kw */
458460
PyObject **kwtail, *small_kwtail[_PY_FASTCALL_SMALL_STACK * 2];
459461
ALLOCATE_STACK(sizeof(PyObject *), nkwds * 2, small_kwtail, kwtail);
462+
if (kwtail == NULL) {
463+
PyErr_NoMemory();
464+
return NULL;
465+
}
460466

461467
/* Merge kw to pto_kw or add to tail (if not duplicate) */
462468
Py_ssize_t n_tail = 0;
@@ -489,6 +495,11 @@ partial_vectorcall(PyObject *self, PyObject *const *args,
489495
tot_nkwds = pto_nkwds + nkwds - n_merges;
490496
tot_nargskw = tot_nargs + tot_nkwds;
491497
ALLOCATE_STACK(sizeof(PyObject *), tot_nargskw, small_stack, stack);
498+
if (stack == NULL) {
499+
Py_XDECREF(pto_kw);
500+
PyErr_NoMemory();
501+
return NULL;
502+
}
492503
tot_kwnames = PyTuple_New(tot_nkwds);
493504

494505
/* Copy pto_kw to stack */
@@ -545,6 +556,9 @@ partial_vectorcall(PyObject *self, PyObject *const *args,
545556
return ret;
546557
}
547558

559+
#undef ALLOCATE_STACK
560+
#undef DEALLOCATE_STACK
561+
548562
/* Set pto->vectorcall depending on the parameters of the partial object */
549563
static void
550564
partial_setvectorcall(partialobject *pto)
@@ -561,6 +575,7 @@ partial_setvectorcall(partialobject *pto)
561575
}
562576
}
563577

578+
564579
// Not converted to argument clinic, because of `*args, **kwargs` arguments.
565580
static PyObject *
566581
partial_call(PyObject *self, PyObject *args, PyObject *kwargs)

0 commit comments

Comments
 (0)