From: Vsevolod Stakhov Date: Wed, 2 Nov 2011 17:49:17 +0000 (+0300) Subject: Do not try to mmap empty cache. X-Git-Tag: 0.4.5~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5419087e8314be3e96bce4a7cdc0ad1c506d09f2;p=thirdparty%2Frspamd.git Do not try to mmap empty cache. --- diff --git a/src/symbols_cache.c b/src/symbols_cache.c index 5940bb4c21..49934b6d2e 100644 --- a/src/symbols_cache.c +++ b/src/symbols_cache.c @@ -151,33 +151,35 @@ mmap_cache_file (struct symbols_cache *cache, gint fd, memory_pool_t *pool) GList *cur; struct cache_item *item; - map = mmap (NULL, cache->used_items * sizeof (struct saved_cache_item), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (map == MAP_FAILED) { - msg_err ("cannot mmap cache file: %d, %s", errno, strerror (errno)); + if (cache->used_items > 0) { + map = mmap (NULL, cache->used_items * sizeof (struct saved_cache_item), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (map == MAP_FAILED) { + msg_err ("cannot mmap cache file: %d, %s", errno, strerror (errno)); + close (fd); + return FALSE; + } + /* Close descriptor as it would never be used */ close (fd); - return FALSE; - } - /* Close descriptor as it would never be used */ - close (fd); - cache->map = map; - /* Now free old values for saved cache items and fill them with mmapped ones */ - i = 0; - cur = g_list_first (cache->negative_items); - while (cur) { - item = cur->data; - item->s = (struct saved_cache_item *)(map + i * sizeof (struct saved_cache_item)); - cur = g_list_next (cur); - i ++; - } - cur = g_list_first (cache->static_items); - while (cur) { - item = cur->data; - item->s = (struct saved_cache_item *)(map + i * sizeof (struct saved_cache_item)); - cur = g_list_next (cur); - i ++; - } + cache->map = map; + /* Now free old values for saved cache items and fill them with mmapped ones */ + i = 0; + cur = g_list_first (cache->negative_items); + while (cur) { + item = cur->data; + item->s = (struct saved_cache_item *)(map + i * sizeof (struct saved_cache_item)); + cur = g_list_next (cur); + i ++; + } + cur = g_list_first (cache->static_items); + while (cur) { + item = cur->data; + item->s = (struct saved_cache_item *)(map + i * sizeof (struct saved_cache_item)); + cur = g_list_next (cur); + i ++; + } - post_cache_init (cache); + post_cache_init (cache); + } return TRUE; }