This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
POSIX.xs: Never pass NULL to ctermid()
authorKarl Williamson <khw@cpan.org>
Tue, 17 Mar 2020 17:39:02 +0000 (11:39 -0600)
committerKarl Williamson <khw@cpan.org>
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.

ext/POSIX/POSIX.xs
ext/POSIX/lib/POSIX.pm

index befab77..2671cca 100644 (file)
@@ -3820,14 +3820,16 @@ char *
 ctermid(s = 0)
        char *          s = 0;
     CODE:
-#ifdef HAS_CTERMID_R
+#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);
 #endif
        RETVAL = ctermid(s);
     OUTPUT:
        RETVAL
     CLEANUP:
-#ifdef HAS_CTERMID_R
+#ifdef I_TERMIOS
        Safefree(s);
 #endif
 
index d44645a..73a7bfe 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 
 our ($AUTOLOAD, %SIGRT);
 
-our $VERSION = '1.92';
+our $VERSION = '1.93';
 
 require XSLoader;