Merge pull request #559 from LudwigOrtmann/native_syscall_guards

Native syscall guards
This commit is contained in:
Ludwig Ortmann 2014-01-24 09:36:26 -08:00
commit f04c3dc433
3 changed files with 57 additions and 3 deletions

View File

@ -32,6 +32,10 @@ void _native_syscall_enter();
*/
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 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

View File

@ -184,7 +184,12 @@ __attribute__((constructor)) static void startup(int argc, char **argv)
/* get system read/write/printf */
*(void **)(&real_read) = dlsym(RTLD_NEXT, "read");
*(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];
int argp = 1;

View File

@ -36,23 +36,34 @@
#include "native_internal.h"
#define ENABLE_DEBUG (0)
#if ENABLE_DEBUG
#define LOCAL_DEBUG (1)
#endif
#include "debug.h"
extern volatile tcb_t *active_thread;
ssize_t (*real_read)(int fd, 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()
{
_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()
{
#if LOCAL_DEBUG
real_write(STDERR_FILENO, "< _native_in_syscall\n", 21);
#endif
_native_in_syscall--;
DEBUG("< _native_in_syscall: %d\n", _native_in_syscall);
if (
(_native_sigpend > 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 r;