From: Chip Black Date: Sun, 2 Jun 2013 23:59:47 +0000 (-0500) Subject: More safety checks X-Git-Tag: v1.8.1~3 X-Git-Url: http://git.bytex64.net/?a=commitdiff_plain;h=142c00ad296af327d5d1718d60f23c0807033f15;p=blerg.git More safety checks --- diff --git a/database/database.c b/database/database.c index c0ec591..c8b9b58 100644 --- a/database/database.c +++ b/database/database.c @@ -17,6 +17,12 @@ #include "util.h" #include "config.h" +#define CHECK_VALID_BLERG(r) \ + if (blerg == NULL) { \ + fprintf(stderr, "Invalid struct blerg\n"); \ + return r; \ + } + uint64_t blerg_get_record_count(struct blerg *blerg) { uint64_t count; flock(blerg->meta_fd, LOCK_SH); @@ -218,6 +224,7 @@ open_failed_blerg_malloc: } int blerg_close(struct blerg *blerg) { + CHECK_VALID_BLERG(0) blerg_segment_close(blerg); munmap((void *)blerg->meta, sizeof(struct meta)); close(blerg->meta_fd); @@ -231,8 +238,10 @@ int blerg_store(struct blerg *blerg, const char *data, int len) { struct stat st; int n; - if (len > MAX_RECORD_SIZE) { - fprintf(stderr, "len > 64K\n"); + CHECK_VALID_BLERG(-1) + + if (len > MAX_RECORD_SIZE || len <= 0) { + fprintf(stderr, "len out of bounds\n"); return -1; } @@ -282,12 +291,13 @@ int blerg_store(struct blerg *blerg, const char *data, int len) { } int blerg_fetch(struct blerg *blerg, int record, char **data, int *length) { - if (record < 0) { + CHECK_VALID_BLERG(0) + if (record < 0 || record >= blerg_get_record_count(blerg)) { fprintf(stderr, "Invalid record\n"); return 0; } - if (record >= blerg_get_record_count(blerg)) { - fprintf(stderr, "Invalid record\n"); + if (data == NULL || length == NULL) { + fprintf(stderr, "data or length is null\n"); return 0; } @@ -329,11 +339,8 @@ int blerg_fetch(struct blerg *blerg, int record, char **data, int *length) { } time_t blerg_get_timestamp(struct blerg *blerg, int record) { - if (record < 0) { - fprintf(stderr, "Invalid record\n"); - return 0; - } - if (record >= blerg_get_record_count(blerg)) { + CHECK_VALID_BLERG(0) + if (record < 0 || record >= blerg_get_record_count(blerg)) { fprintf(stderr, "Invalid record\n"); return 0; } @@ -352,9 +359,12 @@ time_t blerg_get_timestamp(struct blerg *blerg, int record) { } int blerg_set_subscription_mark(struct blerg *blerg) { + CHECK_VALID_BLERG(0) blerg->meta->subscription_mark = subscription_count_items(blerg->name); + return 1; } uint64_t blerg_get_subscription_mark(struct blerg *blerg) { + CHECK_VALID_BLERG(0) return blerg->meta->subscription_mark; }