update from main archive 960927

Sat Sep 28 03:02:49 1996  Ulrich Drepper  <drepper@cygnus.com>
	* dirent/Makefile (routines): Add readdir_r.
	* dirent/readdir_r.c: New file.  Wrapper around readdir.c.
	* dirent/dirent.h: Add prototype for readdir_r.
	* misc/hsearch_r.c (ENTRY): Make field `used' of type `unsigned int'
	to prevent warnings.
	* sysdeps/unix/sysv/linux/getsysstats.c (get_proc_path):
 	Initialize `result'.

Sat Sep 28 01:16:42 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/generic/strsep.c: Rename to __strsep and make strsep
	weak alias.
	* string/string.h: Add prototype for __strsep.
	* misc/mntent_r.c: Use __strsep instead of strsep to keep
	namespace clean.

	* sysdeps/stub/nanosleep.c: Rename to __libc_nanosleep and make
	__nanosleep and nanosleep weak aliases.
	* sysdeps/unix/sysv/linux/syscalls.list: Add __nanosleep as weak
	alias.
	* sysdeps/unix/sysv/linux/sleep.c: Call __nanosleep instead of
	nanosleep to keep namespace clean.

	* sysdeps/posix/ttyname.c (ttyname): Add cast to prevent warning.
	* sysdeps/posix/ttyname_r.c (ttyname_r): Likewise.
	* sysdeps/posix/getcwd.c (__getcwd): Likewise.

	* sysdeps/unix/nlist.c: Use ISO C definition since we don't always
	have prototype.

	* login/Makefile (headers): Add pty.h.
	* login/pty.h: New file.
	* sysdeps/generic/pty.h: Include <pty.h>.
	* login/pututline_r.c: Add cast to prevent warning.

	* gmon/gmon.c: Add prototype for __profile_frequency.
	(monstartup): Add cast to prevent warning.
	* sysdeps/generic/prof-freq.c: Change to use ISO C style definition.

	* locale/programs/ld-time.c (time_output): Write `era' information
	in correct order.

Sat Sep 28 00:11:08 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/syscalls.list: Add weak alias
	`adjtimex'.
	Set caller for mlock, mlockall, mremap, munlock, and munlockall
	to EXTRA.
	Reported by Matthias Urlichs <smurf@smurf.noris.de>.

1996-09-27  Paul Eggert  <eggert@twinsun.com>

	* strftime.c (strftime): Output incomplete formats like %E
	at end of string.

1996-09-27  Paul Eggert  <eggert@twinsun.com>

	* strftime.c (strftime): Add support for %EC and %Ey.
	Fix support for %EY.  This uses the new _nl_get_era_entry function.

Fri Sep 27 14:12:27 1996  Ulrich Drepper  <drepper@cygnus.com>

	Security related patch by Elliot Lee <sopwith@redhat.com> and
	David Holland <dholland@eecs.harvard.edu>.

	* inet/rexec.c (rexec): Increase size of `num' array from 8 to 32.
	* inet/ruserpass.c (ruserpass): Don't allow $HOME envvar to not exist.

	* sysdeps/generic/getenv.c (__secure_getenv): New function.  Return
	NULL when programs runs with SUID or SGID enabled.
	* sysdeps/stub/getenv.c: Make __secure_getenv an alias of getenv.
	* stdlib/stdlib.h: Add prototype for __secure_getenv.

	* locale/setlocale.c: Use __secure_getenv.
	* resolv/res_init.c: Likewise.
	* resolv/res_query.c: Likewise.
	* inet/ruserpass.c: Likewise.
	* sysdeps/posix/tempname.c: Likewise.
	* malloc/mtrace.c: Likewise.
	* catgets/catgets.c: Likewise.

	Make temporary file handling functions reentrant.

	* stdio-common/tmpnam.c: Rewrite to have own buffer to write
	result to.  The called __stdio_gen_tempname function must be
	thread safe.
	* stdio-common/tmpnam_r.c: New file.
	* stdio/stdio.h: Add prototype for `tmpnam_r'.
	Change prototype for __stdio_gen_tempname.
	* stdio/libio.h: Likewise.
	* sysdeps/posix/tempname.c: Add new parameters and use them instead
	of static buffer.
	Don't reset `indeces' when PID changed between calls.
	Don't fail for long running programs when index counter once
	reached the limit.
	* sysdeps/stub/tempname.c: Likewise.
	* stdio-common/tempnam.c: Provide local buffer as extra argument
	to __stdio_gen_tempname.  This makes this function reentrant.
	* stdio-common/tmpfile.c: Likewise.
	* stdio-common/temptest.c: Provide extra argument to
	__stdio_gen_tempname.
	* manual/filesys.texi: Describe tmpnam_r and add comments about
	reentrancy of the functions.

	* inet/rcmd.c: Fixed address length handling.

	* sysdeps/posix/mk-stdiolim.c: Count final \0 byte in L_tmpnam value.

	* time/strftime.c: Remove unused variables alt_digits and
 	end_alt_digits.

	* sysdeps/unix/sysv/linux/sys/sysinfo.h: Correct prototype names
	for get_nprocs and get_nprocs_conf.
	* sysdeps/generic/sys/sysinfo.h: Likewise.

	* stdlib/test-canon.c: Finally do the right fix.

	* misc/Makefile: Only compile force-wrapper when compiling
	reentrant libc.
This commit is contained in:
Ulrich Drepper 1996-09-28 03:24:10 +00:00
parent c40298232a
commit d68171edce
52 changed files with 543 additions and 193 deletions

128
ChangeLog
View File

