1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
* sysdeps/generic/utmp_file.c: Use not-cancelable syscalls all
	over the place.  It would be allowed to have these fucntions as
	cancellation points but the cleanup would be ugly and a lot of
	work.

	* sysdeps/generic/not-cancel.h (fcntl_not_cancel): Define.
	* sysdeps/unix/sysv/linux/not-cancel.h (fcntl_not_cancel): Define.

	* include/fcntl.h (__fcntl_nocancel): Declare.
	* sysdeps/unix/sysv/linux/fcntl.c: New file.
	* sysdeps/unix/sysv/linux/i386/fcntl.c (__libc_fcntl): Only enable
	cancellation if absolutely needed.
	(__fcntl_nocancel): Define.

	* posix/unistd.h (gethostid): Remove __THROW.  Clarify comment.
	* sysdeps/unix/sysv/linux/Makefile (CFLAGS-gethostid.c): Add
	-fexceptions.
	* sysdeps/unix/sysv/linux/gethostid.c (gethostid): Use
	extend_alloca.

	* resolv/res_init.c (__res_nclose): Use close_not_cancel_no_status
	instead of __close.
This commit is contained in:
Ulrich Drepper
2003-09-04 14:08:24 +00:00
parent a452e4e629
commit ce42435cab
12 changed files with 169 additions and 67 deletions

View File

@ -1,5 +1,28 @@
2003-09-04 Ulrich Drepper <drepper@redhat.com> 2003-09-04 Ulrich Drepper <drepper@redhat.com>
* sysdeps/generic/utmp_file.c: Use not-cancelable syscalls all
over the place. It would be allowed to have these fucntions as
cancellation points but the cleanup would be ugly and a lot of
work.
* sysdeps/generic/not-cancel.h (fcntl_not_cancel): Define.
* sysdeps/unix/sysv/linux/not-cancel.h (fcntl_not_cancel): Define.
* include/fcntl.h (__fcntl_nocancel): Declare.
* sysdeps/unix/sysv/linux/fcntl.c: New file.
* sysdeps/unix/sysv/linux/i386/fcntl.c (__libc_fcntl): Only enable
cancellation if absolutely needed.
(__fcntl_nocancel): Define.
* posix/unistd.h (gethostid): Remove __THROW. Clarify comment.
* sysdeps/unix/sysv/linux/Makefile (CFLAGS-gethostid.c): Add
-fexceptions.
* sysdeps/unix/sysv/linux/gethostid.c (gethostid): Use
extend_alloca.
* resolv/res_init.c (__res_nclose): Use close_not_cancel_no_status
instead of __close.
* nss/getXXbyYY.c (FUNCTION_NAME): Add a few casts. Remove * nss/getXXbyYY.c (FUNCTION_NAME): Add a few casts. Remove
unnecessary errno handling. unnecessary errno handling.

View File

@ -9,6 +9,7 @@ extern int __libc_open (const char *file, int oflag, ...);
libc_hidden_proto (__libc_open) libc_hidden_proto (__libc_open)
extern int __libc_creat (const char *file, mode_t mode); extern int __libc_creat (const char *file, mode_t mode);
extern int __libc_fcntl (int fd, int cmd, ...); extern int __libc_fcntl (int fd, int cmd, ...);
extern int __fcntl_nocancel (int fd, int cmd, ...) attribute_hidden;
libc_hidden_proto (__libc_fcntl) libc_hidden_proto (__libc_fcntl)
extern int __open (__const char *__file, int __oflag, ...); extern int __open (__const char *__file, int __oflag, ...);
libc_hidden_proto (__open) libc_hidden_proto (__open)

View File

@ -61,6 +61,10 @@ extern pid_t __waitpid_nocancel (pid_t, int *, int) attribute_hidden;
(void) ({ INTERNAL_SYSCALL_DECL (err); \ (void) ({ INTERNAL_SYSCALL_DECL (err); \
INTERNAL_SYSCALL (writev, err, 3, (fd), (iov), (n)); }) INTERNAL_SYSCALL (writev, err, 3, (fd), (iov), (n)); })
/* Uncancelable fcntl. */
#define fcntl_not_cancel(fd, cmd, val) \
__fcntl_nocancel (fd, cmd, val)
/* Uncancelable waitpid. */ /* Uncancelable waitpid. */
#ifdef __NR_waitpid #ifdef __NR_waitpid
# define waitpid_not_cancel(pid, stat_loc, options) \ # define waitpid_not_cancel(pid, stat_loc, options) \

View File

