X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=database%2Ftags.c;fp=database%2Ftags.c;h=5b3b3ce9ab8ed5c5c3ece9f7b3ac6ed462705c48;hb=efabc7da2c7dff11ab6835d23655a023f1cbc296;hp=d15f8b88d91f01e15833ba7efd9730fd71652f9a;hpb=bfc01c15f56c58cefc8680f7faed4c5e3650fa38;p=blerg.git 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) {