Skip to content

Commit

Permalink
Fix pthreads getrlimit, gettimeofday namespace (bug 17682).
Browse files Browse the repository at this point in the history
Some pthreads functions use getrlimit and gettimeofday, but these
functions are XSI, not base POSIX; this is a namespace issue for
dynamic linking as well as static linking.  This patch makes them use
__getrlimit and __gettimeofday instead - the former needed to be newly
exported from libc.so at GLIBC_PRIVATE (and so now needs
libc_hidden_proto / libc_hidden_def), the latter was already exported.

Tested for x86_64 (testsuite, and that disassembly of installed shared
libraries is unchanged by the patch).

	[BZ #17682]
	* resource/Versions (libc): Add __getrlimit at GLIBC_PRIVATE.
	* resource/getrlimit.c (__getrlimit): Use libc_hidden_def.
	* sysdeps/mach/hurd/getrlimit.c (__getrlimit): Likewise.
	* include/sys/resource.h (__getrlimit): Use libc_hidden_proto.
	* nptl/nptl-init.c (__pthread_initialize_minimal_internal): Use
	__getrlimit instead of getrlimit.
	* nptl/pthread_cond_timedwait.c (__pthread_cond_timedwait): Use
	__gettimeofday instead of gettimeofday.
	* nptl/pthread_rwlock_timedrdlock.c (pthread_rwlock_timedrdlock):
	Likewise.
	* nptl/pthread_rwlock_timedwrlock.c (pthread_rwlock_timedwrlock):
	Likewise.
	* sysdeps/pthread/aio_misc.c (handle_fildes_io): Likewise.
	* conform/Makefile (test-xfail-POSIX2008/aio.h/linknamespace):
	Remove variable.
	(test-xfail-POSIX2008/pthread.h/linknamespace): Likewise.
	(test-xfail-POSIX2008/time.h/linknamespace): Likewise.
  • Loading branch information
Joseph Myers committed Dec 6, 2014
1 parent 9752c3c commit c5c2b7c
Show file tree
Hide file tree
Showing 12 changed files with 34 additions and 9 deletions.
21 changes: 21 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
2014-12-06 Joseph Myers <joseph@codesourcery.com>

[BZ #17682]
* resource/Versions (libc): Add __getrlimit at GLIBC_PRIVATE.
* resource/getrlimit.c (__getrlimit): Use libc_hidden_def.
* sysdeps/mach/hurd/getrlimit.c (__getrlimit): Likewise.
* include/sys/resource.h (__getrlimit): Use libc_hidden_proto.
* nptl/nptl-init.c (__pthread_initialize_minimal_internal): Use
__getrlimit instead of getrlimit.
* nptl/pthread_cond_timedwait.c (__pthread_cond_timedwait): Use
__gettimeofday instead of gettimeofday.
* nptl/pthread_rwlock_timedrdlock.c (pthread_rwlock_timedrdlock):
Likewise.
* nptl/pthread_rwlock_timedwrlock.c (pthread_rwlock_timedwrlock):
Likewise.
* sysdeps/pthread/aio_misc.c (handle_fildes_io): Likewise.
* conform/Makefile (test-xfail-POSIX2008/aio.h/linknamespace):
Remove variable.
(test-xfail-POSIX2008/pthread.h/linknamespace): Likewise.
(test-xfail-POSIX2008/time.h/linknamespace): Likewise.

2014-12-05 Adhemerval Zanella <azanella@linux.vnet.ibm.com>

* libio/tst-ftell-active-handler.c (do_ftell_test): Fix buffer overrun
Expand Down
3 changes: 2 additions & 1 deletion NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ Version 2.21
16619, 16740, 16857, 17192, 17266, 17344, 17363, 17370, 17371, 17411,
17460, 17475, 17485, 17501, 17506, 17508, 17522, 17555, 17570, 17571,
17572, 17573, 17574, 17581, 17582, 17583, 17584, 17585, 17589, 17594,
17601, 17608, 17616, 17625, 17633, 17647, 17653, 17664, 17665, 17668.
17601, 17608, 17616, 17625, 17633, 17647, 17653, 17664, 17665, 17668,
17682.

* CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag
under certain input conditions resulting in the execution of a shell for
Expand Down
3 changes: 0 additions & 3 deletions conform/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -424,18 +424,15 @@ test-xfail-XOPEN2K/syslog.h/linknamespace = yes
test-xfail-XOPEN2K/ucontext.h/linknamespace = yes
test-xfail-XOPEN2K/unistd.h/linknamespace = yes
test-xfail-XOPEN2K/wordexp.h/linknamespace = yes
test-xfail-POSIX2008/aio.h/linknamespace = yes
test-xfail-POSIX2008/ctype.h/linknamespace = yes
test-xfail-POSIX2008/dirent.h/linknamespace = yes
test-xfail-POSIX2008/fcntl.h/linknamespace = yes
test-xfail-POSIX2008/grp.h/linknamespace = yes
test-xfail-POSIX2008/mqueue.h/linknamespace = yes
test-xfail-POSIX2008/netdb.h/linknamespace = yes
test-xfail-POSIX2008/pthread.h/linknamespace = yes
test-xfail-POSIX2008/regex.h/linknamespace = yes
test-xfail-POSIX2008/semaphore.h/linknamespace = yes
test-xfail-POSIX2008/spawn.h/linknamespace = yes
test-xfail-POSIX2008/time.h/linknamespace = yes
test-xfail-POSIX2008/unistd.h/linknamespace = yes
test-xfail-XOPEN2K8/dirent.h/linknamespace = yes
test-xfail-XOPEN2K8/fcntl.h/linknamespace = yes
Expand Down
1 change: 1 addition & 0 deletions include/sys/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ libc_hidden_proto (getrlimit64)
/* Now define the internal interfaces. */
extern int __getrlimit (enum __rlimit_resource __resource,
struct rlimit *__rlimits);
libc_hidden_proto (__getrlimit)
extern int __getrusage (enum __rusage_who __who, struct rusage *__usage)
attribute_hidden;

Expand Down
2 changes: 1 addition & 1 deletion nptl/nptl-init.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ __pthread_initialize_minimal_internal (void)
/* Determine the default allowed stack size. This is the size used
in case the user does not specify one. */
struct rlimit limit;
if (getrlimit (RLIMIT_STACK, &limit) != 0
if (__getrlimit (RLIMIT_STACK, &limit) != 0
|| limit.rlim_cur == RLIM_INFINITY)
/* The system limit is not usable. Use an architecture-specific
default. */
Expand Down
2 changes: 1 addition & 1 deletion nptl/pthread_cond_timedwait.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ __pthread_cond_timedwait (cond, mutex, abstime)
# else
/* Get the current time. So far we support only one clock. */
struct timeval tv;
(void) gettimeofday (&tv, NULL);
(void) __gettimeofday (&tv, NULL);

/* Convert the absolute timeout value to a relative timeout. */
rt.tv_sec = abstime->tv_sec - tv.tv_sec;
Expand Down
2 changes: 1 addition & 1 deletion nptl/pthread_rwlock_timedrdlock.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ pthread_rwlock_timedrdlock (rwlock, abstime)
|| !defined lll_futex_timed_wait_bitset)
/* Get the current time. So far we support only one clock. */
struct timeval tv;
(void) gettimeofday (&tv, NULL);
(void) __gettimeofday (&tv, NULL);

/* Convert the absolute timeout value to a relative timeout. */
struct timespec rt;
Expand Down
2 changes: 1 addition & 1 deletion nptl/pthread_rwlock_timedwrlock.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ pthread_rwlock_timedwrlock (rwlock, abstime)
|| !defined lll_futex_timed_wait_bitset)
/* Get the current time. So far we support only one clock. */
struct timeval tv;
(void) gettimeofday (&tv, NULL);
(void) __gettimeofday (&tv, NULL);

/* Convert the absolute timeout value to a relative timeout. */
struct timespec rt;
Expand Down
3 changes: 3 additions & 0 deletions resource/Versions
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,7 @@ libc {
# s*
setrlimit64;
}
GLIBC_PRIVATE {
__getrlimit;
}
}
1 change: 1 addition & 0 deletions resource/getrlimit.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ __getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits)
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__getrlimit)
weak_alias (__getrlimit, getrlimit)

stub_warning (getrlimit)
1 change: 1 addition & 0 deletions sysdeps/mach/hurd/getrlimit.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,5 @@ __getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits)

return 0;
}
libc_hidden_def (__getrlimit)
weak_alias (__getrlimit, getrlimit)
2 changes: 1 addition & 1 deletion sysdeps/pthread/aio_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ handle_fildes_io (void *arg)
struct timespec wakeup_time;

++idle_thread_count;
gettimeofday (&now, NULL);
__gettimeofday (&now, NULL);
wakeup_time.tv_sec = now.tv_sec + optim.aio_idle_time;
wakeup_time.tv_nsec = now.tv_usec * 1000;
if (wakeup_time.tv_nsec >= 1000000000)
Expand Down

0 comments on commit c5c2b7c

Please sign in to comment.