svn commit: r276681 - in head/lib: libc/include libc/sys libthr/thread
Konstantin Belousov
kib at FreeBSD.org
Mon Jan 5 01:06:56 UTC 2015
Author: kib
Date: Mon Jan 5 01:06:54 2015
New Revision: 276681
URL: https://svnweb.freebsd.org/changeset/base/276681
Log:
Avoid calling internal libc function through PLT or accessing data
though GOT, by staticizing and hiding. Add setter for
__error_selector to hide it as well.
Suggested and reviewed by: jilles
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Modified:
head/lib/libc/include/libc_private.h
head/lib/libc/sys/Symbol.map
head/lib/libc/sys/__error.c
head/lib/libthr/thread/thr_private.h
head/lib/libthr/thread/thr_syscalls.c
Modified: head/lib/libc/include/libc_private.h
==============================================================================
--- head/lib/libc/include/libc_private.h Mon Jan 5 01:05:35 2015 (r276680)
+++ head/lib/libc/include/libc_private.h Mon Jan 5 01:06:54 2015 (r276681)
@@ -173,13 +173,13 @@ typedef pthread_func_t pthread_func_entr
extern pthread_func_entry_t __thr_jtable[];
-extern int *(*__error_selector)(void);
+void __set_error_selector(int *(*arg)(void));
int _pthread_mutex_init_calloc_cb_stub(pthread_mutex_t *mutex,
void *(calloc_cb)(__size_t, __size_t));
typedef int (*interpos_func_t)(void);
interpos_func_t *__libc_interposing_slot(int interposno);
-extern interpos_func_t __libc_interposing[];
+extern interpos_func_t __libc_interposing[] __hidden;
enum {
INTERPOS_accept,
Modified: head/lib/libc/sys/Symbol.map
==============================================================================
--- head/lib/libc/sys/Symbol.map Mon Jan 5 01:05:35 2015 (r276680)
+++ head/lib/libc/sys/Symbol.map Mon Jan 5 01:06:54 2015 (r276681)
@@ -1045,8 +1045,7 @@ FBSDprivate_1.0 {
__sys_write;
_writev;
__sys_writev;
- __error_unthreaded;
- __error_selector;
+ __set_error_selector;
nlm_syscall;
gssd_syscall;
__libc_interposing_slot;
Modified: head/lib/libc/sys/__error.c
==============================================================================
--- head/lib/libc/sys/__error.c Mon Jan 5 01:05:35 2015 (r276680)
+++ head/lib/libc/sys/__error.c Mon Jan 5 01:06:54 2015 (r276681)
@@ -32,13 +32,21 @@ __FBSDID("$FreeBSD$");
extern int errno;
-int *
+static int *
__error_unthreaded(void)
{
- return(&errno);
+
+ return (&errno);
}
-int *(*__error_selector)(void) = __error_unthreaded;
+static int *(*__error_selector)(void) = __error_unthreaded;
+
+void
+__set_error_selector(int *(*arg)(void))
+{
+
+ __error_selector = arg;
+}
int *
__error(void)
Modified: head/lib/libthr/thread/thr_private.h
==============================================================================
--- head/lib/libthr/thread/thr_private.h Mon Jan 5 01:05:35 2015 (r276680)
+++ head/lib/libthr/thread/thr_private.h Mon Jan 5 01:06:54 2015 (r276681)
@@ -914,7 +914,7 @@ void _thr_tsd_unload(struct dl_phdr_info
void _thr_sigact_unload(struct dl_phdr_info *phdr_info) __hidden;
void _thr_stack_fix_protection(struct pthread *thrd);
-int *__error_threaded(void);
+int *__error_threaded(void) __hidden;
void __thr_interpose_libc(void) __hidden;
pid_t __thr_fork(void);
int __thr_pause(void) __hidden;
Modified: head/lib/libthr/thread/thr_syscalls.c
==============================================================================
--- head/lib/libthr/thread/thr_syscalls.c Mon Jan 5 01:05:35 2015 (r276680)
+++ head/lib/libthr/thread/thr_syscalls.c Mon Jan 5 01:06:54 2015 (r276681)
@@ -692,7 +692,7 @@ void
__thr_interpose_libc(void)
{
- __error_selector = __error_threaded;
+ __set_error_selector(__error_threaded);
#define SLOT(name) \
*(__libc_interposing_slot(INTERPOS_##name)) = \
(interpos_func_t)__thr_##name;
More information about the svn-src-all
mailing list