[31514] in CVS-changelog-for-Kerberos-V5

home help back first fref pref prev next nref lref last post

krb5 commit: Force "fork" method in t_otp.py

daemon@ATHENA.MIT.EDU (ghudson@mit.edu)
Mon Mar 30 18:17:02 2026

From: ghudson@mit.edu
To: cvs-krb5@mit.edu
Message-Id: <20260330221655.ADE14104851@krbdev.mit.edu>
Date: Mon, 30 Mar 2026 18:16:55 -0400 (EDT)
MIME-Version: 1.0
Reply-To: krbdev@mit.edu
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: cvs-krb5-bounces@mit.edu

https://github.com/krb5/krb5/commit/c2697c127be660cfe2a623e153c347ade50f184b
commit c2697c127be660cfe2a623e153c347ade50f184b
Author: Julien Rische <jrische@redhat.com>
Date:   Mon Feb 16 16:30:14 2026 +0100

    Force "fork" method in t_otp.py
    
    Set the multiprocessing start method to "fork" in t_otp.py, as the new
    default "forkserver" method is not compatible with our test scripts.
    Import multiprocessing unconditionally as it is present in the minimum
    Python version for the tests.
    
    [ghudson@mit.edu: expanded comment; edited commit message]

 src/tests/t_otp.py | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/tests/t_otp.py b/src/tests/t_otp.py
index dd5cdc5c2..8c6d9383f 100755
--- a/src/tests/t_otp.py
+++ b/src/tests/t_otp.py
@@ -31,16 +31,25 @@
 from k5test import *
 from queue import Empty
 import io
+import multiprocessing
 import struct
 
 try:
     from pyrad import packet, dictionary
 except ImportError:
     skip_rest('OTP tests', 'Python pyrad module not found')
-try:
-    from multiprocessing import Process, Queue
-except ImportError:
-    skip_rest('OTP tests', 'Python version 2.6 required')
+
+# Since Python 3.14 (3.8 on macOS), "forkserver" replaces "fork" as
+# default method on POSIX, because forking and continuing execution is
+# inherently unsafe in threaded processes, and because system
+# libraries may have created threads without specific direction from
+# the main process (this is most often seen on macOS so far).
+#
+# "forkserver" relies on being able to re-import the invoking module.
+# That doesn't work for k5test scripts as we don't use __name__ ==
+# 'main' guards and because k5test installs an atexit handler.  For
+# now, switch back to using the "fork" method.
+multiprocessing.set_start_method('fork', force=True)
 
 # We could use a dictionary file, but since we need so few attributes,
 # we'll just include them here.
@@ -52,7 +61,7 @@ ATTRIBUTE    NAS-Identifier  32    string
 ATTRIBUTE    Message-Authenticator 80 octets
 '''
 
-class RadiusDaemon(Process):
+class RadiusDaemon(multiprocessing.Process):
     MAX_PACKET_SIZE = 4096
     DICTIONARY = dictionary.Dictionary(io.StringIO(radius_attributes))
 
@@ -186,7 +195,7 @@ conf = {'plugins': {'kdcpreauth': {'enable_only': 'otp'}},
                 'unix': {'server': socket_file,
                          'strip_realm': 'false'}}}
 
-queue = Queue()
+queue = multiprocessing.Queue()
 
 realm = K5Realm(kdc_conf=conf)
 realm.run([kadminl, 'modprinc', '+requires_preauth', realm.user_princ])
@@ -259,7 +268,7 @@ verify(daemon, queue, True, realm.user_princ, 'accept')
 ## tokens configured, with the first rejecting and the second
 ## accepting.  With the bug, the KDC incorrectly rejects the request
 ## and then performs invalid memory accesses, most likely crashing.
-queue2 = Queue()
+queue2 = multiprocessing.Queue()
 daemon1 = UDPRadiusDaemon(args=(server_addr, secret_file, 'accept1', queue))
 daemon2 = UnixRadiusDaemon(args=(socket_file, None, 'accept2', queue2))
 daemon1.start()
_______________________________________________
cvs-krb5 mailing list
cvs-krb5@mit.edu
https://mailman.mit.edu/mailman/listinfo/cvs-krb5

home help back first fref pref prev next nref lref last post