Skip to content

Commit 2838c55

Browse files
authored
gh-111233: Fix error checking in select extension module init (#111234)
Introduce ADD_INT macro wrapper for PyModule_AddIntConstant()
1 parent 3052c09 commit 2838c55

File tree

2 files changed

+85
-66
lines changed

2 files changed

+85
-66
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix :mod:`select` not checking for errors when initializing.

Modules/selectmodule.c

+84-66
Original file line numberDiff line numberDiff line change
@@ -2444,12 +2444,18 @@ _select_exec(PyObject *m)
24442444
return -1;
24452445
}
24462446

2447+
#define ADD_INT(VAL) do { \
2448+
if (PyModule_AddIntConstant((m), #VAL, (VAL)) < 0) { \
2449+
return -1; \
2450+
} \
2451+
} while (0)
2452+
24472453
#ifdef PIPE_BUF
24482454
#ifdef HAVE_BROKEN_PIPE_BUF
24492455
#undef PIPE_BUF
24502456
#define PIPE_BUF 512
24512457
#endif
2452-
PyModule_AddIntMacro(m, PIPE_BUF);
2458+
ADD_INT(PIPE_BUF);
24532459
#endif
24542460

24552461
#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
@@ -2468,31 +2474,31 @@ _select_exec(PyObject *m)
24682474
return -1;
24692475
}
24702476

2471-
PyModule_AddIntMacro(m, POLLIN);
2472-
PyModule_AddIntMacro(m, POLLPRI);
2473-
PyModule_AddIntMacro(m, POLLOUT);
2474-
PyModule_AddIntMacro(m, POLLERR);
2475-
PyModule_AddIntMacro(m, POLLHUP);
2476-
PyModule_AddIntMacro(m, POLLNVAL);
2477+
ADD_INT(POLLIN);
2478+
ADD_INT(POLLPRI);
2479+
ADD_INT(POLLOUT);
2480+
ADD_INT(POLLERR);
2481+
ADD_INT(POLLHUP);
2482+
ADD_INT(POLLNVAL);
24772483

24782484
#ifdef POLLRDNORM
2479-
PyModule_AddIntMacro(m, POLLRDNORM);
2485+
ADD_INT(POLLRDNORM);
24802486
#endif
24812487
#ifdef POLLRDBAND
2482-
PyModule_AddIntMacro(m, POLLRDBAND);
2488+
ADD_INT(POLLRDBAND);
24832489
#endif
24842490
#ifdef POLLWRNORM
2485-
PyModule_AddIntMacro(m, POLLWRNORM);
2491+
ADD_INT(POLLWRNORM);
24862492
#endif
24872493
#ifdef POLLWRBAND
2488-
PyModule_AddIntMacro(m, POLLWRBAND);
2494+
ADD_INT(POLLWRBAND);
24892495
#endif
24902496
#ifdef POLLMSG
2491-
PyModule_AddIntMacro(m, POLLMSG);
2497+
ADD_INT(POLLMSG);
24922498
#endif
24932499
#ifdef POLLRDHUP
24942500
/* Kernel 2.6.17+ */
2495-
PyModule_AddIntMacro(m, POLLRDHUP);
2501+
ADD_INT(POLLRDHUP);
24962502
#endif
24972503
}
24982504
#endif /* HAVE_POLL */
@@ -2515,45 +2521,54 @@ _select_exec(PyObject *m)
25152521
return -1;
25162522
}
25172523