@ -1,14 +1,126 @@
Mon Sep 23 15:31:04 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
Sat Sep 28 03:02:49 1996 Ulrich Drepper <drepper@cygnus.com>
* hurd/Makefile ($(includedir)/rpc/netdb.h): There is no make
variable `top_srcdir' in libc; use $(..) instead.
* dirent/Makefile (routines): Add readdir_r.
* dirent/readdir_r.c: New file. Wrapper around readdir.c.
* dirent/dirent.h: Add prototype for readdir_r.
* sysdeps/mach/hurd/Makefile (rtld-installed-name): Delete special
definition. It was a *Mistake*. (With a capital M.)
* misc/hsearch_r.c (ENTRY): Make field `used' of type `unsigned int'
to prevent warnings.
* sysdeps/mach/getsysstats.c (__get_nprocs): Renamed from
__get_nproc.
(__get_nprocs_conf): Renamed from __get_nproc_conf.
* sysdeps/unix/sysv/linux/getsysstats.c (get_proc_path):
Initialize `result'.
Sat Sep 28 01:16:42 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/generic/strsep.c: Rename to __strsep and make strsep
weak alias.
* string/string.h: Add prototype for __strsep.
* misc/mntent_r.c: Use __strsep instead of strsep to keep
namespace clean.
* sysdeps/stub/nanosleep.c: Rename to __libc_nanosleep and make
__nanosleep and nanosleep weak aliases.
* sysdeps/unix/sysv/linux/syscalls.list: Add __nanosleep as weak
alias.
* sysdeps/unix/sysv/linux/sleep.c: Call __nanosleep instead of
nanosleep to keep namespace clean.
* sysdeps/posix/ttyname.c (ttyname): Add cast to prevent warning.
* sysdeps/posix/ttyname_r.c (ttyname_r): Likewise.
* sysdeps/posix/getcwd.c (__getcwd): Likewise.
* sysdeps/unix/nlist.c: Use ISO C definition since we don't always
have prototype.
* login/Makefile (headers): Add pty.h.
* login/pty.h: New file.
* sysdeps/generic/pty.h: Include <pty.h>.
* login/pututline_r.c: Add cast to prevent warning.
* gmon/gmon.c: Add prototype for __profile_frequency.
(monstartup): Add cast to prevent warning.
* sysdeps/generic/prof-freq.c: Change to use ISO C style definition.
* locale/programs/ld-time.c (time_output): Write `era' information
in correct order.
Sat Sep 28 00:11:08 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/syscalls.list: Add weak alias
`adjtimex'.
Set caller for mlock, mlockall, mremap, munlock, and munlockall
to EXTRA.
Reported by Matthias Urlichs <smurf@smurf.noris.de>.
1996-09-27 Paul Eggert <eggert@twinsun.com>
* strftime.c (strftime): Output incomplete formats like %E
at end of string.
1996-09-27 Paul Eggert <eggert@twinsun.com>
* strftime.c (strftime): Add support for %EC and %Ey.
Fix support for %EY. This uses the new _nl_get_era_entry function.
Fri Sep 27 14:12:27 1996 Ulrich Drepper <drepper@cygnus.com>
Security related patch by Elliot Lee <sopwith@redhat.com> and
David Holland <dholland@eecs.harvard.edu>.
* inet/rexec.c (rexec): Increase size of `num' array from 8 to 32.
* inet/ruserpass.c (ruserpass): Don't allow $HOME envvar to not exist.
* sysdeps/generic/getenv.c (__secure_getenv): New function. Return
NULL when programs runs with SUID or SGID enabled.
* sysdeps/stub/getenv.c: Make __secure_getenv an alias of getenv.
* stdlib/stdlib.h: Add prototype for __secure_getenv.
* locale/setlocale.c: Use __secure_getenv.
* resolv/res_init.c: Likewise.
* resolv/res_query.c: Likewise.
* inet/ruserpass.c: Likewise.
* sysdeps/posix/tempname.c: Likewise.
* malloc/mtrace.c: Likewise.
* catgets/catgets.c: Likewise.
Make temporary file handling functions reentrant.
* stdio-common/tmpnam.c: Rewrite to have own buffer to write
result to. The called __stdio_gen_tempname function must be
thread safe.
* stdio-common/tmpnam_r.c: New file.
* stdio/stdio.h: Add prototype for `tmpnam_r'.
Change prototype for __stdio_gen_tempname.
* stdio/libio.h: Likewise.
* sysdeps/posix/tempname.c: Add new parameters and use them instead
of static buffer.
Don't reset `indeces' when PID changed between calls.
Don't fail for long running programs when index counter once
reached the limit.
* sysdeps/stub/tempname.c: Likewise.
* stdio-common/tempnam.c: Provide local buffer as extra argument
to __stdio_gen_tempname. This makes this function reentrant.
* stdio-common/tmpfile.c: Likewise.
* stdio-common/temptest.c: Provide extra argument to
__stdio_gen_tempname.
* manual/filesys.texi: Describe tmpnam_r and add comments about
reentrancy of the functions.
* inet/rcmd.c: Fixed address length handling.
* sysdeps/posix/mk-stdiolim.c: Count final \0 byte in L_tmpnam value.
* time/strftime.c: Remove unused variables alt_digits and
end_alt_digits.
* sysdeps/unix/sysv/linux/sys/sysinfo.h: Correct prototype names
for get_nprocs and get_nprocs_conf.
* sysdeps/generic/sys/sysinfo.h: Likewise.
* stdlib/test-canon.c: Finally do the right fix.
* misc/Makefile: Only compile force-wrapper when compiling
reentrant libc.
Fri Sep 27 03:49:56 1996 Ulrich Drepper <drepper@cygnus.com>

View File

@ -79,7 +79,7 @@ catopen (const char *cat_name, int flag)
return (nl_catd) -1;
}
if (getenv ("NLSPATH") != NULL)
if (__secure_getenv ("NLSPATH") != NULL)
result->nlspath = __strdup (getenv ("NLSPATH"));
else
result->nlspath = __strdup (NLSPATH);

View File

@ -22,7 +22,7 @@
subdir := dirent
headers := dirent.h direntry.h
routines := opendir closedir readdir rewinddir \
routines := opendir closedir readdir readdir_r rewinddir \
seekdir telldir scandir alphasort \
getdents dirfd
distribute := dirstream.h

View File

@ -116,6 +116,13 @@ extern int closedir __P ((DIR * __dirp));
extern struct dirent *__readdir __P ((DIR * __dirp));
extern struct dirent *readdir __P ((DIR * __dirp));
#ifdef __USE_REENTRANT
/* Reentrant versio of `readdir'. Return in RESULT a pointer to the
next entry. */
extern int readdir_r __P ((DIR *__dirp, struct dirent *entry,
struct dirent **result));
#endif
/* Rewind DIRP to the beginning of the directory. */
extern void rewinddir __P ((DIR * __dirp));

37
dirent/readdir_r.c Normal file
View File

@ -0,0 +1,37 @@
/* readdir_r - Reentrant version of readdir.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <dirent.h>
/* Some systems have reentrancy problems with their `readdir'
implementation so they have an additional `readdir_r' version. The
GNU version does not have these problems but for compatibility
reasons we provide this function. It is simply a wrapper around
the normal function.
The actual definition of this functions varies very strong from
system to system. We chose to follow the POSIX version. */
int
readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
{
*result = readdir (dirp);
return *result != NULL ? 0 : -1;
}

View File

@ -45,6 +45,8 @@
#include <string.h>
#include <unistd.h>
extern int __profile_frequency (void);
struct __bb *__bb_head; /* Head of basic-block list or NULL. */
struct gmonparam _gmonparam = { GMON_PROF_OFF };
@ -128,7 +130,7 @@ DEFUN(monstartup, (lowpc, highpc), u_long lowpc AND u_long highpc)
p->tos[0].link = 0;
o = p->highpc - p->lowpc;
if (p->kcountsize < o)
if (p->kcountsize < (u_long) o)
{
#ifndef hp300
s_scale = ((float)p->kcountsize / o ) * SCALE_1_TO_1;

View File

@ -52,6 +52,9 @@ static char sccsid[] = "@(#)rcmd.c 8.3 (Berkeley) 3/26/94";
#include <ctype.h>
#include <string.h>
#define MIN(A, B) ((A) < (B) ? (A) : (B))
int __ivaliduser __P((FILE *, u_int32_t, const char *, const char *));
static int __icheckhost __P((u_int32_t, char *));
@ -92,7 +95,8 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
}
fcntl(s, F_SETOWN, pid);
sin.sin_family = hp->h_addrtype;
bcopy(hp->h_addr_list[0], &sin.sin_addr, hp->h_length);
bcopy(hp->h_addr_list[0], &sin.sin_addr,
MIN (sizeof (sin.sin_addr), hp->h_length));
sin.sin_port = rport;
if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0)
break;
@ -114,7 +118,8 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
__set_errno (oerrno);
perror(0);
hp->h_addr_list++;
bcopy(hp->h_addr_list[0], &sin.sin_addr, hp->h_length);
bcopy(hp->h_addr_list[0], &sin.sin_addr,
MIN (sizeof (sin.sin_addr), hp->h_length));
(void)fprintf(stderr, _("Trying %s...\n"),
inet_ntoa(sin.sin_addr));
continue;

