24#ifdef CAPABILITIES_SUPPORT
27# ifdef SECCOMP_SUPPORT
40#ifdef CAPABILITIES_SUPPORT
42# ifdef SECCOMP_SUPPORT
47void *xmalloc (
size_t size )
49 debug ( 20,
"(%li)", size );
53 void *ret = malloc ( size );
56 critical (
"(%li): Cannot allocate memory.", size );
59 memset ( ret, 0, size );
64void *xcalloc (
size_t nmemb,
size_t size )
66 debug ( 20,
"(%li, %li)", nmemb, size );
71 void *ret = calloc ( nmemb, size );
74 critical (
"(%li): Cannot allocate memory.", size );
80void *xrealloc (
void *oldptr,
size_t size )
82 debug ( 20,
"(%p, %li)", oldptr, size );
86 void *ret = realloc ( oldptr, size );
89 critical (
"(%p, %li): Cannot reallocate memory.", oldptr, size );
94char *
xstrncpy (
char *dest,
const char *src,
size_t n )
96 char *ret = strncpy ( dest, src, n - 1 );
105#ifdef CAPABILITIES_SUPPORT
106void *malloc_align (
size_t size )
110 debug ( 20,
"(%li)", size );
116 total_size += pagesize - 1;
117 total_size /= pagesize;
118 total_size *= pagesize;
120 if (
unlikely ( posix_memalign ( &ret, pagesize, total_size ) ) )
121 critical (
"(%li): Cannot allocate memory.", size );
126 critical (
"(%li): ptr == NULL.", size );
133void *calloc_align (
size_t nmemb,
size_t size )
137 debug ( 20,
"(%li, %li)", nmemb, size );
142 total_size = nmemb * size;
143 ret = malloc_align ( total_size );
144 memset ( ret, 0, total_size );
148char *strdup_protect (
const char *src,
int prot )
150 size_t len = strlen ( src ) + 1;
151 char *dst = malloc_align ( len );
154 if (
unlikely ( mprotect ( dst, len, prot ) ) )
155 critical (
"(%p, 0x%o): Got error from mprotect(%p, %lu, 0x%o)", src, prot, dst, len, prot );
160# ifdef SECCOMP_SUPPORT
161int is_protected (
void *addr )
163 char *_addr = addr, t;
166 is_protected = ( read ( devzero_fd, addr, 1 ) == -1 );
179#ifdef CAPABILITIES_SUPPORT
180 pagesize = sysconf ( _SC_PAGE_SIZE );
183 critical (
"Got error from sysconf(_SC_PAGE_SIZE)" );
185# ifdef SECCOMP_SUPPORT
186 devzero_fd = open (
DEVZERO, O_RDONLY );
188 if (
unlikely ( devzero_fd == -1 ) )
202 int privileged_shmid = shmget ( 0, size, IPC_PRIVATE | IPC_CREAT | 0600 );
203 struct shmid_ds shmid_ds;
205 if (
unlikely ( privileged_shmid == -1 ) )
return NULL;
207 ret = shmat ( privileged_shmid, NULL, 0 );
209 if (
unlikely ( (
long ) ret == -1 ) )
return NULL;
211 debug ( 15,
"ret == %p", ret );
213 shmctl ( privileged_shmid, IPC_STAT, &shmid_ds );
214 shmid_ds.shm_perm.mode = 0;
215 shmctl ( privileged_shmid, IPC_SET, &shmid_ds );
217 shmctl ( privileged_shmid, IPC_STAT, &shmid_ds );
219 if (
unlikely ( shmid_ds.shm_lpid != shmid_ds.shm_cpid ) ) {
220 error (
"A process (pid %u) attached to my shared memory. It's a security problem. Emergency exit." );
244 total_size = nmemb * size;
247 memset ( ret, 0, total_size );
253 debug ( 25,
"(%p)", ptr );
#define debug(debug_level,...)
#define critical_on(cond)
void * shm_malloc(size_t size)
void * shm_malloc_try(size_t size)
void * shm_calloc(size_t nmemb, size_t size)
char * xstrncpy(char *dest, const char *src, size_t n)