This is a live mirror of the Perl 5 development currently hosted at
POSIX.xs: Never pass NULL to ctermid()
authorKarl Williamson <>
Tue, 17 Mar 2020 17:39:02 +0000 (11:39 -0600)
committerKarl Williamson <>
Wed, 18 Mar 2020 23:27:40 +0000 (17:27 -0600)
Doing so can cause races.

It is interesting that POSIX:ctermid() takes a parameter, but the
pod doesn't indicate that it does.  Prior to this commit the parameter
was ignored if and only if the platform contains a ctermid_r()
function, and hence on such platforms there was no possibility of a race
here.  The man pages I've seen for ctermid_r() indicate that it differs
from regular ctermid() only in that it will fail if the input is NULL,
and hence a race could occur if it didn't immediately fail.

The situation prior to this commit wa that if you followed the pod on a
non-ctermid_r() platform, and called this without a parameter, it would
call ctermid with NULL, creating a potential race.  This commit changes
so that a race is never possible.


index befab77..2671cca 100644 (file)
@@ -3820,14 +3820,16 @@ char *
 ctermid(s = 0)
        char *          s = 0;
+#ifdef I_TERMIOS
+        /* On some systems L_ctermid is a #define; but not all; this code works
+         * for all cases (so far...) */
        s = (char *) safemalloc((size_t) L_ctermid);
        RETVAL = ctermid(s);
+#ifdef I_TERMIOS
index d44645a..73a7bfe 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
-our $VERSION = '1.92';
+our $VERSION = '1.93';
 require XSLoader;