2518-
PyModule_AddIntMacro(m, EPOLLIN);
2519-
PyModule_AddIntMacro(m, EPOLLOUT);
2520-
PyModule_AddIntMacro(m, EPOLLPRI);
2521-
PyModule_AddIntMacro(m, EPOLLERR);
2522-
PyModule_AddIntMacro(m, EPOLLHUP);
2524+
ADD_INT(EPOLLIN);
2525+
ADD_INT(EPOLLOUT);
2526+
ADD_INT(EPOLLPRI);
2527+
ADD_INT(EPOLLERR);
2528+
ADD_INT(EPOLLHUP);
25232529
#ifdef EPOLLRDHUP
25242530
/* Kernel 2.6.17 */
2525-
PyModule_AddIntMacro(m, EPOLLRDHUP);
2531+
ADD_INT(EPOLLRDHUP);
25262532
#endif
2527-
PyModule_AddIntMacro(m, EPOLLET);
2533+
ADD_INT(EPOLLET);
25282534
#ifdef EPOLLONESHOT
25292535
/* Kernel 2.6.2+ */
2530-
PyModule_AddIntMacro(m, EPOLLONESHOT);
2536+
ADD_INT(EPOLLONESHOT);
25312537
#endif
25322538
#ifdef EPOLLEXCLUSIVE
2533-
PyModule_AddIntMacro(m, EPOLLEXCLUSIVE);
2539+
ADD_INT(EPOLLEXCLUSIVE);
25342540
#endif
25352541

25362542
#ifdef EPOLLRDNORM
2537-
PyModule_AddIntMacro(m, EPOLLRDNORM);
2543+
ADD_INT(EPOLLRDNORM);
25382544
#endif
25392545
#ifdef EPOLLRDBAND
2540-
PyModule_AddIntMacro(m, EPOLLRDBAND);
2546+
ADD_INT(EPOLLRDBAND);
25412547
#endif
25422548
#ifdef EPOLLWRNORM
2543-
PyModule_AddIntMacro(m, EPOLLWRNORM);
2549+
ADD_INT(EPOLLWRNORM);
25442550
#endif
25452551
#ifdef EPOLLWRBAND
2546-
PyModule_AddIntMacro(m, EPOLLWRBAND);
2552+
ADD_INT(EPOLLWRBAND);
25472553
#endif
25482554
#ifdef EPOLLMSG
2549-
PyModule_AddIntMacro(m, EPOLLMSG);
2555+
ADD_INT(EPOLLMSG);
25502556
#endif
25512557

25522558
#ifdef EPOLL_CLOEXEC
2553-
PyModule_AddIntMacro(m, EPOLL_CLOEXEC);
2559+
ADD_INT(EPOLL_CLOEXEC);
25542560
#endif
25552561
#endif /* HAVE_EPOLL */
25562562

2563+
#undef ADD_INT
2564+
2565+
#define ADD_INT_CONST(NAME, VAL) \
2566+
do { \
2567+
if (PyModule_AddIntConstant(m, NAME, VAL) < 0) { \
2568+
return -1; \
2569+
} \
2570+
} while (0)
2571+
25572572
#ifdef HAVE_KQUEUE
25582573
state->kqueue_event_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
25592574
m, &kqueue_event_Type_spec, NULL);
@@ -2574,80 +2589,83 @@ _select_exec(PyObject *m)
25742589
}
25752590

