summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2018-12-01 10:52:44 +0100
committerPatrick Steinhardt <ps@pks.im>2019-02-15 13:16:48 +0100
commit8da93944f3d3c271ea7a2ec035c6ea48654fa71e (patch)
tree44f45d20c8faaef0715b2683e4457b4abf595f91
parent661fc57b2cd4bcc1024aa3c6a7ffb3190571685e (diff)
downloadlibgit2-8da93944f3d3c271ea7a2ec035c6ea48654fa71e.tar.gz
idxmap: have `resize` functions return proper error code
The currently existing function `git_idxmap_resize` and `git_idxmap_icase_resize` do not return any error codes at all due to their previous implementation making use of a macro. Due to that, it is impossible to see whether the resize operation might have failed due to an out-of-memory situation. Fix this by providing a proper error code. Adjust callers to make use of it.
-rw-r--r--src/idxmap.c28
-rw-r--r--src/idxmap.h23
-rw-r--r--src/index.c36
3 files changed, 60 insertions, 27 deletions
diff --git a/src/idxmap.c b/src/idxmap.c
index 3511229dd..e3fcfb82c 100644
--- a/src/idxmap.c
+++ b/src/idxmap.c
@@ -68,6 +68,24 @@ void git_idxmap_icase_clear(git_idxmap_icase *map)
kh_clear(idxicase, map);
}
+int git_idxmap_resize(git_idxmap *map, size_t size)
+{
+ if (kh_resize(idx, map, size) < 0) {
+ git_error_set_oom();
+ return -1;
+ }
+ return 0;
+}
+
+int git_idxmap_icase_resize(git_idxmap_icase *map, size_t size)
+{
+ if (kh_resize(idxicase, map, size) < 0) {
+ git_error_set_oom();
+ return -1;
+ }
+ return 0;
+}
+
void *git_idxmap_get(git_idxmap *map, const git_index_entry *key)
{
size_t idx = git_idxmap_lookup_index(map, key);
@@ -177,16 +195,6 @@ int git_idxmap_icase_has_data(git_idxmap_icase *map, size_t idx)
return kh_exist(map, idx);
}
-void git_idxmap_resize(git_idxmap *map, size_t size)
-{
- kh_resize(idx, map, size);
-}
-
-void git_idxmap_icase_resize(git_idxmap_icase *map, size_t size)
-{
- kh_resize(idxicase, map, size);
-}
-
void git_idxmap_delete_at(git_idxmap *map, size_t idx)
{
kh_del(idx, map, idx);
diff --git a/src/idxmap.h b/src/idxmap.h
index 55d60d5f1..cf142548e 100644
--- a/src/idxmap.h
+++ b/src/idxmap.h
@@ -77,6 +77,26 @@ void git_idxmap_clear(git_idxmap *map);
void git_idxmap_icase_clear(git_idxmap_icase *map);
/**
+ * Resize the map by allocating more memory.
+ *
+ * @param map map that shall be resized
+ * @param size count of entries that the map shall hold
+ * @return `0` if the map was successfully resized, a negative
+ * error code otherwise
+ */
+int git_idxmap_resize(git_idxmap *map, size_t size);
+
+/**
+ * Resize the map by allocating more memory.
+ *
+ * @param map map that shall be resized
+ * @param size count of entries that the map shall hold
+ * @return `0` if the map was successfully resized, a negative
+ * error code otherwise
+ */
+int git_idxmap_icase_resize(git_idxmap_icase *map, size_t size);
+
+/**
* Return value associated with the given key.
*
* @param map map to search key in
@@ -137,9 +157,6 @@ int git_idxmap_icase_valid_index(git_idxmap_icase *map, size_t idx);
int git_idxmap_has_data(git_idxmap *map, size_t idx);
int git_idxmap_icase_has_data(git_idxmap_icase *map, size_t idx);
-void git_idxmap_resize(git_idxmap *map, size_t size);
-void git_idxmap_icase_resize(git_idxmap_icase *map, size_t size);
-
void git_idxmap_delete_at(git_idxmap *map, size_t idx);
void git_idxmap_icase_delete_at(git_idxmap_icase *map, size_t idx);
diff --git a/src/index.c b/src/index.c
index 308b89a16..ee8dfd541 100644
--- a/src/index.c
+++ b/src/index.c
@@ -1619,8 +1619,9 @@ int git_index__fill(git_index *index, const git_vector *source_entries)
if (!source_entries->length)
return 0;
- git_vector_size_hint(&index->entries, source_entries->length);
- git_idxmap_resize(index->entries_map, (size_t)(source_entries->length * 1.3));
+ if (git_vector_size_hint(&index->entries, source_entries->length) < 0 ||
+ git_idxmap_resize(index->entries_map, (size_t)(source_entries->length * 1.3)) < 0)
+ return -1;
git_vector_foreach(source_entries, i, source_entry) {
git_index_entry *entry = NULL;
@@ -2608,10 +2609,12 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
assert(!index->entries.length);
- if (index->ignore_case)
- git_idxmap_icase_resize((git_idxmap_icase *) index->entries_map, header.entry_count);
- else
- git_idxmap_resize(index->entries_map, header.entry_count);
+ if (index->ignore_case &&
+ (error = git_idxmap_icase_resize((git_idxmap_icase *) index->entries_map,
+ header.entry_count)) < 0)
+ return error;
+ else if ((error = git_idxmap_resize(index->entries_map, header.entry_count)) < 0)
+ return error;
/* Parse all the entries */
for (i = 0; i < header.entry_count && buffer_size > INDEX_FOOTER_SIZE; ++i) {
@@ -3125,10 +3128,12 @@ int git_index_read_tree(git_index *index, const git_tree *tree)
if ((error = git_tree_walk(tree, GIT_TREEWALK_POST, read_tree_cb, &data)) < 0)
goto cleanup;
- if (index->ignore_case)
- git_idxmap_icase_resize((git_idxmap_icase *) entries_map, entries.length);
- else
- git_idxmap_resize(entries_map, entries.length);
+ if (index->ignore_case &&
+ (error = git_idxmap_icase_resize((git_idxmap_icase *) entries_map,
+ entries.length)) < 0)
+ goto cleanup;
+ else if ((error = git_idxmap_resize(entries_map, entries.length)) < 0)
+ goto cleanup;
git_vector_foreach(&entries, i, e) {
INSERT_IN_MAP_EX(index, entries_map, e, error);
@@ -3185,10 +3190,13 @@ static int git_index_read_iterator(
(error = git_idxmap_new(&new_entries_map)) < 0)
goto done;
- if (index->ignore_case && new_length_hint)
- git_idxmap_icase_resize((git_idxmap_icase *) new_entries_map, new_length_hint);
- else if (new_length_hint)
- git_idxmap_resize(new_entries_map, new_length_hint);
+ if (index->ignore_case && new_length_hint &&
+ (error = git_idxmap_icase_resize((git_idxmap_icase *) new_entries_map,
+ new_length_hint)) < 0)
+ goto done;
+ else if (new_length_hint &&
+ (error = git_idxmap_resize(new_entries_map, new_length_hint)) < 0)
+ goto done;
opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE |
GIT_ITERATOR_INCLUDE_CONFLICTS;