View File

@ -91,9 +91,9 @@ retry:
(void) write(s, "", 1);
port = 0;
} else {
char num[8];
char num[32];
int s2, sin2len;
s2 = socket(AF_INET, SOCK_STREAM, 0);
if (s2 < 0) {
(void) close(s);

View File

@ -87,9 +87,14 @@ ruserpass(host, aname, apass)
int t, i, c, usedefault = 0;
struct stat stb;
hdir = getenv("HOME");
if (hdir == NULL)
hdir = ".";
hdir = __secure_getenv("HOME");
if (hdir == NULL) {
/* If we can't get HOME, fail instead of trying ".",
which is no improvement. This really should call
getpwuid(getuid()). */
/*hdir = ".";*/
return -1;
}
buf = alloca (strlen (hdir) + 8);

View File

@ -135,10 +135,14 @@ extern int sprintf __P ((char*, __const char* format, ...));
extern int sscanf __P ((__const char* string, __const char* format, ...));
extern FILE* tmpfile __P ((void));
extern char* tmpnam __P ((char*));
#ifdef __USE_REENTRANT
extern char* tmpnam_r __P ((char*));
#endif
#ifdef __USE_SVID
extern char *tempnam __P ((__const char *__dir, __const char *__pfx));
#endif
extern char *__stdio_gen_tempname __P ((__const char *dir, __const char *pfx,
extern char *__stdio_gen_tempname __P ((char *__buf, size_t bufsize,
__const char *dir, __const char *pfx,
int dir_search, size_t *lenptr,
FILE **streamptr));
extern int ungetc __P ((int c, FILE* fp));

View File

@ -548,11 +548,11 @@ time_output (struct localedef_t *locale, const char *output_path)
++last_idx;
#if __BYTE_ORDER == __LITTLE_ENDIAN
# define ERA_B1 time->era_entries
# define ERA_B2 time->era_entries_ob
#else
# define ERA_B1 time->era_entries_ob
# define ERA_B2 time->era_entries
#else
# define ERA_B1 time->era_entries
# define ERA_B2 time->era_entries_ob
#endif
idx[1 + last_idx] = idx[last_idx];
for (num = 0; num < time->cur_num_era; ++num)

View File

@ -227,6 +227,7 @@ setlocale (int category, const char *locale)
{
char *locale_path;
size_t locale_path_len;
const char *locpath_var;
char *composite;
/* Sanity check for CATEGORY argument. */
@ -248,15 +249,11 @@ setlocale (int category, const char *locale)
locale_path = NULL;
locale_path_len = 0;
if (!__libc_enable_secure)
{
char *locpath_var = getenv ("LOCPATH");
if (locpath_var != NULL && locpath_var[0] != '\0')
if (__argz_create_sep (locpath_var, ':',
&locale_path, &locale_path_len) != 0)
return NULL;
}
locpath_var = __secure_getenv ("LOCPATH");
if (locpath_var != NULL && locpath_var[0] != '\0')
if (__argz_create_sep (locpath_var, ':',
&locale_path, &locale_path_len) != 0)
return NULL;
if (__argz_append (&locale_path, &locale_path_len,
LOCALE_PATH, sizeof (LOCALE_PATH)) != 0)

View File

@ -22,7 +22,7 @@
subdir := login
headers := utmp.h utmpbits.h lastlog.h
headers := utmp.h utmpbits.h lastlog.h pty.h
routines := setutent endutent getutent getutid getutline pututline \
setutent_r endutent_r getutent_r getutid_r getutline_r \

43
login/pty.h Normal file
View File

@ -0,0 +1,43 @@
/* pty.h - Functions for pseudo TTY handlung.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _PTY_H
#define _PTY_H 1
#include <features.h>
#include <termios.h>
__BEGIN_DECLS
/* Create pseudo tty master slave pair with NAME and set terminal
attributes according to TERMP and WINP and return handles for both
ends in AMASTER and ASLAVE. */
extern int openpty __P ((int *__amaster, int *__aslave, char *__name,
struct termios *__termp, struct winsize *__winp));
/* Create child process and establish the slave pseudo terminal as the
child's controlling terminal. */
extern int forkpty __P ((int *__amaster, char *__name,
struct termios *__termp, struct winsize *__winp));
__END_DECLS
#endif /* pty.h */

View File

@ -96,7 +96,7 @@ __pututline_r (const struct utmp *id, struct utmp_data *utmp_data)
if (result >= 0)
/* Position file correctly. */
if (utmp_data->loc_utmp < (off_t) sizeof (struct utmp)
|| utmp_data->loc_utmp - sizeof (struct utmp) > st.st_size)
|| (off_t) (utmp_data->loc_utmp - sizeof (struct utmp)) > st.st_size)
/* Not located at any valid entry. Add at the end. */
{
result = lseek (utmp_data->ut_fd, 0L, SEEK_END);

View File

@ -261,7 +261,7 @@ are declared in the header file @file{dirent.h}.
@comment dirent.h
@comment POSIX.1
@deftp {Data Type} DIR
The @code{DIR} data type represents a directory stream.
The @code{DIR} data type represents a directory stream.
@end deftp
You shouldn't ever allocate objects of the @code{struct dirent} or
@ -333,7 +333,7 @@ The @var{dirstream} argument is not valid.
@comment POSIX.1
@deftypefun int closedir (DIR *@var{dirstream})
This function closes the directory stream @var{dirstream}. It returns
@code{0} on success and @code{-1} on failure.
@code{0} on success and @code{-1} on failure.
The following @code{errno} error conditions are defined for this
function:
@ -443,7 +443,7 @@ following @code{errno} error conditions are defined for this function:
@item EACCES
You are not allowed to write the directory in which the new link is to
be written.
@ignore
@ignore
Some implementations also require that the existing file be accessible
by the caller, and use this error to report failure for that reason.
@end ignore
@ -627,7 +627,7 @@ The function @code{unlink} is declared in the header file @file{unistd.h}.
This function returns @code{0} on successful completion, and @code{-1}
on error. In addition to the usual file name errors
(@pxref{File Name Errors}), the following @code{errno} error conditions are
(@pxref{File Name Errors}), the following @code{errno} error conditions are
defined for this function:
@table @code
@ -672,7 +672,7 @@ are two additional @code{errno} error conditions defined for
@table @code
@item ENOTEMPTY
@itemx EEXIST
The directory to be deleted is not empty.
The directory to be deleted is not empty.
@end table
These two error codes are synonymous; some systems use one, and some use
@ -851,20 +851,20 @@ This section contains information about how you can inquire about and
modify these attributes of files.
@menu
* Attribute Meanings:: The names of the file attributes,
* Attribute Meanings:: The names of the file attributes,
and what their values mean.
* Reading Attributes:: How to read the attributes of a file.
* Testing File Type:: Distinguishing ordinary files,
directories, links...
directories, links...
* File Owner:: How ownership for new files is determined,
and how to change it.
* Permission Bits:: How information about a file's access
mode is stored.
mode is stored.
* Access Permission:: How the system decides who can access a file.
* Setting Permissions:: How permissions for new files are assigned,
and how to change them.
* Testing File Access:: How to find out if your process can
access a file.
access a file.
* File Times:: About the time attributes of a file.
@end menu
@ -1079,7 +1079,7 @@ a socket, and so on. For information about the access permission,
@ref{Permission Bits}.
There are two predefined ways you can access the file type portion of
the file mode. First of all, for each type of file, there is a
the file mode. First of all, for each type of file, there is a
@dfn{predicate macro} which examines a file mode value and returns
true or false---is the file of that type, or not. Secondly, you can
mask out the rest of the file mode to get just a file type code.
@ -1260,7 +1260,7 @@ bits may not be appropriate for the new owner.) The other file
permission bits are not changed.
The return value is @code{0} on success and @code{-1} on failure.
In addition to the usual file name errors (@pxref{File Name Errors}),
In addition to the usual file name errors (@pxref{File Name Errors}),
the following @code{errno} error conditions are defined for this function:
@table @code
@ -1421,7 +1421,7 @@ This is equivalent to @samp{(S_IROTH | S_IWOTH | S_IXOTH)}.
@comment POSIX
@item S_ISUID
@vindex S_ISUID
This is the set-user-ID on execute bit, usually 04000.
This is the set-user-ID on execute bit, usually 04000.
@xref{How Change Persona}.
@comment sys/stat.h
@ -1462,7 +1462,7 @@ arose since the last run.
On some modern systems where the sticky bit has no useful meaning for an
executable file, you cannot set the bit at all for a non-directory.
If you try, @code{chmod} fails with @code{EFTYPE};
If you try, @code{chmod} fails with @code{EFTYPE};
@pxref{Setting Permissions}.
Some systems (particularly SunOS) have yet another use for the sticky
@ -1527,7 +1527,7 @@ The bits that are set in the file creation mask identify permissions
that are always to be disabled for newly created files. For example, if
you set all the ``other'' access bits in the mask, then newly created
files are not accessible at all to processes in the ``other''
category, even if the @var{mode} argument specified to the creation
category, even if the @var{mode} argument specified to the creation
function would permit such access. In other words, the file creation
mask is the complement of the ordinary access permissions you want to
grant.
@ -1671,7 +1671,7 @@ files off-limits to ordinary users---for example, to modify
@file{/etc/passwd}. Programs designed to be run by ordinary users but
access such files use the setuid bit feature so that they always run
with @code{root} as the effective user ID.
Such a program may also access files specified by the user, files which
conceptually are being accessed explicitly by the user. Since the
program runs as @code{root}, it has permission to access whatever file
@ -1776,7 +1776,7 @@ Argument that means, test for existence of the file.
Each file has three timestamps associated with it: its access time,
its modification time, and its attribute modification time. These
correspond to the @code{st_atime}, @code{st_mtime}, and @code{st_ctime}
members of the @code{stat} structure; see @ref{File Attributes}.
members of the @code{stat} structure; see @ref{File Attributes}.
All of these times are represented in calendar time format, as
@code{time_t} objects. This data type is defined in @file{time.h}.
@ -1832,7 +1832,7 @@ named @var{filename}.
If @var{times} is a null pointer, then the access and modification times
of the file are set to the current time. Otherwise, they are set to the
values from the @code{actime} and @code{modtime} members (respectively)
of the @code{utimbuf} structure pointed at by @var{times}.
of the @code{utimbuf} structure pointed at by @var{times}.
The attribute modification time for the file is set to the current time
in either case (since changing the timestamps is itself a modification
@ -1938,12 +1938,14 @@ this file, you must remove the old file explicitly first.
If you need to use a temporary file in your program, you can use the
@code{tmpfile} function to open it. Or you can use the @code{tmpnam}
function make a name for a temporary file and then open it in the usual
way with @code{fopen}.
(better: @code{tmpnam_r}) function make a name for a temporary file and
then open it in the usual way with @code{fopen}.
The @code{tempnam} function is like @code{tmpnam} but lets you choose
what directory temporary files will go in, and something about what
their file names will look like.
their file names will look like. Important for multi threaded programs
is that @code{tempnam} is reentrant while @code{tmpnam} is not since it
returns a pointer to a static buffer.
These facilities are declared in the header file @file{stdio.h}.
@pindex stdio.h
@ -1956,6 +1958,8 @@ calling @code{fopen} with mode @code{"wb+"}. The file is deleted
automatically when it is closed or when the program terminates. (On
some other ANSI C systems the file may fail to be deleted if the program
terminates abnormally).
This function is reentrant.
@end deftypefun
@comment stdio.h
@ -1964,14 +1968,26 @@ terminates abnormally).
This function constructs and returns a file name that is a valid file
name and that does not name any existing file. If the @var{result}
argument is a null pointer, the return value is a pointer to an internal
static string, which might be modified by subsequent calls. Otherwise,
the @var{result} argument should be a pointer to an array of at least
@code{L_tmpnam} characters, and the result is written into that array.
static string, which might be modified by subsequent calls and therefore
makes this function non-reentrant. Otherwise, the @var{result} argument
should be a pointer to an array of at least @code{L_tmpnam} characters,
and the result is written into that array.
It is possible for @code{tmpnam} to fail if you call it too many times.
This is because the fixed length of a temporary file name gives room for
only a finite number of different names. If @code{tmpnam} fails, it
returns a null pointer.
It is possible for @code{tmpnam} to fail if you call it too many times
without removing previously created files. This is because the fixed
length of a temporary file name gives room for only a finite number of
different names. If @code{tmpnam} fails, it returns a null pointer.
@end deftypefun
@comment stdio.h
@comment GNU
@deftypefun {char *} tmpnam_r (char *@var{result})
This function is nearly identical to the @code{tmpnam} function. But it
does not allow @var{result} to be a null pointer. In the later case a
null pointer is returned.
This function is reentrant because the non-reentrant situation of
@code{tmpnam} cannot happen here.
@end deftypefun
@comment stdio.h
@ -2006,13 +2022,16 @@ prefix for the file name. The return value is a string newly allocated
with @code{malloc}; you should release its storage with @code{free} when
it is no longer needed.
Because the string is dynamically allocated this function is reentrant.
The directory prefix for the temporary file name is determined by testing
each of the following, in sequence. The directory must exist and be
writable.
@itemize @bullet
@item
The environment variable @code{TMPDIR}, if it is defined.
The environment variable @code{TMPDIR}, if it is defined. For security
reasons this only happens if the program is not SUID or SGID enabled.
@item
The @var{dir} argument, if it is not a null pointer.

View File

@ -55,7 +55,12 @@ routines := brk sbrk sstk ioctl \
efgcvt efgcvt_r qefgcvt qefgcvt_r \
hsearch hsearch_r tsearch lsearch \
err error ustat \
getsysstats force-wrapper
getsysstats
ifneq (,$(filter %REENTRANT, $(defines)))
routines += force-wrapper
endif
aux := init-misc
distribute := bsd-compat.c
extra-objs := bsd-compat.o

View File

@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. */
which describes the current status. */
typedef struct _ENTRY
{
int used;
unsigned int used;
ENTRY entry;
}
_ENTRY;

View File

@ -74,16 +74,16 @@ __getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
/* skip empty lines and comment lines: */
} while (head[0] == '\0' || head[0] == '#');
mp->mnt_fsname = strsep (&head, " \t") ?: (char *) "";
mp->mnt_fsname = __strsep (&head, " \t") ?: (char *) "";
if (head)
head += strspn (head, " \t");
mp->mnt_dir = strsep (&head, " \t") ?: (char *) "";
mp->mnt_dir = __strsep (&head, " \t") ?: (char *) "";
if (head)
head += strspn (head, " \t");
mp->mnt_type = strsep (&head, " \t") ?: (char *) "";
mp->mnt_type = __strsep (&head, " \t") ?: (char *) "";
if (head)
head += strspn (head, " \t");
mp->mnt_opts = strsep (&head, " \t") ?: (char *) "";
mp->mnt_opts = __strsep (&head, " \t") ?: (char *) "";
switch (head ? sscanf (head, " %d %d ", &mp->mnt_freq, &mp->mnt_passno) : 0)
{
case 0:

View File

@ -501,7 +501,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
++had_error;
continue;
}
strcpy (bp, tbuf);
strcpy (bp, tbuf); /* Cannot overflow. */
result->h_name = bp;
bp += n;
linebuflen -= n;
@ -524,7 +524,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
++had_error;
continue;
}
strcpy (bp, tbuf);
strcpy (bp, tbuf); /* Cannot overflow. */
tname = bp;
bp += n;
linebuflen -= n;
@ -650,7 +650,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
n = strlen (qname) + 1; /* For the \0. */
if (n > linebuflen)
goto try_again;
strcpy (bp, qname);
strcpy (bp, qname); /* Cannot overflow. */
result->h_name = bp;
bp += n;
linebuflen -= n;

View File

@ -1046,7 +1046,7 @@ const char *
p_time(value)
u_int32_t value;
{
static char nbuf[40];
static char nbuf[60];
int secs, mins, hours, days;
register char *p;

View File

@ -216,7 +216,7 @@ res_init()
_res.pfcode = 0;
/* Allow user to override the local domain definition */
if ((cp = getenv("LOCALDOMAIN")) != NULL) {
if ((cp = __secure_getenv("LOCALDOMAIN")) != NULL) {
(void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
haveenv++;
@ -421,7 +421,7 @@ res_init()
#endif /* !RFC1535 */
}
if ((cp = getenv("RES_OPTIONS")) != NULL)
if ((cp = __secure_getenv("RES_OPTIONS")) != NULL)
res_setoptions(cp, "env");
_res.options |= RES_INIT;
return (0);

View File

@ -363,7 +363,7 @@ hostalias(name)
if (_res.options & RES_NOALIASES)
return (NULL);
file = getenv("HOSTALIASES");
file = __secure_getenv("HOSTALIASES");
if (file == NULL || (fp = fopen(file, "r")) == NULL)
return (NULL);
setbuf(fp, NULL);

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1993 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1993, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
@ -32,19 +31,20 @@ Cambridge, MA 02139, USA. */
P_tmpdir is tried and finally "/tmp". The storage for the filename
is allocated by `malloc'. */
char *
DEFUN(tempnam, (dir, pfx), CONST char *dir AND CONST char *pfx)
tempnam (const char *dir, const char *pfx)
{
char buf[FILENAME_MAX];
size_t len;
register char *s;
register char *t = __stdio_gen_tempname(dir, pfx, 1, &len, (FILE **) NULL);
register char *t = __stdio_gen_tempname (buf, sizeof (buf), dir, pfx, 1,
&len, (FILE **) NULL);
if (t == NULL)
return NULL;
s = (char *) malloc(len);
s = (char *) malloc (len);
if (s == NULL)
return NULL;
(void) memcpy(s, t, len);
return s;
return (char *) memcpy (s, t, len);
}

View File

@ -7,12 +7,13 @@ char *files[500];
int
main ()
{
char buf[FILENAME_MAX];
char *fn;
FILE *fp;
int i;
for (i = 0; i < 500; i++) {
fn = __stdio_gen_tempname((CONST char *) NULL,
fn = __stdio_gen_tempname(buf, sizeof (buf), (CONST char *) NULL,
"file", 0, (size_t *) NULL, (FILE **) NULL);
if (fn == NULL) {
printf ("__stdio_gen_tempname failed\n");

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1993 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1993, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stdio.h>
@ -25,12 +24,13 @@ Cambridge, MA 02139, USA. */
If we couldn't generate a unique filename or the file couldn't
be opened, NULL is returned. */
FILE *
DEFUN_VOID(tmpfile)
tmpfile ()
{
char buf[FILENAME_MAX];
char *filename;
FILE *f;
filename = __stdio_gen_tempname ((char *) NULL, "tmpf", 0,
filename = __stdio_gen_tempname (buf, sizeof (buf), (char *) NULL, "tmpf", 0,
(size_t *) NULL, &f);
if (filename == NULL)
return NULL;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1993 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1993, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -16,27 +16,34 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
/* Generate a unique filename in P_tmpdir. */
/* Generate a unique filename in P_tmpdir.
This function is *not* thread safe! */
char *
DEFUN(tmpnam, (s), register char *s)
tmpnam (char *s)
{
register char *t = __stdio_gen_tempname((CONST char *) NULL,
(CONST char *) NULL, 0,
(size_t *) NULL, (FILE **) NULL);
/* By using two buffers we manage to be thread safe in the case
where S != NULL. */
static char buf[L_tmpnam];
char *tmpbuf[L_tmpnam];
char *result;
if (t == NULL)
return NULL;
/* In the following call we use the buffer pointed to by S if
non-NULL although we don't know the size. But we limit the size
to FILENAME_MAX characters in any case. */
result = __stdio_gen_tempname (s ?: tmpbuf, L_tmpnam, (const char *) NULL,
(const char *) NULL, 0,
(size_t *) NULL, (FILE **) NULL);
if (s != NULL)
(void) strcpy(s, t);
else
s = t;
if (result != NULL && s == NULL)
{
memcpy (buf, result, L_tmpnam);
result = buf;
}
return s;
return result;
}

37
stdio-common/tmpnam_r.c Normal file
View File

@ -0,0 +1,37 @@
/* Copyright (C) 1991, 1993, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <string.h>
/* Generate a unique filename in P_tmpdir. If S is NULL return NULL.
This makes this function thread safe. */
char *
tmpnam_r (char *s)
{
if (s == NULL)
return NULL;
/* In the following call we use the buffer pointed to by S if
non-NULL although we don't know the size. But we limit the size
to L_tmpnam characters in any case. */
return __stdio_gen_tempname (s, L_tmpnam, (const char *) NULL,
(const char *) NULL, 0,
(size_t *) NULL, (FILE **) NULL);
}

View File

@ -156,7 +156,8 @@ extern int __stdio_open __P ((__const char *__file, __io_mode __m,
/* Put out an error message for when stdio needs to die. */
extern void __stdio_errmsg __P ((__const char *__msg, size_t __len));
/* Generate a unique file name (and possibly open it with mode "w+b"). */
extern char *__stdio_gen_tempname __P ((__const char *__dir,
extern char *__stdio_gen_tempname __P ((char *__buf, size_t __bufsize,
__const char *__dir,
__const char *__pfx,
int __dir_search,
size_t *__lenptr,
@ -294,6 +295,12 @@ extern FILE *tmpfile __P ((void));
/* Generate a temporary filename. */
extern char *tmpnam __P ((char *__s));
#ifdef __USE_REENTRANT
/* This is the reentrant variant of `tmpnam'. The only difference is
that it does not allow S to be NULL. */
extern char *tmpnam_r __P ((char *__s));
#endif
#ifdef __USE_SVID
/* Generate a unique temporary filename using up to five characters of PFX

View File

@ -361,6 +361,10 @@ extern void exit __P ((int __status)) __attribute__ ((__noreturn__));
/* Return the value of envariable NAME, or NULL if it doesn't exist. */
extern char *getenv __P ((__const char *__name));
/* This function is similar to the above but returns NULL if the
programs is running with SUID or SGID enabled. */
extern char *__secure_getenv __P ((__const char *__name));
#ifdef __USE_SVID
/* The SVID says this is in <stdio.h>, but this seems a better place. */
/* Put STRING, which is of the form "NAME=VALUE", in the environment.

View File

@ -107,7 +107,7 @@ check_path (const char * result, const char * expected)
}
void
int
main (int argc, char ** argv)
{
char * result;
@ -117,12 +117,12 @@ main (int argc, char ** argv)
getcwd (cwd, sizeof(buf));
cwd_len = strlen (cwd);
for (i = 0; i < sizeof (symlinks) / sizeof (symlinks[0]); ++i)
for (i = 0; i < (int) (sizeof (symlinks) / sizeof (symlinks[0])); ++i)
symlink (symlinks[i].value, symlinks[i].name);
fd = open("doesExist", O_CREAT | O_EXCL, 0777);
for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
for (i = 0; i < (int) (sizeof (tests) / sizeof (tests[0])); ++i)
{
buf[0] = '\0';
result = realpath (tests[i].in, buf);
@ -148,7 +148,7 @@ main (int argc, char ** argv)
if (!tests[i].out && errno != tests[i].error)
{
printf ("%s: flunked test %d (expected errno %d, got %d)\n",
argv[0], i, tests[i].errno, errno);
argv[0], i, tests[i].error, errno);
++errors;
continue;
}
@ -165,17 +165,15 @@ main (int argc, char ** argv)
if (fd >= 0)
unlink("doesExist");
for (i = 0; i < sizeof (symlinks) / sizeof (symlinks[0]); ++i)
for (i = 0; i < (int) (sizeof (symlinks) / sizeof (symlinks[0])); ++i)
unlink (symlinks[i].name);
if (errors == 0)
{
puts ("No errors.");
exit (EXIT_SUCCESS);
}
else
if (errors != 0)
{
printf ("%d errors.\n", errors);
exit (EXIT_FAILURE);
}
puts ("No errors.");
return EXIT_SUCCESS;
}

View File

@ -209,6 +209,7 @@ extern int strncasecmp __P ((__const char *__s1, __const char *__s2,
/* Return the next DELIM-delimited token from *STRINGP,
terminating it with a '\0', and update *STRINGP to point past it. */
extern char *__strsep __P ((char **__stringp, __const char *__delim));
extern char *strsep __P ((char **__stringp, __const char *__delim));
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
@ -28,17 +27,29 @@ Cambridge, MA 02139, USA. */
/* Return the value of the environment variable NAME. */
char *
DEFUN(getenv, (name), register CONST char *name)
getenv (name)
const char *name;
{
register CONST size_t len = strlen(name);
register char **ep;
const size_t len = strlen (name);
char **ep;
if (__environ == NULL)
return NULL;
for (ep = __environ; *ep != NULL; ++ep)
if (!strncmp(*ep, name, len) && (*ep)[len] == '=')
if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
return &(*ep)[len + 1];
return NULL;
}
/* Some programs and especially the libc itself have to be careful
what values to accept from the environment. This special version
checks for SUID or SGID first before doing any work. */
char *
__secure_getenv (name)
const char *name;
{
return __libc_enable_secure ? NULL : getenv (name);
}

View File

@ -37,7 +37,7 @@
#include <sys/time.h>
int
__profile_frequency ()
__profile_frequency (void)
{
/*
* Discover the tick frequency of the machine if something goes wrong,

View File

@ -46,6 +46,7 @@ static char sccsid[] = "@(#)pty.c 8.1 (Berkeley) 6/4/93";
#include <stdio.h>
#include <string.h>
#include <grp.h>
#include <pty.h>
int
openpty(amaster, aslave, name, termp, winp)
@ -105,7 +106,7 @@ forkpty(amaster, name, termp, winp)
struct termios *termp;
struct winsize *winp;
{
extern int login_tty();
extern int login_tty __P ((int fd));
int master, slave, pid;
if (openpty(&master, &slave, name, termp, winp) == -1)

View File

@ -19,7 +19,7 @@ Boston, MA 02111-1307, USA. */
#include <string.h>
char *
strsep (char **stringp, const char *delim)
__strsep (char **stringp, const char *delim)
{
char *begin, *end;
@ -41,3 +41,4 @@ strsep (char **stringp, const char *delim)
return begin;
}
weak_alias (__strsep, strsep)

View File

@ -22,12 +22,12 @@ Boston, MA 02111-1307, USA. */
#include <features.h>
/* Return number of configured processors. */
extern int __get_nproc_conf __P ((void));
extern int get_nproc_conf __P ((void));
extern int __get_nprocs_conf __P ((void));
extern int get_nprocs_conf __P ((void));
/* Return number of available processors. */
extern int __get_nproc __P ((void));
extern int get_nproc __P ((void));
extern int __get_nprocs __P ((void));
extern int get_nprocs __P ((void));
/* Return number of physical pages of memory in the system. */

View File

@ -298,7 +298,7 @@ __getcwd (buf, size)
(d->d_name[1] == '\0' ||
(d->d_name[1] == '.' && d->d_name[2] == '\0')))
continue;
if (mount_point || d->d_ino == thisino)
if (mount_point || (ino_t) d->d_ino == thisino)
{
char name[dotlist + dotsize - dotp + 1 + _D_ALLOC_NAMLEN (d)];
memcpy (name, dotp, dotlist + dotsize - dotp);
@ -326,7 +326,7 @@ __getcwd (buf, size)
{
size_t namlen = _D_EXACT_NAMLEN (d);
if (pathp - path < namlen)
if ((size_t) (pathp - path) < namlen)
{
if (buf != NULL)
{

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -23,7 +23,7 @@ main()
{
/* These values correspond to the code in sysdeps/posix/tempname.c.
Change the values here if you change that code. */
printf("#define L_tmpnam %u\n", sizeof("/usr/tmp/") + 8);
printf("#define L_tmpnam %u\n", sizeof("/usr/tmp/") + 9);
printf("#define TMP_MAX %u\n", 62 * 62 * 62);
puts ("#ifdef __USE_POSIX");
@ -36,7 +36,7 @@ main()
is the case in the Hurd). ANSI still requires that FOPEN_MAX and
FILENAME_MAX be defined, however. */
printf("#define FOPEN_MAX %u\n",
printf("#define FOPEN_MAX %u\n",
#ifdef OPEN_MAX
OPEN_MAX
@ -51,7 +51,7 @@ main()
);
printf("#define FILENAME_MAX %u\n",
printf("#define FILENAME_MAX %u\n",
#ifdef PATH_MAX
PATH_MAX
#else

View File

@ -81,21 +81,24 @@ static const char letters[] =
existing file will be returned. When the cycle reaches its end
(12345ZZZ), NULL is returned. */
char *
__stdio_gen_tempname (const char *dir, const char *pfx, int dir_search,
size_t *lenptr, FILE **streamptr)
__stdio_gen_tempname (char *buf, size_t bufsize, const char *dir,
const char *pfx, int dir_search, size_t *lenptr,
FILE **streamptr)
{
int saverrno = errno;
static const char tmpdir[] = P_tmpdir;
static size_t indices[2];
size_t *idx;
static char buf[FILENAME_MAX];
#if 0
static pid_t oldpid = (pid_t) 0;
#endif
pid_t pid = __getpid();
register size_t len, plen, dlen;
int wrapped;
if (dir_search)
{
register const char *d = getenv ("TMPDIR");
register const char *d = __secure_getenv ("TMPDIR");
if (d != NULL && !diraccess (d))
d = NULL;
if (d == NULL && dir != NULL && diraccess (dir))
@ -133,34 +136,51 @@ __stdio_gen_tempname (const char *dir, const char *pfx, int dir_search,
dir = tmpdir;
idx = &indices[(plen == 0 && dir == tmpdir) ? 1 : 0];
#if 0
/* XXX Is this ever useful??? At least when using a thread package
which uses different PIDs for the threads it is not helpful. */
if (pid != oldpid)
{
oldpid = pid;
indices[0] = indices[1] = 0;
}
#endif
wrapped = 0; /* We have not yet wrapped around the index counter. */
len = dlen + 1 + plen + 5 + 3;
while (*idx < ((sizeof (letters) - 1) * (sizeof (letters) - 1) *
(sizeof (letters) - 1)))
while (1)
{
const size_t i = (*idx)++;
const size_t i;
if (*idx >= ((sizeof (letters) - 1) * (sizeof (letters) - 1) *
(sizeof (letters) - 1)))
{
if (wrapped)
/* We really wrapped around this call. Can't believe it
but nevertheless stop the endless loop. */
break;
indices[0] = indices[1] = 0;
wrapped = 1;
}
i = (*idx)++;
/* Construct a file name and see if it already exists.
We use a single counter in *IDX to cycle each of three
character positions through each of 62 possible letters. */
if (sizeof (buf) < len ||
sprintf (buf, "%.*s/%.*s%.5d%c%c%c",
(int) dlen, dir, (int) plen,
pfx, pid % 100000,
letters[i % (sizeof (letters) - 1)],
letters[(i / (sizeof (letters) - 1))
% (sizeof (letters) - 1)],
letters[(i / ((sizeof (letters) - 1) *
(sizeof (letters) - 1)))
% (sizeof (letters) - 1)]
) != (int) len)
if (__snprintf (buf, bufsize, "%.*s/%.*s%.5d%c%c%c",
(int) dlen, dir, (int) plen,
pfx, pid % 100000,
letters[i % (sizeof (letters) - 1)],
letters[(i / (sizeof (letters) - 1))
% (sizeof (letters) - 1)],
letters[(i / ((sizeof (letters) - 1) *
(sizeof (letters) - 1)))
% (sizeof (letters) - 1)]
) != (int) len)
return NULL;
if (streamptr != NULL)
@ -176,7 +196,7 @@ __stdio_gen_tempname (const char *dir, const char *pfx, int dir_search,
struct _IO_FILE_plus *fp;
fp = (struct _IO_FILE_plus *)
malloc(sizeof (struct _IO_FILE_plus));
malloc (sizeof (struct _IO_FILE_plus));
if (fp == NULL)
{
/* We lost trying to create a stream (out of memory?).

View File

@ -57,7 +57,7 @@ ttyname (fd)
return NULL;
while ((d = readdir (dirstream)) != NULL)
if (d->d_fileno == myino)
if ((ino_t) d->d_fileno == myino)
{
size_t dlen = _D_ALLOC_NAMLEN (d);
if (sizeof (dev) + dlen > namelen)

View File

@ -72,7 +72,7 @@ __ttyname_r (fd, buf, buflen)
buflen -= sizeof (dev);
while ((d = readdir (dirstream)) != NULL)
if (d->d_fileno == myino)
if ((ino_t) d->d_fileno == myino)
{
char *cp;

View File

@ -27,6 +27,7 @@ getenv (name)
__set_errno (ENOSYS);
return NULL;
}
strong_alias (getenv, __secure_getenv)
stub_warning (getenv)

View File

@ -22,9 +22,13 @@ Boston, MA 02111-1307, USA. */
/* Pause execution for a number of nanoseconds. */
int
nanosleep (const struct timespec *requested_time, struct timespec *remaining)
__libc_nanosleep (const struct timespec *requested_time,
struct timespec *remaining)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (nanosleep)
weak_alias (__libc_nanosleep, __nanosleep)
weak_alias (__libc_nanosleep, nanosleep)

View File

@ -26,7 +26,9 @@ Cambridge, MA 02139, USA. */
Return the generated filename or NULL if one could not
be generated, putting the length of the string in *LENPTR. */
char *
__stdio_gen_tempname (dir, pfx, dir_search, lenptr)
__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr)
char *buf;
size_t bufsize;
const char *dir;
const char *pfx;
int dir_search;

View File

@ -26,9 +26,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
which is terminated by an element with a NULL `n_un.n_name' member,
and fill in the elements of NL. */
int
nlist (file, nl)
const char *file;
struct nlist *nl;
nlist (const char *file, struct nlist *nl)
{
FILE *f;
struct exec header;

View File

@ -33,14 +33,11 @@ get_proc_path (char *buffer, size_t bufsize)
FILE *fp;
struct mntent mount_point;
struct mntent *entry;
char *result;
char *result = NULL;
/* First find the mount point of the proc filesystem. */
fp = __setmntent (_PATH_MNTTAB, "r");
if (fp == NULL)
/* Cannot find mount table file. */
result = NULL;
else
if (fp != NULL)
{
while ((entry = __getmntent_r (fp, &mount_point, buffer, bufsize))
!= NULL)
@ -108,7 +105,7 @@ weak_alias (__get_nprocs, get_nprocs)
/* As far as I know Linux has no separate numbers for configured and
available processors. So make the `get_nprocs_conf' function an
prototype. */
alias. */
strong_alias (__get_nprocs, __get_nprocs_conf)
weak_alias (__get_nprocs, get_nprocs_conf)

View File

@ -26,7 +26,7 @@ sleep (unsigned int seconds)
struct timespec ts = { tv_sec: (long int) seconds, tv_nsec: 0 };
unsigned int result;
if (nanosleep (&ts, &ts) == 0)
if (__nanosleep (&ts, &ts) == 0)
result = 0;
else
/* Round remaining time. */

View File

@ -29,12 +29,12 @@ extern int sysinfo __P ((struct sysinfo *__info));
/* Return number of configured processors. */
extern int __get_nproc_conf __P ((void));
extern int get_nproc_conf __P ((void));
extern int __get_nprocs_conf __P ((void));
extern int get_nprocs_conf __P ((void));
/* Return number of available processors. */
extern int __get_nproc __P ((void));
extern int get_nproc __P ((void));
extern int __get_nprocs __P ((void));
extern int get_nprocs __P ((void));
/* Return number of physical pages of memory in the system. */

View File

@ -1,6 +1,6 @@
# File name Caller Syscall name # args Strong name Weak names
adjtimex adjtime adjtimex 1 __adjtimex
adjtimex adjtime adjtimex 1 __adjtimex adjtimex
bdflush EXTRA bdflush 2 bdflush
create_module EXTRA create_module 3 create_module
delete_module EXTRA delete_module 3 delete_module
@ -20,13 +20,13 @@ iopl - iopl 1 iopl
ipc msgget ipc 5 __ipc
klogctl EXTRA syslog 3 klogctl
llseek EXTRA _llseek 5 llseek
mlock - mlock 2 __mlock mlock
mlockall - mlockall 1 __mlockall mlockall
mlock EXTRA mlock 2 __mlock mlock
mlockall EXTRA mlockall 1 __mlockall mlockall
mount EXTRA mount 5 __mount mount
mremap - mremap 4 __mremap mremap
munlock - munlock 2 __munlock munlock
munlockall - munlockall 0 __munlockall munlockall
nanosleep - nanosleep 2 __libc_nanosleep nanosleep
mremap EXTRA mremap 4 __mremap mremap
munlock EXTRA munlock 2 __munlock munlock
munlockall EXTRA munlockall 0 __munlockall munlockall
nanosleep - nanosleep 2 __libc_nanosleep __nanosleep nanosleep
pause - pause 0 __libc_pause pause
personality init-first personality 1 __personality personality
pipe - pipe 1 __pipe pipe

View File

@ -24,6 +24,7 @@ Cambridge, MA 02139, USA. */
# define HAVE_LIMITS_H 1
# define HAVE_MBLEN 1
# define HAVE_MBRLEN 1
# define HAVE_STRUCT_ERA_ENTRY 1
# define HAVE_TM_GMTOFF 1
# define HAVE_TM_ZONE 1
# define MULTIBYTE_IS_FORMAT_SAFE 1
@ -260,12 +261,9 @@ strftime (s, maxsize, format, tp)
const char *const f_month = _NL_CURRENT (LC_TIME, MON_1 + tp->tm_mon);
const char *const ampm = _NL_CURRENT (LC_TIME,
hour12 > 11 ? PM_STR : AM_STR);
size_t aw_len = strlen(a_wkday);
size_t am_len = strlen(a_month);
size_t aw_len = strlen (a_wkday);
size_t am_len = strlen (a_month);
size_t ap_len = strlen (ampm);
const char *alt_digits = _NL_CURRENT (LC_TIME, ALT_DIGITS);
const char *end_alt_digits = _NL_CURRENT (LC_TIME, ALT_DIGITS + 1);
#else
const char *const f_wkday = weekday_name[tp->tm_wday];
const char *const f_month = month_name[tp->tm_mon];
@ -423,9 +421,6 @@ strftime (s, maxsize, format, tp)
#define DO_NUMBER_SPACEPAD(d, v) \
digits = d; number_value = v; goto do_number_spacepad
case '\0': /* GNU extension: % at end of format. */
--f;
/* Fall through. */
case '%':
if (modifier != 0)
goto bad_format;
@ -480,8 +475,17 @@ strftime (s, maxsize, format, tp)
case 'C': /* POSIX.2 extension. */
if (modifier == 'O')
goto bad_format;
#ifdef _NL_CURRENT
/* XXX %EC is not implemented yet. */
#if HAVE_STRUCT_ERA_ENTRY
if (modifier == 'E')
{
struct era_entry *era = _nl_get_era_entry (tp);
if (era)
{
size_t len = strlen (era->name_fmt);
cpy (len, era->name_fmt);
break;
}
}
#endif
{
int year = tp->tm_year + TM_YEAR_BASE;
@ -769,10 +773,16 @@ strftime (s, maxsize, format, tp)
DO_NUMBER (1, tp->tm_wday);
case 'Y':
#ifdef _NL_CURRENT
if (modifier == 'E'
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_YEAR)) != '\0')
goto subformat;
#if HAVE_STRUCT_ERA_ENTRY
if (modifier == 'E')
{
struct era_entry *era = _nl_get_era_entry (tp);
if (era)
{
subfmt = strchr (era->name_fmt, '\0') + 1;
goto subformat;
}
}
#endif
if (modifier == 'O')
goto bad_format;
@ -780,8 +790,17 @@ strftime (s, maxsize, format, tp)
DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE);
case 'y':
#ifdef _NL_CURRENT
/* XXX %Ey is not implemented yet. */
#if HAVE_STRUCT_ERA_ENTRY
if (modifier == 'E')
{
struct era_entry *era = _nl_get_era_entry (tp);
if (era)
{
int delta = tp->tm_year - era->start_date[0];
DO_NUMBER (1, (era->offset
+ (era->direction == '-' ? -delta : delta)));
}
}
#endif
DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100);
@ -837,6 +856,9 @@ strftime (s, maxsize, format, tp)
DO_NUMBER (4, (diff / 60) * 100 + diff % 60);
}
case '\0': /* GNU extension: % at end of format. */
--f;
/* Fall through. */
default:
/* Unknown format; output the format, including the '%',
since this is most likely the right thing to do if a
@ -844,7 +866,7 @@ strftime (s, maxsize, format, tp)
bad_format:
{
int flen;
for (flen = 2; f[1 - flen] != '%'; flen++)
for (flen = 1; f[1 - flen] != '%'; flen++)
continue;
cpy (flen, &f[1 - flen]);
}

View File

@ -265,6 +265,8 @@ extern int dysize __P ((int __year));
#ifdef __USE_POSIX
/* Pause execution for a number of nanoseconds. */
extern int __nanosleep __P ((__const struct timespec *__requested_time,
struct timespec *__remaining));
extern int nanosleep __P ((__const struct timespec *__requested_time,
struct timespec *__remaining));
#endif