Merge pull request #559 from LudwigOrtmann/native_syscall_guards
Native syscall guards
This commit is contained in:
commit
f04c3dc433
@ -32,6 +32,10 @@ void _native_syscall_enter();
|
|||||||
*/
|
*/
|
||||||
extern ssize_t (*real_read)(int fd, void *buf, size_t count);
|
extern ssize_t (*real_read)(int fd, void *buf, size_t count);
|
||||||
extern ssize_t (*real_write)(int fd, const void *buf, size_t count);
|
extern ssize_t (*real_write)(int fd, const void *buf, size_t count);
|
||||||
|
extern void* (*real_malloc)(size_t size);
|
||||||
|
extern void (*real_free)(void *ptr);
|
||||||
|
extern void* (*real_calloc)(size_t nmemb, size_t size);
|
||||||
|
extern void* (*real_realloc)(void *ptr, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* data structures
|
* data structures
|
||||||
|
|||||||
@ -184,7 +184,12 @@ __attribute__((constructor)) static void startup(int argc, char **argv)
|
|||||||
/* get system read/write/printf */
|
/* get system read/write/printf */
|
||||||
*(void **)(&real_read) = dlsym(RTLD_NEXT, "read");
|
*(void **)(&real_read) = dlsym(RTLD_NEXT, "read");
|
||||||
*(void **)(&real_write) = dlsym(RTLD_NEXT, "write");
|
*(void **)(&real_write) = dlsym(RTLD_NEXT, "write");
|
||||||
*(void **)(&real_printf) = dlsym(RTLD_NEXT, "printf");
|
*(void **)(&real_malloc) = dlsym(RTLD_NEXT, "malloc");
|
||||||
|
*(void **)(&real_calloc) = dlsym(RTLD_NEXT, "calloc");
|
||||||
|
*(void **)(&real_realloc) = dlsym(RTLD_NEXT, "realloc");
|
||||||
|
*(void **)(&real_free) = dlsym(RTLD_NEXT, "free");
|
||||||
|
|
||||||
|
*(void **)(&real_printf) = dlsym(RTLD_NEXT, "printf");
|
||||||
|
|
||||||
_progname = argv[0];
|
_progname = argv[0];
|
||||||
int argp = 1;
|
int argp = 1;
|
||||||
|
|||||||
@ -36,23 +36,34 @@
|
|||||||
#include "native_internal.h"
|
#include "native_internal.h"
|
||||||
|
|
||||||
#define ENABLE_DEBUG (0)
|
#define ENABLE_DEBUG (0)
|
||||||
|
#if ENABLE_DEBUG
|
||||||
|
#define LOCAL_DEBUG (1)
|
||||||
|
#endif
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
extern volatile tcb_t *active_thread;
|
extern volatile tcb_t *active_thread;
|
||||||
|
|
||||||
ssize_t (*real_read)(int fd, void *buf, size_t count);
|
ssize_t (*real_read)(int fd, void *buf, size_t count);
|
||||||
ssize_t (*real_write)(int fd, const void *buf, size_t count);
|
ssize_t (*real_write)(int fd, const void *buf, size_t count);
|
||||||
|
void* (*real_malloc)(size_t size);
|
||||||
|
void (*real_free)(void *ptr);
|
||||||
|
void* (*real_calloc)(size_t nmemb, size_t size);
|
||||||
|
void* (*real_realloc)(void *ptr, size_t size);
|
||||||
|
|
||||||
void _native_syscall_enter()
|
void _native_syscall_enter()
|
||||||
{
|
{
|
||||||
_native_in_syscall++;
|
_native_in_syscall++;
|
||||||
DEBUG("> _native_in_syscall: %d\n", _native_in_syscall);
|
#if LOCAL_DEBUG
|
||||||
|
real_write(STDERR_FILENO, "> _native_in_syscall\n", 21);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void _native_syscall_leave()
|
void _native_syscall_leave()
|
||||||
{
|
{
|
||||||
|
#if LOCAL_DEBUG
|
||||||
|
real_write(STDERR_FILENO, "< _native_in_syscall\n", 21);
|
||||||
|
#endif
|
||||||
_native_in_syscall--;
|
_native_in_syscall--;
|
||||||
DEBUG("< _native_in_syscall: %d\n", _native_in_syscall);
|
|
||||||
if (
|
if (
|
||||||
(_native_sigpend > 0)
|
(_native_sigpend > 0)
|
||||||
&& (_native_in_isr == 0)
|
&& (_native_in_isr == 0)
|
||||||
@ -72,6 +83,40 @@ void _native_syscall_leave()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *malloc(size_t size)
|
||||||
|
{
|
||||||
|
void *r;
|
||||||
|
_native_syscall_enter();
|
||||||
|
r = real_malloc(size);
|
||||||
|
_native_syscall_leave();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void free(void *ptr)
|
||||||
|
{
|
||||||
|
_native_syscall_enter();
|
||||||
|
real_free(ptr);
|
||||||
|
_native_syscall_leave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void *calloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
void *r;
|
||||||
|
_native_syscall_enter();
|
||||||
|
r = real_calloc(nmemb, size);
|
||||||
|
_native_syscall_leave();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *realloc(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
void *r;
|
||||||
|
_native_syscall_enter();
|
||||||
|
r = real_realloc(ptr, size);
|
||||||
|
_native_syscall_leave();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t read(int fd, void *buf, size_t count)
|
ssize_t read(int fd, void *buf, size_t count)
|
||||||
{
|
{
|
||||||
ssize_t r;
|
ssize_t r;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user