mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-25 18:23:42 +00:00
Refine memory management (#579)
- Added one macro to avoid dangling pointers - Added two functions to perform NULL pointer check since the allocation is not guaranteed by C library, although it is a rare case, just for sanity - Add NULL pointer check to brealloc() and bfree() and for sanity as well Signed-off-by: Syrone Wong <wong.syrone@gmail.com>
This commit is contained in:
+11
-11
@@ -28,6 +28,7 @@
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include "cache.h"
|
||||
#include "mm-wrapper.h"
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#include "win32.h"
|
||||
@@ -91,13 +92,12 @@ int cache_delete(struct cache *cache, int keep_data)
|
||||
cache->free_cb(entry->data);
|
||||
}
|
||||
}
|
||||
free(entry->key);
|
||||
free(entry);
|
||||
SS_SAFEFREE(entry->key);
|
||||
SS_SAFEFREE(entry);
|
||||
}
|
||||
}
|
||||
|
||||
free(cache);
|
||||
cache = NULL;
|
||||
SS_SAFEFREE(cache);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -130,11 +130,11 @@ int cache_remove(struct cache *cache, char *key, size_t key_len)
|
||||
if (cache->free_cb) {
|
||||
cache->free_cb(tmp->data);
|
||||
} else {
|
||||
free(tmp->data);
|
||||
SS_SAFEFREE(tmp->data);
|
||||
}
|
||||
}
|
||||
free(tmp->key);
|
||||
free(tmp);
|
||||
SS_SAFEFREE(tmp->key);
|
||||
SS_SAFEFREE(tmp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -230,7 +230,7 @@ int cache_insert(struct cache *cache, char *key, size_t key_len, void *data)
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
entry->key = malloc(key_len);
|
||||
entry->key = SS_SAFEMALLOC(key_len);
|
||||
memcpy(entry->key, key, key_len);
|
||||
entry->data = data;
|
||||
HASH_ADD_KEYPTR(hh, cache->entries, entry->key, key_len, entry);
|
||||
@@ -242,11 +242,11 @@ int cache_insert(struct cache *cache, char *key, size_t key_len, void *data)
|
||||
if (cache->free_cb) {
|
||||
cache->free_cb(entry->data);
|
||||
} else {
|
||||
free(entry->data);
|
||||
SS_SAFEFREE(entry->data);
|
||||
}
|
||||
}
|
||||
free(entry->key);
|
||||
free(entry);
|
||||
SS_SAFEFREE(entry->key);
|
||||
SS_SAFEFREE(entry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user