From 9312bf345a9329137652f91c079a38931211faba Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 21 Jun 2013 03:34:17 +0000 Subject: consistently check OOM from hash_initialize/hash_insert Both hash_initialize and hash_insert may return NULL to indicate allocation errors. So implement a mog_oom_if_null helper function to destroy the process instead of attempting to continue and dereferencing NULL pointers. This may affect configurations with limited memory and lacking overcommit; but is unlikely to trigger given the small memory footprint of cmogstored. --- alloc.c | 5 +++++ cfg.c | 3 +-- cmogstored.h | 1 + fsck_queue.c | 1 + inherit.c | 3 +-- ioutil.c | 3 +-- mnt.c | 4 ++-- process.c | 6 ++---- svc.c | 4 ++-- svc_dev.c | 5 +++-- 10 files changed, 19 insertions(+), 16 deletions(-) diff --git a/alloc.c b/alloc.c index 5afcee2..f5ce8bc 100644 --- a/alloc.c +++ b/alloc.c @@ -58,6 +58,11 @@ _Noreturn void mog_oom(void) abort(); } +void mog_oom_if_null(const void *ptr) +{ + if (!ptr) + mog_oom(); +} /* * Cache alignment is important for sub-pagesized allocations diff --git a/cfg.c b/cfg.c index c689aa3..a87500f 100644 --- a/cfg.c +++ b/cfg.c @@ -53,8 +53,7 @@ static void cfg_atexit(void) __attribute__((constructor)) static void cfg_init(void) { all_cfg = hash_initialize(7, NULL, cfg_hash, cfg_cmp, cfg_free); - if (!all_cfg) - mog_oom(); + mog_oom_if_null(all_cfg); atexit(cfg_atexit); } diff --git a/cmogstored.h b/cmogstored.h index d9e74fc..0b5a7bf 100644 --- a/cmogstored.h +++ b/cmogstored.h @@ -310,6 +310,7 @@ void mog_rbuf_free(struct mog_rbuf *); void mog_rbuf_free_and_null(struct mog_rbuf **); void *mog_fsbuf_get(size_t *size); void mog_alloc_quit(void); +void mog_oom_if_null(const void *); #define die_errno(...) do { \ error(EXIT_FAILURE, errno, __VA_ARGS__); \ diff --git a/fsck_queue.c b/fsck_queue.c index 22f3d38..c99a9ed 100644 --- a/fsck_queue.c +++ b/fsck_queue.c @@ -37,6 +37,7 @@ static void fsck_queue_atexit(void) MOG_NOINLINE static void fsck_queue_once(void) { fsck_queues = hash_initialize(7, NULL, fq_hash, fq_cmp, free); + mog_oom_if_null(fsck_queues); atexit(fsck_queue_atexit); } diff --git a/inherit.c b/inherit.c index da3c852..75d3050 100644 --- a/inherit.c +++ b/inherit.c @@ -131,8 +131,7 @@ void mog_inherit_init(void) return; listeners = hash_initialize(3, NULL, listener_hash, listener_cmp, free); - if (!listeners) - die("failed to initialize inherited listeners hash"); + mog_oom_if_null(listeners); atexit(listeners_cleanup); fds = xstrdup(orig); diff --git a/ioutil.c b/ioutil.c index 9323a32..fdb9562 100644 --- a/ioutil.c +++ b/ioutil.c @@ -39,8 +39,7 @@ __attribute__((destructor)) static void iou_destructor(void) __attribute__((constructor)) static void iou_constructor(void) { dev_iou = hash_initialize(7, NULL, iou_hash, iou_cmp, free); - if (!dev_iou) - mog_oom(); + mog_oom_if_null(dev_iou); } static bool cleanup_begin_i(void *ent, void *unused) diff --git a/mnt.c b/mnt.c index 4f5aeb7..bb4e645 100644 --- a/mnt.c +++ b/mnt.c @@ -62,8 +62,8 @@ static Hash_table * mnt_new(size_t n) { Hash_table *rv = hash_initialize(n, NULL, me_hash, me_cmp, me_free); - if (!rv) - mog_oom(); + mog_oom_if_null(rv); + return rv; } diff --git a/process.c b/process.c index e817fba..28615df 100644 --- a/process.c +++ b/process.c @@ -38,8 +38,7 @@ void mog_process_init(size_t nr) if (nr < 3) nr = 3; processes = hash_initialize(nr, NULL, process_hash, process_cmp, free); - if (processes == NULL) - mog_oom(); + mog_oom_if_null(processes); } void mog_process_reset(void) @@ -123,8 +122,7 @@ void mog_process_register(pid_t pid, unsigned id) p->pid = pid; p->id = id; - if (hash_insert(processes, p) == NULL) - mog_oom(); + mog_oom_if_null(hash_insert(processes, p)); } /* diff --git a/svc.c b/svc.c index 6eea3e3..e9d8d6d 100644 --- a/svc.c +++ b/svc.c @@ -50,8 +50,7 @@ static void svc_atexit(void) /* called atexit */ static void svc_once(void) { by_docroot = hash_initialize(7, NULL, svc_hash, svc_cmp, svc_free); - if (!by_docroot) - mog_oom(); + mog_oom_if_null(by_docroot); mog_umask = umask(0); umask(mog_umask); @@ -98,6 +97,7 @@ struct mog_svc * mog_svc_new(const char *docroot) CHECK(int, 0, pthread_mutex_init(&svc->by_mog_devid_lock, NULL)); svc->by_mog_devid = hash_initialize(7, NULL, mog_dev_hash, mog_dev_cmp, free); + mog_oom_if_null(svc->by_mog_devid); switch (hash_insert_if_absent(by_docroot, svc, NULL)) { case 0: diff --git a/svc_dev.c b/svc_dev.c index d7e1dcd..e8d8a2c 100644 --- a/svc_dev.c +++ b/svc_dev.c @@ -52,6 +52,8 @@ static struct mog_devlist * mog_devlist_new(dev_t st_dev) */ NULL); + mog_oom_if_null(devlist->by_mogdevid); + return devlist; } @@ -90,8 +92,7 @@ static void svc_init_dev_hash(struct mog_svc *svc) svc->by_st_dev = hash_initialize(7, NULL, devlist_hash, devlist_cmp, devlist_free); - if (!svc->by_st_dev) - mog_oom(); + mog_oom_if_null(svc->by_st_dev); } static int svc_scandev(struct mog_svc *svc, size_t *nr, mog_scandev_cb cb) -- cgit v1.2.3-24-ge0c7