From: Chip Black Date: Mon, 21 Feb 2011 21:28:03 +0000 (-0600) Subject: Clean up some error handling in tag listing X-Git-Tag: v1.5~25 X-Git-Url: http://git.bytex64.net/?a=commitdiff_plain;h=efabc7da2c7dff11ab6835d23655a023f1cbc296;hp=bfc01c15f56c58cefc8680f7faed4c5e3650fa38;p=blerg.git Clean up some error handling in tag listing --- diff --git a/database/tags.c b/database/tags.c index d15f8b8..5b3b3ce 100644 --- a/database/tags.c +++ b/database/tags.c @@ -128,26 +128,28 @@ struct tag * tag_list(const char *tag, uint64_t offset, int *count, int directio fstat(tag_fd, &st); if (st.st_size == 0) { - close(tag_fd); *count = 0; - return NULL; + goto tag_list_map_failed; } n_tag_records = st.st_size / sizeof(struct tag); - if (*count > n_tag_records) - *count = n_tag_records; + if (*count > n_tag_records - offset) + *count = n_tag_records - offset; if (offset > n_tag_records) { fprintf(stderr, "Cannot access tag record beyond end\n"); - return NULL; + *count = 0; + goto tag_list_map_failed; } taglist = (struct tag *) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, tag_fd, 0); if (taglist == MAP_FAILED) { perror("Could not mmap tag file"); + *count = 0; goto tag_list_map_failed; } retlist = (struct tag *) malloc(sizeof(struct tag) * *count); if (retlist == NULL) { perror("Could not allocate memory for tag list"); + *count = 0; goto tag_list_malloc_failed; } switch(direction) {