25762591
/* event filters */
2577-
PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
2578-
PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
2592+
ADD_INT_CONST("KQ_FILTER_READ", EVFILT_READ);
2593+
ADD_INT_CONST("KQ_FILTER_WRITE", EVFILT_WRITE);
25792594
#ifdef EVFILT_AIO
2580-
PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
2595+
ADD_INT_CONST("KQ_FILTER_AIO", EVFILT_AIO);
25812596
#endif
25822597
#ifdef EVFILT_VNODE
2583-
PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
2598+
ADD_INT_CONST("KQ_FILTER_VNODE", EVFILT_VNODE);
25842599
#endif
25852600
#ifdef EVFILT_PROC
2586-
PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
2601+
ADD_INT_CONST("KQ_FILTER_PROC", EVFILT_PROC);
25872602
#endif
25882603
#ifdef EVFILT_NETDEV
2589-
PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
2604+
ADD_INT_CONST("KQ_FILTER_NETDEV", EVFILT_NETDEV);
25902605
#endif
25912606
#ifdef EVFILT_SIGNAL
2592-
PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
2607+
ADD_INT_CONST("KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
25932608
#endif
2594-
PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
2609+
ADD_INT_CONST("KQ_FILTER_TIMER", EVFILT_TIMER);
25952610

25962611
/* event flags */
2597-
PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
2598-
PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
2599-
PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
2600-
PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
2601-
PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
2602-
PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
2612+
ADD_INT_CONST("KQ_EV_ADD", EV_ADD);
2613+
ADD_INT_CONST("KQ_EV_DELETE", EV_DELETE);
2614+
ADD_INT_CONST("KQ_EV_ENABLE", EV_ENABLE);
2615+
ADD_INT_CONST("KQ_EV_DISABLE", EV_DISABLE);
2616+
ADD_INT_CONST("KQ_EV_ONESHOT", EV_ONESHOT);
2617+
ADD_INT_CONST("KQ_EV_CLEAR", EV_CLEAR);
26032618

26042619
#ifdef EV_SYSFLAGS
2605-
PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
2620+
ADD_INT_CONST("KQ_EV_SYSFLAGS", EV_SYSFLAGS);
26062621
#endif
26072622
#ifdef EV_FLAG1
2608-
PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
2623+
ADD_INT_CONST("KQ_EV_FLAG1", EV_FLAG1);
26092624
#endif
26102625

2611-
PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
2612-
PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
2626+
ADD_INT_CONST("KQ_EV_EOF", EV_EOF);
2627+
ADD_INT_CONST("KQ_EV_ERROR", EV_ERROR);
26132628

26142629
/* READ WRITE filter flag */
26152630
#ifdef NOTE_LOWAT
2616-
PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
2631+
ADD_INT_CONST("KQ_NOTE_LOWAT", NOTE_LOWAT);
26172632
#endif
26182633

26192634
/* VNODE filter flags */
26202635
#ifdef EVFILT_VNODE
2621-
PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
2622-
PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
2623-
PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
2624-
PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
2625-
PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
2626-
PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
2627-
PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
2636+
ADD_INT_CONST("KQ_NOTE_DELETE", NOTE_DELETE);
2637+
ADD_INT_CONST("KQ_NOTE_WRITE", NOTE_WRITE);
2638+
ADD_INT_CONST("KQ_NOTE_EXTEND", NOTE_EXTEND);
2639+
ADD_INT_CONST("KQ_NOTE_ATTRIB", NOTE_ATTRIB);
2640+
ADD_INT_CONST("KQ_NOTE_LINK", NOTE_LINK);
2641+
ADD_INT_CONST("KQ_NOTE_RENAME", NOTE_RENAME);
2642+
ADD_INT_CONST("KQ_NOTE_REVOKE", NOTE_REVOKE);
26282643
#endif
26292644

26302645
/* PROC filter flags */
26312646
#ifdef EVFILT_PROC
2632-
PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
2633-
PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
2634-
PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
2635-
PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
2636-
PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
2637-
2638-
PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
2639-
PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
2640-
PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
2647+
ADD_INT_CONST("KQ_NOTE_EXIT", NOTE_EXIT);
2648+
ADD_INT_CONST("KQ_NOTE_FORK", NOTE_FORK);
2649+
ADD_INT_CONST("KQ_NOTE_EXEC", NOTE_EXEC);
2650+
ADD_INT_CONST("KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
2651+
ADD_INT_CONST("KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
2652+
2653+
ADD_INT_CONST("KQ_NOTE_TRACK", NOTE_TRACK);
2654+
ADD_INT_CONST("KQ_NOTE_CHILD", NOTE_CHILD);
2655+
ADD_INT_CONST("KQ_NOTE_TRACKERR", NOTE_TRACKERR);
26412656
#endif
26422657

26432658
/* NETDEV filter flags */
26442659
#ifdef EVFILT_NETDEV
2645-
PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
2646-
PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
2647-
PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
2660+
ADD_INT_CONST("KQ_NOTE_LINKUP", NOTE_LINKUP);
2661+
ADD_INT_CONST("KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
2662+
ADD_INT_CONST("KQ_NOTE_LINKINV", NOTE_LINKINV);
26482663
#endif
26492664

26502665
#endif /* HAVE_KQUEUE */
2666+
2667+
#undef ADD_INT_CONST
2668+
26512669
return 0;
26522670
}
26532671

0 commit comments

Comments
 (0)