]> sourceware.org Git - glibc.git/commitdiff
ctermid: return string literal, document MT-Safety pitfall
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 21 Nov 2014 04:06:22 +0000 (02:06 -0200)
committerAlexandre Oliva <aoliva@redhat.com>
Fri, 21 Nov 2014 04:16:02 +0000 (02:16 -0200)
for  ChangeLog

* sysdeps/posix/ctermid.c (ctermid): Return a pointer to a
string literal if not passed a buffer.
* manual/job.texi (ctermid): Update reasoning, note deviation
from posix, suggest mtasurace when not passed a buffer, for
future non-preliminary safety notes.

ChangeLog
manual/job.texi
sysdeps/posix/ctermid.c

index d57c023ac15596009d6cdf3ed71751c4e76effb9..96aafaeda0b208ca6bd408a1a35ac8d26cbc4145 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-11-21  Alexandre Oliva <aoliva@redhat.com>
+
+       * sysdeps/posix/ctermid.c (ctermid): Return a pointer to a
+       string literal if not passed a buffer.
+       * manual/job.texi (ctermid): Update reasoning, note deviation
+       from posix, suggest mtasurace when not passed a buffer, for
+       future non-preliminary safety notes.
+
 2014-11-21  Alexandre Oliva <aoliva@redhat.com>
 
        * manual/users.texi (cuserid): Fix MT-Safety note for the case
index 4f9bd81ffe15dfc84b56df1bbad4dde535374ced..095c26d930ba7d0fbd4e14482f2a5f64f69ba6ad 100644 (file)
@@ -1039,10 +1039,12 @@ The function @code{ctermid} is declared in the header file
 @comment stdio.h
 @comment POSIX.1
 @deftypefun {char *} ctermid (char *@var{string})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+@safety{@prelim{}@mtsafe{@mtsposix{/!string}}@assafe{}@acsafe{}}
 @c This function is a stub by default; the actual implementation, for
-@c posix systems, returns an internal buffer if passed a NULL string,
-@c but the internal buffer is always set to /dev/tty.
+@c posix systems, returns a pointer to a string literal if passed a NULL
+@c string.  It's not clear we want to commit to being MT-Safe in the
+@c !string case, so maybe add mtasurace{:ctermid/!string} when we take
+@c prelim out, to make room for using a static buffer in the future.
 The @code{ctermid} function returns a string containing the file name of
 the controlling terminal for the current process.  If @var{string} is
 not a null pointer, it should be an array that can hold at least
index 0ef9a3fe232e46f837e2db72674d02d5a94562ff..9714285224f8a1c4ac6c7cfdf64b5a0a85576381 100644 (file)
 #include <string.h>
 
 
-/* Return the name of the controlling terminal.
-   If S is not NULL, the name is copied into it (it should be at
-   least L_ctermid bytes long), otherwise a static buffer is used.  */
+/* Return the name of the controlling terminal.  If S is not NULL, the
+   name is copied into it (it should be at least L_ctermid bytes
+   long), otherwise we return a pointer to a non-const but read-only
+   string literal, that POSIX states the caller must not modify.  */
 char *
-ctermid (s)
-     char *s;
+ctermid (char *s)
 {
-  static char name[L_ctermid];
+  char *name = (char /*drop const*/ *) "/dev/tty";
 
   if (s == NULL)
-    s = name;
+    return name;
 
-  return strcpy (s, "/dev/tty");
+  return strcpy (s, name);
 }
This page took 0.117411 seconds and 5 git commands to generate.