summaryrefslogtreecommitdiffstats
path: root/src/hashtable.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2026-11-05 12:01:59 +0100
committerGravatar Nikias Bassen2026-11-05 12:01:59 +0100
commit4dc93bc274867b42aa82fc91ee4d5878d23a3f36 (patch)
tree11c566b80561bb44018bceea028ea03d47e53458 /src/hashtable.c
parentf252f243f9774b2b830172b49aa340d6994d8081 (diff)
downloadlibplist-4dc93bc274867b42aa82fc91ee4d5878d23a3f36.tar.gz
libplist-4dc93bc274867b42aa82fc91ee4d5878d23a3f36.tar.bz2
Harden allocation failure handling and size arithmetic
- check malloc/calloc/realloc results in constructors, the JSON and OpenStep writers, the XML text-part helpers and base64 decoding, and return PLIST_ERR_NO_MEM instead of asserting or dereferencing NULL - guard size calculations against overflow in the UTF-8/UTF-16BE conversions, ptrarray, and bytearray - make hash_table_insert() report failure instead of silently dropping the entry; writers propagate PLIST_ERR_NO_MEM, and dict lookup caches are discarded so lookups fall back to a linear search - don't overwrite an earlier parse error code in the XML parser, and report PLIST_ERR_NO_MEM when reading text content fails for lack of memory - OpenStep parser: check node/data/string allocations and dict/array insertion results Based on #323 by bg0d-droid. Co-authored-by: bg0d-droid <81825610+bg0d-droid@users.noreply.github.com>
Diffstat (limited to 'src/hashtable.c')
-rw-r--r--src/hashtable.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/hashtable.c b/src/hashtable.c
index dd6dbfc..e3f9b98 100644
--- a/src/hashtable.c
+++ b/src/hashtable.c
@@ -24,6 +24,9 @@ hashtable_t* hash_table_new(hash_func_t hash_func, compare_func_t compare_func,
{
hashtable_t* ht = (hashtable_t*)malloc(sizeof(hashtable_t));
int i;
+ if (!ht) {
+ return NULL;
+ }
for (i = 0; i < 4096; i++) {
ht->entries[i] = NULL;
}
@@ -55,9 +58,9 @@ void hash_table_destroy(hashtable_t *ht)
free(ht);
}
-void hash_table_insert(hashtable_t* ht, void *key, void *value)
+int hash_table_insert(hashtable_t* ht, void *key, void *value)
{
- if (!ht || !key) return;
+ if (!ht || !key) return -1;
unsigned int hash = ht->hash_func(key);
@@ -69,7 +72,7 @@ void hash_table_insert(hashtable_t* ht, void *key, void *value)
if (ht->compare_func(e->key, key)) {
// element already present. replace value.
e->value = value;
- return;
+ return 0;
}
e = e->next;
}
@@ -78,6 +81,9 @@ void hash_table_insert(hashtable_t* ht, void *key, void *value)
// make a new entry.
hashentry_t* entry = (hashentry_t*)malloc(sizeof(hashentry_t));
+ if (!entry) {
+ return -1;
+ }
entry->key = key;
entry->value = value;
if (!ht->entries[idx0]) {
@@ -89,6 +95,7 @@ void hash_table_insert(hashtable_t* ht, void *key, void *value)
}
ht->entries[idx0] = entry;
ht->count++;
+ return 0;
}
void* hash_table_lookup(hashtable_t* ht, void *key)