commit:efabc7da2c7dff11ab6835d23655a023f1cbc296
author:Chip Black
committer:Chip Black
date:Mon Feb 21 15:28:03 2011 -0600
parents:bfc01c15f56c58cefc8680f7faed4c5e3650fa38
Clean up some error handling in tag listing
diff --git a/database/tags.c b/database/tags.c
line changes: +7/-5
index d15f8b8..5b3b3ce
--- 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) {