140178 open("/proc/self/exe", ...); doesn't quite work
140939 --track-fds reports leakage of stdout/in/err and doesn't respect -q
+217695 malloc/calloc/realloc/memalign failure doesn't set errno to ENOMEM
345077 linux syscall execveat support (linux 3.19)
369029 handle linux syscalls sched_getattr and sched_setattr
n-i-bz helgrind: If hg_cli__realloc fails, return NULL.
if (info.clo_trace_malloc) { \
VALGRIND_INTERNAL_PRINTF(format, ## args ); }
+/* Tries to set ERRNO to ENOMEM if possible.
+ Only implemented for glibc at the moment.
+*/
+#if defined(VGO_linux)
+extern int *__errno_location (void) __attribute__((weak));
+#define SET_ERRNO_ENOMEM if (__errno_location) \
+ (*__errno_location ()) = VKI_ENOMEM;
+#else
+#define SET_ERRNO_ENOMEM {}
+#endif
+
/* Below are new versions of malloc, __builtin_new, free,
__builtin_delete, calloc, realloc, memalign, and friends.
\
v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
MALLOC_TRACE(" = %p\n", v ); \
+ if (!v) SET_ERRNO_ENOMEM; \
return v; \
}
if (umulHW(size, nmemb) != 0) return NULL; \
v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_calloc, nmemb, size ); \
MALLOC_TRACE(" = %p\n", v ); \
+ if (!v) SET_ERRNO_ENOMEM; \
return v; \
}
} \
v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_realloc, ptrV, new_size ); \
MALLOC_TRACE(" = %p\n", v ); \
+ if (!v) SET_ERRNO_ENOMEM; \
return v; \
}
\
v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_memalign, alignment, n ); \
MALLOC_TRACE(" = %p\n", v ); \
+ if (!v) SET_ERRNO_ENOMEM; \
return v; \
}
getregset.stderr.exp getregset.stdout.exp \
sys-preadv_pwritev.vgtest sys-preadv_pwritev.stderr.exp \
sys-preadv2_pwritev2.vgtest sys-preadv2_pwritev2.stderr.exp \
- sys-execveat.vgtest sys-execveat.stderr.exp sys-execveat.stdout.exp
+ sys-execveat.vgtest sys-execveat.stderr.exp sys-execveat.stdout.exp \
+ enomem.vgtest enomem.stderr.exp enomem.stdout.exp
check_PROGRAMS = \
brk \
timerfd-syscall \
proc-auxv \
sys-execveat \
- check_execveat
+ check_execveat \
+ enomem
if HAVE_AT_FDCWD
check_PROGRAMS += sys-openat
--- /dev/null
+
+/* Test malloc, calloc, realloc and memalign set errno to ENOMEM */
+
+#include <errno.h>
+#include <limits.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int main ( void )
+{
+ char* small = malloc (16);
+ char* p;
+
+ errno = 0;
+ p = malloc(SSIZE_MAX);
+ if (!p && errno == ENOMEM) puts("malloc: Cannot allocate memory");
+
+ errno = 0;
+ p = calloc(1, SSIZE_MAX);
+ if (!p && errno == ENOMEM) puts("calloc: Cannot allocate memory");
+
+ errno = 0;
+ p = realloc(small, SSIZE_MAX);
+ if (!p && errno == ENOMEM) puts("realloc: Cannot allocate memory");
+
+ errno = 0;
+ p = memalign(64, SSIZE_MAX);
+ if (!p && errno == ENOMEM) puts("memalign: Cannot allocate memory");
+
+ free(small);
+
+ return 0;
+}