@@ -50,6 +50,7 @@ prctl_prctl(PyObject *self, PyObject *args)
50
50
{
51
51
long option = 0 ;
52
52
long arg = 0 ;
53
+ long arg2 = 0 ;
53
54
char * argstr = NULL ;
54
55
char name [17 ] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ;
55
56
int result ;
@@ -59,7 +60,7 @@ prctl_prctl(PyObject *self, PyObject *args)
59
60
* prctl possibilities. int+string is required for (and only accepted for)
60
61
* PR_SET_NAME
61
62
*/
62
- if (!PyArg_ParseTuple (args , "l|l " , & option , & arg )) {
63
+ if (!PyArg_ParseTuple (args , "l|ll " , & option , & arg , & arg2 )) {
63
64
if (!PyArg_ParseTuple (args , "ls" , & option , & argstr )) {
64
65
return NULL ;
65
66
}
@@ -88,6 +89,9 @@ prctl_prctl(PyObject *self, PyObject *args)
88
89
break ;
89
90
#endif
90
91
case (PR_SET_DUMPABLE ):
92
+ #ifdef PR_SET_IO_FLUSHER
93
+ case (PR_SET_IO_FLUSHER ):
94
+ #endif
91
95
case (PR_SET_KEEPCAPS ):
92
96
/* Only 0 and 1 are allowed */
93
97
arg = arg ? 1 : 0 ;
@@ -113,6 +117,14 @@ prctl_prctl(PyObject *self, PyObject *args)
113
117
return NULL ;
114
118
}
115
119
break ;
120
+ #ifdef PR_SET_FP_MODE
121
+ case (PR_SET_FP_MODE ):
122
+ if (arg != PR_FP_MODE_FR && arg != PR_FP_MODE_FRE ) {
123
+ PyErr_SetString (PyExc_ValueError , "Unknown floating-point mode" );
124
+ return NULL ;
125
+ }
126
+ break ;
127
+ #endif
116
128
#ifdef PR_MCE_KILL
117
129
case (PR_SET_MCE_KILL ):
118
130
if (arg != PR_MCE_KILL_DEFAULT && arg != PR_MCE_KILL_EARLY && arg != PR_MCE_KILL_LATE ) {
@@ -127,6 +139,14 @@ prctl_prctl(PyObject *self, PyObject *args)
127
139
}
128
140
strncpy (name , argstr , 16 );
129
141
break ;
142
+ #ifdef PR_PAC_RESET_KEYS
143
+ case (PR_PAC_RESET_KEYS ):
144
+ if (arg & ~(PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY | PR_PAC_APGAKEY )) {
145
+ PyErr_SetString (PyExc_ValueError , "Unknown pointer authentication key" );
146
+ return NULL ;
147
+ }
148
+ break ;
149
+ #endif
130
150
case (PR_SET_PDEATHSIG ):
131
151
if (arg < 0 || arg > SIGRTMAX ) {
132
152
PyErr_SetString (PyExc_ValueError , "Unknown signal" );
@@ -154,6 +174,30 @@ prctl_prctl(PyObject *self, PyObject *args)
154
174
return NULL ;
155
175
}
156
176
break ;
177
+ #endif
178
+ #ifdef PR_GET_SPECULATION_CTRL
179
+ case (PR_SET_SPECULATION_CTRL ):
180
+ if (arg != PR_SPEC_STORE_BYPASS && arg != PR_SPEC_INDIRECT_BRANCH ) {
181
+ PyErr_SetString (PyExc_ValueError , "Invalid speculation control setting" );
182
+ return NULL ;
183
+ }
184
+ if (arg2 != PR_SPEC_ENABLE
185
+ && arg2 != PR_SPEC_DISABLE
186
+ && arg2 != PR_SPEC_FORCE_DISABLE
187
+ #ifdef PR_SPEC_DISABLE_NOEXEC
188
+ && arg2 != PR_SPEC_DISABLE_NOEXEC
189
+ #endif
190
+ ) {
191
+ PyErr_SetString (PyExc_ValueError , "Invalid speculation control value" );
192
+ return NULL ;
193
+ }
194
+ /* Intentionally not breaking */
195
+ case (PR_GET_SPECULATION_CTRL ):
196
+ if (arg != PR_SPEC_STORE_BYPASS && arg != PR_SPEC_INDIRECT_BRANCH ) {
197
+ PyErr_SetString (PyExc_ValueError , "Invalid speculation control setting" );
198
+ return NULL ;
199
+ }
200
+ break ;
157
201
#endif
158
202
case (PR_SET_TIMING ):
159
203
if (arg != PR_TIMING_STATISTICAL && arg != PR_TIMING_TIMESTAMP ) {
@@ -199,14 +243,29 @@ prctl_prctl(PyObject *self, PyObject *args)
199
243
case (PR_SET_ENDIAN ):
200
244
case (PR_SET_FPEMU ):
201
245
case (PR_SET_FPEXC ):
246
+ #ifdef PR_SET_FP_MODE
247
+ case (PR_GET_FP_MODE ):
248
+ case (PR_SET_FP_MODE ):
249
+ #endif
250
+ #ifdef PR_SET_IO_FLUSHER
251
+ case (PR_GET_IO_FLUSHER ):
252
+ case (PR_SET_IO_FLUSHER ):
253
+ #endif
202
254
case (PR_SET_KEEPCAPS ):
203
255
case (PR_GET_KEEPCAPS ):
204
256
#ifdef PR_MCE_KILL
205
257
case (PR_GET_MCE_KILL ):
206
258
#endif
259
+ #ifdef PR_MPX_ENABLE_MANAGEMENT
260
+ case (PR_MPX_ENABLE_MANAGEMENT ):
261
+ case (PR_MPX_DISABLE_MANAGEMENT ):
262
+ #endif
207
263
#ifdef PR_GET_NO_NEW_PRIVS
208
264
case (PR_GET_NO_NEW_PRIVS ):
209
265
case (PR_SET_NO_NEW_PRIVS ):
266
+ #endif
267
+ #ifdef PR_PAC_RESET_KEYS
268
+ case (PR_PAC_RESET_KEYS ):
210
269
#endif
211
270
case (PR_SET_PDEATHSIG ):
212
271
#if defined(PR_GET_PTRACER ) && (PR_GET_PTRACER != NOT_SET )
@@ -223,6 +282,18 @@ prctl_prctl(PyObject *self, PyObject *args)
223
282
case (PR_SET_SECUREBITS ):
224
283
case (PR_GET_SECUREBITS ):
225
284
#endif
285
+ #ifdef PR_GET_SPECULATION_CTRL
286
+ case (PR_GET_SPECULATION_CTRL ):
287
+ case (PR_SET_SPECULATION_CTRL ):
288
+ #endif
289
+ #ifdef PR_TASK_PERF_EVENTS_DISABLE
290
+ case (PR_TASK_PERF_EVENTS_DISABLE ):
291
+ case (PR_TASK_PERF_EVENTS_ENABLE ):
292
+ #endif
293
+ #ifdef PR_SET_THP_DISABLE
294
+ case (PR_GET_THP_DISABLE ):
295
+ case (PR_SET_THP_DISABLE ):
296
+ #endif
226
297
#ifdef PR_GET_TIMERSLACK
227
298
case (PR_GET_TIMERSLACK ):
228
299
case (PR_SET_TIMERSLACK ):
@@ -233,7 +304,7 @@ prctl_prctl(PyObject *self, PyObject *args)
233
304
case (PR_SET_TSC ):
234
305
#endif
235
306
case (PR_SET_UNALIGN ):
236
- result = prctl (option , arg , 0 , 0 , 0 );
307
+ result = prctl (option , arg , arg2 , 0 , 0 );
237
308
if (result < 0 ) {
238
309
PyErr_SetFromErrno (PyExc_OSError );
239
310
return NULL ;
@@ -243,12 +314,22 @@ prctl_prctl(PyObject *self, PyObject *args)
243
314
case (PR_CAPBSET_READ ):
244
315
#endif
245
316
case (PR_GET_DUMPABLE ):
317
+ #ifdef PR_SET_IO_FLUSHER
318
+ case (PR_GET_IO_FLUSHER ):
319
+ #endif
246
320
case (PR_GET_KEEPCAPS ):
247
321
#ifdef PR_GET_SECCOMP
248
322
case (PR_GET_SECCOMP ):
323
+ #endif
324
+ #ifdef PR_GET_THP_DISABLE
325
+ case (PR_GET_THP_DISABLE ):
249
326
#endif
250
327
case (PR_GET_TIMING ):
251
328
return PyBool_FromLong (result );
329
+
330
+ #ifdef PR_SET_FP_MODE
331
+ case (PR_GET_FP_MODE ):
332
+ #endif
252
333
#ifdef PR_MCE_KILL
253
334
case (PR_GET_MCE_KILL ):
254
335
#endif
@@ -261,6 +342,9 @@ prctl_prctl(PyObject *self, PyObject *args)
261
342
#ifdef PR_GET_SECUREBITS
262
343
case (PR_GET_SECUREBITS ):
263
344
#endif
345
+ #ifdef PR_GET_SPECULATION_CTRL
346
+ case (PR_GET_SPECULATION_CTRL ):
347
+ #endif
264
348
#ifdef PR_GET_TIMERSLACK
265
349
case (PR_GET_TIMERSLACK ):
266
350
#endif
@@ -639,6 +723,9 @@ PyInit__prctl(void)
639
723
#ifdef PR_CAPBSET_READ
640
724
namedconstant (PR_CAPBSET_READ );
641
725
namedconstant (PR_CAPBSET_DROP );
726
+ #endif
727
+ #ifdef PR_SET_CHILD_SUBREAPER
728
+ namedattribute (CHILD_SUBREAPER );
642
729
#endif
643
730
namedattribute (DUMPABLE );
644
731
namedattribute (ENDIAN );
@@ -659,34 +746,72 @@ PyInit__prctl(void)
659
746
namedconstant (PR_FP_EXC_NONRECOV );
660
747
namedconstant (PR_FP_EXC_ASYNC );
661
748
namedconstant (PR_FP_EXC_PRECISE );
749
+ #ifdef PR_SET_FP_MODE
750
+ namedattribute (FP_MODE );
751
+ namedconstant (PR_FP_MODE_FR );
752
+ namedconstant (PR_FP_MODE_FRE );
753
+ #endif
754
+ #ifdef PR_SET_IO_FLUSHER
755
+ namedattribute (IO_FLUSHER );
756
+ #endif
662
757
namedattribute (KEEPCAPS );
663
758
#ifdef PR_MCE_KILL
664
759
namedattribute (MCE_KILL );
665
760
namedconstant (PR_MCE_KILL_DEFAULT );
666
761
namedconstant (PR_MCE_KILL_EARLY );
667
762
namedconstant (PR_MCE_KILL_LATE );
763
+ #endif
764
+ #ifdef PR_MPX_ENABLE_MANAGEMENT
765
+ namedconstant (PR_MPX_ENABLE_MANAGEMENT );
766
+ namedconstant (PR_MPX_DISABLE_MANAGEMENT );
668
767
#endif
669
768
namedattribute (NAME );
769
+ #ifdef PR_SET_NO_NEW_PRIVS
770
+ namedattribute (NO_NEW_PRIVS );
771
+ #endif
772
+ #ifdef PR_PAC_RESET_KEYS
773
+ namedconstant (PR_PAC_RESET_KEYS );
774
+ namedconstant (PR_PAC_APIAKEY );
775
+ namedconstant (PR_PAC_APIBKEY );
776
+ namedconstant (PR_PAC_APDAKEY );
777
+ namedconstant (PR_PAC_APDBKEY );
778
+ namedconstant (PR_PAC_APGAKEY );
779
+ #endif
670
780
namedattribute (PDEATHSIG );
671
781
#ifdef PR_SET_PTRACER
672
782
namedattribute (PTRACER );
673
783
#endif
674
784
#ifdef PR_SET_PTRACER_ANY
675
785
namedconstant (PR_SET_PTRACER_ANY );
676
786
#endif
677
- #ifdef PR_SET_CHILD_SUBREAPER
678
- namedattribute (CHILD_SUBREAPER );
679
- #endif
680
- #ifdef PR_SET_NO_NEW_PRIVS
681
- namedattribute (NO_NEW_PRIVS );
682
- #endif
683
-
684
787
#ifdef PR_GET_SECCOMP
685
788
namedattribute (SECCOMP );
686
789
#endif
687
790
#ifdef PR_GET_SECUREBITS
688
791
namedattribute (SECUREBITS );
689
792
#endif
793
+ #ifdef PR_SET_SPECULATION_CTRL
794
+ namedattribute (SPECULATION_CTRL );
795
+ namedconstant (PR_SPEC_STORE_BYPASS );
796
+ namedconstant (PR_SPEC_INDIRECT_BRANCH );
797
+ namedconstant (PR_SPEC_PRCTL );
798
+ namedconstant (PR_SPEC_ENABLE );
799
+ namedconstant (PR_SPEC_DISABLE );
800
+ namedconstant (PR_SPEC_FORCE_DISABLE );
801
+ #ifdef PR_SPEC_DISABLE_NOEXEC
802
+ namedconstant (PR_SPEC_DISABLE_NOEXEC );
803
+ #endif
804
+ #endif
805
+ #ifdef PR_TASK_PERF_EVENTS_DISABLE
806
+ namedconstant (PR_TASK_PERF_EVENTS_DISABLE );
807
+ namedconstant (PR_TASK_PERF_EVENTS_ENABLE );
808
+ #endif
809
+ #ifdef PR_SET_THP_DISABLE
810
+ namedattribute (THP_DISABLE );
811
+ #endif
812
+ #ifdef PR_GET_TID_ADDRESS
813
+ namedconstant (PR_GET_TID_ADDRESS );
814
+ #endif
690
815
#ifdef PR_GET_TIMERSLACK
691
816
namedattribute (TIMERSLACK );
692
817
#endif
@@ -701,9 +826,7 @@ PyInit__prctl(void)
701
826
namedattribute (UNALIGN );
702
827
namedconstant (PR_UNALIGN_NOPRINT );
703
828
namedconstant (PR_UNALIGN_SIGBUS );
704
- #ifdef PR_GET_TID_ADDRESS
705
- namedconstant (PR_GET_TID_ADDRESS );
706
- #endif
829
+
707
830
/* Add the CAP_* constants too */
708
831
namedconstant (CAP_EFFECTIVE );
709
832
namedconstant (CAP_PERMITTED );
0 commit comments