Skip to content

Commit

Permalink
ctermid: return string literal, document MT-Safety pitfall
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Alexandre Oliva committed Nov 21, 2014
1 parent a4ea5e2 commit 7729e0e
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 11 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
8 changes: 5 additions & 3 deletions manual/job.texi
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 8 additions & 8 deletions sysdeps/posix/ctermid.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@
#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);
}

0 comments on commit 7729e0e

Please sign in to comment.