@ -860,8 +860,8 @@ extern int fsync (int __fd);
#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
/* Return the current machine's Internet number. */ /* Return identifier for the current host. */
extern long int gethostid (void) __THROW; extern long int gethostid (void);
/* Make all changes done to all files actually appear on disk. */ /* Make all changes done to all files actually appear on disk. */
extern void sync (void) __THROW; extern void sync (void) __THROW;

View File

@ -86,6 +86,8 @@ static const char rcsid[] = "$BINDId: res_init.c,v 8.16 2000/05/09 07:10:12 vixi
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <not-cancel.h>
/* Options. Should all be left alone. */ /* Options. Should all be left alone. */
#define RESOLVSORT #define RESOLVSORT
#define RFC1535 #define RFC1535
@ -541,7 +543,7 @@ res_nclose(res_state statp) {
int ns; int ns;
if (statp->_vcsock >= 0) { if (statp->_vcsock >= 0) {
(void) __close(statp->_vcsock); close_not_cancel_no_status(statp->_vcsock);
statp->_vcsock = -1; statp->_vcsock = -1;
statp->_flags &= ~(RES_F_VC | RES_F_CONN); statp->_flags &= ~(RES_F_VC | RES_F_CONN);
} }
@ -552,7 +554,7 @@ res_nclose(res_state statp) {
#endif #endif
if (statp->_u._ext.nsaddrs[ns] if (statp->_u._ext.nsaddrs[ns]
&& statp->_u._ext.nssocks[ns] != -1) { && statp->_u._ext.nssocks[ns] != -1) {
(void) __close(statp->_u._ext.nssocks[ns]); close_not_cancel_no_status(statp->_u._ext.nssocks[ns]);
statp->_u._ext.nssocks[ns] = -1; statp->_u._ext.nssocks[ns] = -1;
} }
statp->_u._ext.nsinit = 0; statp->_u._ext.nsinit = 0;

View File

@ -33,5 +33,7 @@
__write (fd, buf, n) __write (fd, buf, n)
#define writev_not_cancel_no_status(fd, iov, n) \ #define writev_not_cancel_no_status(fd, iov, n) \
(void) __writev (fd, iov, n) (void) __writev (fd, iov, n)
#define fcntl_not_cancel(fd, cmd, val) \
__fcntl (fd, cmd, val)
# define waitpid_not_cancel(pid, stat_loc, options) \ # define waitpid_not_cancel(pid, stat_loc, options) \
__waitpid (pid, stat_loc, options) __waitpid (pid, stat_loc, options)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996,97,98,99,2000,01,02 Free Software Foundation, Inc. /* Copyright (C) 1996-2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com> Contributed by Ulrich Drepper <drepper@cygnus.com>
and Paul Janzen <pcj@primenet.com>, 1996. and Paul Janzen <pcj@primenet.com>, 1996.
@ -26,6 +26,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <utmp.h> #include <utmp.h>
#include <not-cancel.h>
#include "utmp-private.h" #include "utmp-private.h"
#include "utmp-equal.h" #include "utmp-equal.h"
@ -77,7 +78,7 @@ static void timeout_handler (int signum) {};
memset (&fl, '\0', sizeof (struct flock)); \ memset (&fl, '\0', sizeof (struct flock)); \
fl.l_type = (type); \ fl.l_type = (type); \
fl.l_whence = SEEK_SET; \ fl.l_whence = SEEK_SET; \
if (__fcntl ((fd), F_SETLKW, &fl) < 0) if (__fcntl_nocancel ((fd), F_SETLKW, &fl) < 0)
#define LOCKING_FAILED() \ #define LOCKING_FAILED() \
goto unalarm_return goto unalarm_return
@ -85,7 +86,7 @@ static void timeout_handler (int signum) {};
#define UNLOCK_FILE(fd) \ #define UNLOCK_FILE(fd) \
/* Unlock the file. */ \ /* Unlock the file. */ \
fl.l_type = F_UNLCK; \ fl.l_type = F_UNLCK; \
__fcntl ((fd), F_SETLKW, &fl); \ __fcntl_nocancel ((fd), F_SETLKW, &fl); \
\ \
unalarm_return: \ unalarm_return: \
/* Reset the signal handler and alarm. We must reset the alarm \ /* Reset the signal handler and alarm. We must reset the alarm \
@ -139,22 +140,22 @@ setutent_file (void)
file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name); file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name);
file_fd = __open (file_name, O_RDWR); file_fd = open_not_cancel_2 (file_name, O_RDWR);
if (file_fd == -1) if (file_fd == -1)
{ {
/* Hhm, read-write access did not work. Try read-only. */ /* Hhm, read-write access did not work. Try read-only. */
file_fd = __open (file_name, O_RDONLY); file_fd = open_not_cancel_2 (file_name, O_RDONLY);
if (file_fd == -1) if (file_fd == -1)
return 0; return 0;
} }
/* We have to make sure the file is `closed on exec'. */ /* We have to make sure the file is `closed on exec'. */
result = __fcntl (file_fd, F_GETFD, 0); result = __fcntl_nocancel (file_fd, F_GETFD, 0);
if (result >= 0) if (result >= 0)
result = __fcntl (file_fd, F_SETFD, result | FD_CLOEXEC); result = __fcntl_nocancel (file_fd, F_SETFD, result | FD_CLOEXEC);
if (result == -1) if (result == -1)
{ {
__close (file_fd); close_not_cancel_no_status (file_fd);
return 0; return 0;
} }
} }
@ -197,7 +198,7 @@ getutent_r_file (struct utmp *buffer, struct utmp **result)
} }
/* Read the next entry. */ /* Read the next entry. */
nbytes = __read (file_fd, &last_entry, sizeof (struct utmp)); nbytes = read_not_cancel (file_fd, &last_entry, sizeof (struct utmp));
UNLOCK_FILE (file_fd); UNLOCK_FILE (file_fd);
@ -237,7 +238,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
while (1) while (1)
{ {
/* Read the next entry. */ /* Read the next entry. */
if (__read (file_fd, buffer, sizeof (struct utmp)) if (read_not_cancel (file_fd, buffer, sizeof (struct utmp))
!= sizeof (struct utmp)) != sizeof (struct utmp))
{ {
__set_errno (ESRCH); __set_errno (ESRCH);
@ -259,7 +260,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
while (1) while (1)
{ {
/* Read the next entry. */ /* Read the next entry. */
if (__read (file_fd, buffer, sizeof (struct utmp)) if (read_not_cancel (file_fd, buffer, sizeof (struct utmp))
!= sizeof (struct utmp)) != sizeof (struct utmp))
{ {
__set_errno (ESRCH); __set_errno (ESRCH);
@ -332,7 +333,7 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
while (1) while (1)
{ {
/* Read the next entry. */ /* Read the next entry. */
if (__read (file_fd, &last_entry, sizeof (struct utmp)) if (read_not_cancel (file_fd, &last_entry, sizeof (struct utmp))
!= sizeof (struct utmp)) != sizeof (struct utmp))
{ {
__set_errno (ESRCH); __set_errno (ESRCH);
@ -418,7 +419,8 @@ pututline_file (const struct utmp *data)
} }
/* Write the new data. */ /* Write the new data. */
if (__write (file_fd, data, sizeof (struct utmp)) != sizeof (struct utmp)) if (write_not_cancel (file_fd, data, sizeof (struct utmp))
!= sizeof (struct utmp))
{ {
/* If we appended a new record this is only partially written. /* If we appended a new record this is only partially written.
Remove it. */ Remove it. */
@ -444,7 +446,7 @@ endutent_file (void)
{ {
assert (file_fd >= 0); assert (file_fd >= 0);
__close (file_fd); close_not_cancel_no_status (file_fd);
file_fd = -1; file_fd = -1;
} }
@ -457,7 +459,7 @@ updwtmp_file (const char *file, const struct utmp *utmp)
int fd; int fd;
/* Open WTMP file. */ /* Open WTMP file. */
fd = __open (file, O_WRONLY); fd = open_not_cancel_2 (file, O_WRONLY);
if (fd < 0) if (fd < 0)
return -1; return -1;
@ -478,7 +480,8 @@ updwtmp_file (const char *file, const struct utmp *utmp)
/* Write the entry. If we can't write all the bytes, reset the file /* Write the entry. If we can't write all the bytes, reset the file
size back to the original size. That way, no partial entries size back to the original size. That way, no partial entries
will remain. */ will remain. */
if (__write (fd, utmp, sizeof (struct utmp)) != sizeof (struct utmp)) if (write_not_cancel (fd, utmp, sizeof (struct utmp))
!= sizeof (struct utmp))
{ {
__ftruncate64 (fd, offset); __ftruncate64 (fd, offset);
goto unlock_return; goto unlock_return;
@ -490,7 +493,7 @@ unlock_return:
UNLOCK_FILE (fd); UNLOCK_FILE (fd);
/* Close WTMP file. */ /* Close WTMP file. */
__close (fd); close_not_cancel_no_status (fd);
return result; return result;
} }

View File

@ -15,6 +15,8 @@ ifeq ($(subdir),misc)
sysdep_routines += sysctl clone llseek umount umount2 readahead \ sysdep_routines += sysctl clone llseek umount umount2 readahead \
setfsuid setfsgid setfsuid setfsgid
CFLAGS-gethostid.c = -fexceptions
sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
sys/klog.h sys/kdaemon.h \ sys/klog.h sys/kdaemon.h \
sys/user.h sys/procfs.h sys/prctl.h \ sys/user.h sys/procfs.h sys/prctl.h \

View File

@ -0,0 +1,60 @@
/* Copyright (C) 2000, 2002, 2003 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <sysdep-cancel.h>
#include <sys/syscall.h>
int
__fcntl_nocancel (int fd, int cmd, void *arg)
{
return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
}
int
__libc_fcntl (int fd, int cmd, ...)
{
va_list ap;
void *arg;
va_start (ap, cmd);
arg = va_arg (ap, void *);
va_end (ap);
if (SINGLE_THREAD_P || cmd != F_SETLKW)
return __fcntl_nocancel (fd, cmd, arg);
int oldtype = LIBC_CANCEL_ASYNC ();
int result = __fcntl_nocancel (fd, cmd, arg);
LIBC_CANCEL_RESET (oldtype);
return result;
}
libc_hidden_def (__libc_fcntl)
weak_alias (__libc_fcntl, __fcntl)
libc_hidden_weak (__fcntl)
weak_alias (__libc_fcntl, fcntl)

View File

@ -101,11 +101,8 @@ gethostid ()
if (herr != NETDB_INTERNAL || errno != ERANGE) if (herr != NETDB_INTERNAL || errno != ERANGE)
return 0; return 0;
else else
{
/* Enlarge buffer. */ /* Enlarge buffer. */
buflen *= 2; buffer = extend_alloca (buffer, buflen, 2 * buflen);
buffer = __alloca (buflen);
}
in.s_addr = 0; in.s_addr = 0;
memcpy (&in, hp->h_addr, memcpy (&in, hp->h_addr,

View File

@ -28,11 +28,13 @@
#if __ASSUME_FCNTL64 == 0 #if __ASSUME_FCNTL64 == 0
/* This variable is shared with all files that check for fcntl64. */ /* This variable is shared with all files that check for fcntl64. */
int __have_no_fcntl64; int __have_no_fcntl64;
#endif
static int int
do_fcntl (int fd, int cmd, void *arg) __fcntl_nocancel (int fd, int cmd, void *arg)
{ {
#if __ASSUME_FCNTL64 == 0
# ifdef __NR_fcntl64 # ifdef __NR_fcntl64
if (! __have_no_fcntl64) if (! __have_no_fcntl64)
{ {
@ -113,8 +115,10 @@ do_fcntl (int fd, int cmd, void *arg)
return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
} }
return -1; return -1;
#else
return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
#endif /* !__ASSUME_FCNTL64 */
} }
#endif /* __ASSUME_FCNTL64 */
int int
@ -128,19 +132,19 @@ __libc_fcntl (int fd, int cmd, ...)
va_end (ap); va_end (ap);
#if __ASSUME_FCNTL64 > 0 #if __ASSUME_FCNTL64 > 0
if (SINGLE_THREAD_P) if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg); return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
int oldtype = LIBC_CANCEL_ASYNC (); int oldtype = LIBC_CANCEL_ASYNC ();
int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg); int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
#else #else
if (SINGLE_THREAD_P) if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
return do_fcntl (fd, cmd, arg); return __fcntl_nocancel (fd, cmd, arg);
int oldtype = LIBC_CANCEL_ASYNC (); int oldtype = LIBC_CANCEL_ASYNC ();
int result = do_fcntl (fd, cmd, arg); int result = __fcntl_nocancel (fd, cmd, arg);
#endif #endif
LIBC_CANCEL_RESET (oldtype); LIBC_CANCEL_RESET (oldtype);

View File

@ -46,6 +46,10 @@
(void) ({ INTERNAL_SYSCALL_DECL (err); \ (void) ({ INTERNAL_SYSCALL_DECL (err); \
INTERNAL_SYSCALL (writev, err, 3, (fd), (iov), (n)); }) INTERNAL_SYSCALL (writev, err, 3, (fd), (iov), (n)); })
/* Uncancelable fcntl. */
#define fcntl_not_cancel(fd, cmd, val) \
__fcntl_nocancel (fd, cmd, val)
/* Uncancelable waitpid. */ /* Uncancelable waitpid. */
#ifdef __NR_waitpid #ifdef __NR_waitpid
# define waitpid_not_cancel(pid, stat_loc, options) \ # define waitpid_not_cancel(pid, stat_loc, options) \