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
This commit is contained in:
parent
fd520b6e21
commit
1a744fefc2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=276681
@ -173,13 +173,13 @@ typedef pthread_func_t pthread_func_entry_t[2];
|
||||
|
||||
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,
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -914,7 +914,7 @@ void _thr_tsd_unload(struct dl_phdr_info *phdr_info) __hidden;
|
||||
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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user