Skip to content

Commit 7ded8b6

Browse files
committed
Make error checking in COPY_COMMON_SLOT less stringent
1 parent 66055d0 commit 7ded8b6

1 file changed

Lines changed: 17 additions & 11 deletions

File tree

Objects/moduleobject.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ module_from_def_and_spec(
413413
for (cur_slot = def_like->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
414414
// Macro to copy a non-NULL, non-repeatable slot that's unusable with
415415
// PyModuleDef. The destination must be initially NULL.
416-
#define COPY_COMMON_SLOT(SLOT, TYPE, DEST) \
416+
#define COPY_COMMON_SLOT(SLOT, TYPE, DEST, ORIG_FIELD) \
417417
do { \
418418
if (!(TYPE)(cur_slot->value)) { \
419419
PyErr_Format( \
@@ -422,7 +422,13 @@ module_from_def_and_spec(
422422
name); \
423423
goto error; \
424424
} \
425-
if (original_def) { \
425+
if (ORIG_FIELD) { \
426+
PyErr_Format( \
427+
PyExc_SystemError, \
428+
"module %s: " #SLOT " used with PyModuleDef", \
429+
name); \
430+
} \
431+
else if (original_def) { \
426432
PyErr_Format( \
427433
PyExc_SystemError, \
428434
"module %s: " #SLOT " used with PyModuleDef", \
@@ -453,7 +459,7 @@ module_from_def_and_spec(
453459
case Py_mod_exec:
454460
has_execution_slots = 1;
455461
if (!original_def) {
456-
COPY_COMMON_SLOT(Py_mod_exec, _Py_modexecfunc, m_exec);
462+
COPY_COMMON_SLOT(Py_mod_exec, _Py_modexecfunc, m_exec, 0);
457463
}
458464
break;
459465
case Py_mod_multiple_interpreters:
@@ -484,33 +490,33 @@ module_from_def_and_spec(
484490
}
485491
break;
486492
case Py_mod_name:
487-
COPY_COMMON_SLOT(Py_mod_name, char*, def_like->m_name);
493+
COPY_COMMON_SLOT(Py_mod_name, char*, def_like->m_name, original_def->m_name);
488494
break;
489495
case Py_mod_doc:
490-
COPY_COMMON_SLOT(Py_mod_doc, char*, def_like->m_doc);
496+
COPY_COMMON_SLOT(Py_mod_doc, char*, def_like->m_doc, original_def->m_doc);
491497
break;
492498
case Py_mod_state_size:
493499
COPY_COMMON_SLOT(Py_mod_state_size, Py_ssize_t,
494-
def_like->m_size);
500+
def_like->m_size, 0);
495501
break;
496502
case Py_mod_methods:
497503
COPY_COMMON_SLOT(Py_mod_methods, PyMethodDef*,
498-
def_like->m_methods);
504+
def_like->m_methods, 0);
499505
break;
500506
case Py_mod_state_traverse:
501507
COPY_COMMON_SLOT(Py_mod_state_traverse, traverseproc,
502-
def_like->m_traverse);
508+
def_like->m_traverse, 0);
503509
break;
504510
case Py_mod_state_clear:
505511
COPY_COMMON_SLOT(Py_mod_state_clear, inquiry,
506-
def_like->m_clear);
512+
def_like->m_clear, 0);
507513
break;
508514
case Py_mod_state_free:
509515
COPY_COMMON_SLOT(Py_mod_state_free, freefunc,
510-
def_like->m_free);
516+
def_like->m_free, 0);
511517
break;
512518
case Py_mod_token:
513-
COPY_COMMON_SLOT(Py_mod_token, void*, token);
519+
COPY_COMMON_SLOT(Py_mod_token, void*, token, 0);
514520
break;
515521
default:
516522
assert(cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT);

0 commit comments

Comments
 (0)