summaryrefslogtreecommitdiff
path: root/os_dep.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2012-06-07 20:00:37 +0200
committerIvan Maidanski <ivmai@mail.ru>2012-06-07 20:56:33 +0200
commit1de90aeb38a078550f9b22a5900f959e6dcbd37b (patch)
tree52aa63e26fd3ae741bfa1a530397e1105d8cdfef /os_dep.c
parenta237b23befdb0dd75dff2727a2a5c0d66bc96f04 (diff)
Fix GC_scratch_alloc and GC_get_maps invocations to prevent SEGV
(if out of memory) * dyn_load.c (GC_register_dynamic_libraries): If GC_scratch_alloc fails (returns null) then abort (with the appropriate message) instead of causing SEGV. * os_dep.c (GC_dirty_init): Likewise. * headers.c (GC_init_headers): Report error and exit if GC_scratch_alloc fails. * include/private/gc_priv.h (GC_scratch_alloc): Improve comment. * os_dep.c (GC_print_address_map): If GC_get_maps return null then print the appropriate message (instead of passing null to GC_err_puts thus causing SEGV).
Diffstat (limited to 'os_dep.c')
-rw-r--r--os_dep.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/os_dep.c b/os_dep.c
index c1b7f20..333421d 100644
--- a/os_dep.c
+++ b/os_dep.c
@@ -3641,6 +3641,8 @@ GC_INNER void GC_dirty_init(void)
GC_dirty_maintained = TRUE;
GC_proc_buf = GC_scratch_alloc(GC_proc_buf_size);
+ if (GC_proc_buf == NULL)
+ ABORT("Insufficient space for /proc read");
}
# define READ read
@@ -4724,8 +4726,11 @@ GC_INNER void GC_print_callers(struct callinfo info[NFRAMES])
/* addresses in FIND_LEAK output. */
void GC_print_address_map(void)
{
+ char *maps;
+
GC_err_printf("---------- Begin address map ----------\n");
- GC_err_puts(GC_get_maps());
+ maps = GC_get_maps();
+ GC_err_puts(maps != NULL ? maps : "Failed to get map!\n");
GC_err_printf("---------- End address map ----------\n");
}
#endif /* LINUX && ELF */