From d1271dc19c335c39298e16b825f84fdd8650132e Mon Sep 17 00:00:00 2001 From: Shaozhi Shawn Ye Date: Wed, 10 Sep 2008 09:02:51 +0200 Subject: [PATCH] smalloc: Remove read/write lock race condition which will result in segmentation fault Signed-off-by: Jens Axboe --- smalloc.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/smalloc.c b/smalloc.c index 1c975df4..7f3c10b1 100644 --- a/smalloc.c +++ b/smalloc.c @@ -226,9 +226,7 @@ static int add_pool(struct pool *pool, unsigned int alloc_size) pool->fd = fd; - global_write_lock(); nr_pools++; - global_write_unlock(); return 0; out_unlink: fprintf(stderr, "smalloc: failed adding pool\n"); @@ -442,7 +440,7 @@ void *smalloc(unsigned int size) { unsigned int i; - global_read_lock(); + global_write_lock(); i = last_pool; do { @@ -451,7 +449,7 @@ void *smalloc(unsigned int size) if (ptr) { last_pool = i; - global_read_unlock(); + global_write_unlock(); return ptr; } } @@ -464,15 +462,13 @@ void *smalloc(unsigned int size) break; else { i = nr_pools; - global_read_unlock(); if (add_pool(&mp[nr_pools], size)) goto out; - global_read_lock(); } } while (1); - global_read_unlock(); out: + global_write_unlock(); return NULL; } -- 2.25.1