diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-26 11:34:40 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-26 11:34:40 -0500 |
| commit | fd4df830de4d9fdc399b8088e5cc801e052391c4 (patch) | |
| tree | 1dc410c7e743e673ad8ad00ce332202fab06c177 | |
| parent | a1acf425cfb00a41c7862c915eb024207658c814 (diff) | |
| download | netcosm-fd4df830de4d9fdc399b8088e5cc801e052391c4.zip netcosm-fd4df830de4d9fdc399b8088e5cc801e052391c4.tar.gz netcosm-fd4df830de4d9fdc399b8088e5cc801e052391c4.tar.bz2 netcosm-fd4df830de4d9fdc399b8088e5cc801e052391c4.tar.xz | |
fix some memory leaks and a serialization bug
| -rw-r--r-- | src/room.c | 13 | ||||
| -rw-r--r-- | src/server.c | 4 | ||||
| -rw-r--r-- | src/userdb.c | 25 | ||||
| -rw-r--r-- | src/util.c | 7 | ||||
| -rw-r--r-- | worlds/test.c | 13 |
5 files changed, 47 insertions, 15 deletions
@@ -94,7 +94,7 @@ void world_save(const char *fname) if(!obj) break; id = ROOM_NONE; - + obj_write(fd, obj); } } close(fd); @@ -104,6 +104,7 @@ static void room_free(struct room_t *room) { hash_free(room->users); room->users = NULL; + hash_setfreedata_cb(room->objects, obj_free); hash_free(room->objects); room->objects = NULL; free(room->data.name); @@ -132,21 +133,12 @@ bool room_obj_add(room_id room, struct object_t *obj) #define OBJMAP_SIZE 8 -static void free_obj(void *ptr) -{ - struct object_t *obj = ptr; - if(obj->class->hook_destroy) - obj->class->hook_destroy(obj); - free(obj); -} - /* initialize the room's hash tables */ static void room_init_maps(struct room_t *room) { room->users = hash_init((userdb_size() / 2) + 1, hash_djb, compare_strings); room->objects = hash_init(OBJMAP_SIZE, hash_djb, compare_strings); - hash_setfreedata_cb(room->objects, free_obj); } /** @@ -201,6 +193,7 @@ bool world_load(const char *fname, const struct roomdata_t *data, size_t data_sz for(unsigned j = 0; j < n_objects; ++j) { + debugf("READING %dth OBJECT\n", j); struct object_t *obj = obj_read(fd); if(!room_obj_add(i, obj)) diff --git a/src/server.c b/src/server.c index d81075c..e67fa20 100644 --- a/src/server.c +++ b/src/server.c @@ -127,6 +127,8 @@ static void __attribute__((noreturn)) serv_cleanup(void) userdb_shutdown(); + obj_shutdown(); + extern char *current_user; if(current_user) free(current_user); @@ -260,6 +262,8 @@ static void new_connection_cb(EV_P_ ev_io *w, int revents) /* user DB requests go through the master */ userdb_shutdown(); + obj_shutdown(); + debugf("Child with PID %d spawned\n", getpid()); server_socket = new_sock; diff --git a/src/userdb.c b/src/userdb.c index e107a6c..5e948ab 100644 --- a/src/userdb.c +++ b/src/userdb.c @@ -26,9 +26,25 @@ static void *map = NULL; static char *db_file = NULL; +static void free_userdata_and_objs(void *ptr) +{ + struct userdata_t *data = ptr; + + debugf("Freeing DATA AND OBJECTS of %s\n", data->username); + + if(data->objects) + { + hash_setfreedata_cb(data->objects, obj_free); + hash_free(data->objects); + data->objects = NULL; + } + free(data); +} + static void free_userdata(void *ptr) { struct userdata_t *data = ptr; + hash_free(data->objects); free(data); } @@ -55,11 +71,17 @@ void userdb_init(const char *file) struct userdata_t *data = calloc(1, sizeof(*data)); if(read(fd, data, sizeof(*data)) != sizeof(*data)) + { + free(data); break; + } size_t n_objects; if(read(fd, &n_objects, sizeof(n_objects)) != sizeof(n_objects)) + { + free(data); break; + } data->objects = hash_init(MIN(8, n_objects), hash_djb, @@ -114,7 +136,6 @@ void userdb_write(const char *file) if(!obj) break; objptr = NULL; - debugf("WRITING OBJECT %s\n", obj->name); obj_write(fd, obj); } } @@ -167,8 +188,10 @@ void userdb_shutdown(void) { if(map && db_file && !are_child) userdb_write(db_file); + if(map) { + hash_setfreedata_cb(map, free_userdata_and_objs); hash_free(map); map = NULL; } @@ -17,6 +17,7 @@ */ #include "globals.h" +#include <sys/resource.h> void remove_cruft(char *str) { @@ -90,7 +91,11 @@ room_id read_roomid(int fd) char *read_string(int fd) { size_t sz; - read(fd, &sz, sizeof(sz)); + if(read(fd, &sz, sizeof(sz)) != sizeof(sz)) + { + error("read_string: EOF"); + } + debugf("sz is %d\n", sz); char *ret = malloc(sz + 1); if(read(fd, ret, sz) < 0) { diff --git a/worlds/test.c b/worlds/test.c index 3f43a7a..2ce4122 100644 --- a/worlds/test.c +++ b/worlds/test.c @@ -9,7 +9,7 @@ static void portal_init(room_id id) { debugf("portal room init.\n"); struct object_t *new = obj_new("weapon"); - new->name = "sword"; + new->name = strdup("sword"); new->list = true; new->userdata = malloc(sizeof(double)); double p = 3.14159265358979323846L; @@ -99,7 +99,8 @@ const char *shiny(struct object_t *obj, user_t *user) void weap_serialize(int fd, struct object_t *obj) { - write(fd, obj->userdata, sizeof(double)); + if(obj->userdata) + write(fd, obj->userdata, sizeof(double)); } void weap_deserialize(int fd, struct object_t *obj) @@ -108,6 +109,12 @@ void weap_deserialize(int fd, struct object_t *obj) read(fd, obj->userdata, sizeof(double)); } +void weap_destroy(struct object_t *obj) +{ + free(obj->userdata); + obj->userdata = NULL; +} + const struct obj_class_t netcosm_obj_classes[] = { { "weapon", weap_serialize, @@ -115,7 +122,7 @@ const struct obj_class_t netcosm_obj_classes[] = { NULL, NULL, NULL, - NULL, + weap_destroy, shiny }, }; |