Mesa (master): util: fix possible null pointer usage

Zack Rusin zack at kemper.freedesktop.org
Tue Jul 7 01:40:12 UTC 2009


Module: Mesa
Branch: master
Commit: 4873031e29e0e8f654f78307e6ec885e68a54d86
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4873031e29e0e8f654f78307e6ec885e68a54d86

Author: Zack Rusin <zack at kde.org>
Date:   Sat Jun 20 21:19:57 2009 -0400

util: fix possible null pointer usage

found by the clang static analyzer

---

 src/gallium/auxiliary/util/u_cache.c        |   10 +++++++++-
 src/gallium/auxiliary/util/u_handle_table.c |   13 +++++++++----
 src/gallium/auxiliary/util/u_hash_table.c   |   22 +++++++++++++++++-----
 src/gallium/auxiliary/util/u_keymap.c       |   12 +++++++++++-
 4 files changed, 46 insertions(+), 11 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_cache.c b/src/gallium/auxiliary/util/u_cache.c
index 41cd381..47c16b1 100644
--- a/src/gallium/auxiliary/util/u_cache.c
+++ b/src/gallium/auxiliary/util/u_cache.c
@@ -137,6 +137,8 @@ util_cache_set(struct util_cache *cache,
    struct util_cache_entry *entry;
 
    assert(cache);
+   if (!cache)
+      return;
 
    entry = util_cache_entry_get(cache, key);
    util_cache_entry_destroy(cache, entry);
@@ -158,6 +160,8 @@ util_cache_get(struct util_cache *cache,
    struct util_cache_entry *entry;
 
    assert(cache);
+   if (!cache)
+      return NULL;
 
    entry = util_cache_entry_get(cache, key);
    if(!entry->key && !entry->value)
@@ -176,7 +180,9 @@ util_cache_clear(struct util_cache *cache)
    uint32_t i;
 
    assert(cache);
-   
+   if (!cache)
+      return;
+
    for(i = 0; i < cache->size; ++i)
       util_cache_entry_destroy(cache, &cache->entries[i]);
 }
@@ -186,6 +192,8 @@ void
 util_cache_destroy(struct util_cache *cache)
 {
    assert(cache);
+   if (!cache)
+      return;
 
 #ifdef DEBUG
    if(cache->count >= 20*cache->size) {
diff --git a/src/gallium/auxiliary/util/u_handle_table.c b/src/gallium/auxiliary/util/u_handle_table.c
index 6da7353..3703718 100644
--- a/src/gallium/auxiliary/util/u_handle_table.c
+++ b/src/gallium/auxiliary/util/u_handle_table.c
@@ -87,6 +87,8 @@ handle_table_set_destroy(struct handle_table *ht,
                          void (*destroy)(void *object))
 {
    assert(ht);
+   if (!ht)
+      return;
    ht->destroy = destroy;
 }
 
@@ -155,7 +157,7 @@ handle_table_add(struct handle_table *ht,
    
    assert(ht);
    assert(object);
-   if(!object)
+   if(!object || !ht)
       return 0;
 
    /* linear search for an empty handle */
@@ -193,7 +195,7 @@ handle_table_set(struct handle_table *ht,
    
    assert(ht);
    assert(handle);
-   if(!handle)
+   if(!handle || !ht)
       return 0;
 
    assert(object);
@@ -222,7 +224,7 @@ handle_table_get(struct handle_table *ht,
    
    assert(ht);
    assert(handle);
-   if(!handle || handle > ht->size)
+   if(!handle || !ht || handle > ht->size)
       return NULL;
 
    object = ht->objects[handle - 1];
@@ -240,7 +242,7 @@ handle_table_remove(struct handle_table *ht,
    
    assert(ht);
    assert(handle);
-   if(!handle || handle > ht->size)
+   if(!handle || !ht || handle > ht->size)
       return;
 
    index = handle - 1;
@@ -283,6 +285,9 @@ handle_table_destroy(struct handle_table *ht)
    unsigned index;
    assert(ht);
 
+   if (!ht)
+      return;
+
    if(ht->destroy)
       for(index = 0; index < ht->size; ++index)
          handle_table_clear(ht, index);
diff --git a/src/gallium/auxiliary/util/u_hash_table.c b/src/gallium/auxiliary/util/u_hash_table.c
index 2f83e31..8c2a8f4 100644
--- a/src/gallium/auxiliary/util/u_hash_table.c
+++ b/src/gallium/auxiliary/util/u_hash_table.c
@@ -148,6 +148,8 @@ hash_table_set(struct hash_table *ht,
    struct cso_hash_iter iter;
 
    assert(ht);
+   if (!ht)
+      return PIPE_ERROR_BAD_INPUT;
 
    key_hash = ht->hash(key);
 
@@ -183,6 +185,8 @@ hash_table_get(struct hash_table *ht,
    struct hash_table_item *item;
 
    assert(ht);
+   if (!ht)
+      return NULL;
 
    key_hash = ht->hash(key);
 
@@ -203,6 +207,8 @@ hash_table_remove(struct hash_table *ht,
    struct hash_table_item *item;
 
    assert(ht);
+   if (!ht)
+      return;
 
    key_hash = ht->hash(key);
 
@@ -225,7 +231,9 @@ hash_table_clear(struct hash_table *ht)
    struct hash_table_item *item;
 
    assert(ht);
-   
+   if (!ht)
+      return;
+
    iter = cso_hash_first_node(ht->cso);
    while (!cso_hash_iter_is_null(iter)) {
       item = (struct hash_table_item *)cso_hash_take(ht->cso, cso_hash_iter_key(iter));
@@ -243,9 +251,11 @@ hash_table_foreach(struct hash_table *ht,
    struct cso_hash_iter iter;
    struct hash_table_item *item;
    enum pipe_error result;
-   
+
    assert(ht);
-   
+   if (!ht)
+      return PIPE_ERROR_BAD_INPUT;
+
    iter = cso_hash_first_node(ht->cso);
    while (!cso_hash_iter_is_null(iter)) {
       item = (struct hash_table_item *)cso_hash_iter_data(iter);
@@ -264,9 +274,11 @@ hash_table_destroy(struct hash_table *ht)
 {
    struct cso_hash_iter iter;
    struct hash_table_item *item;
-   
+
    assert(ht);
-   
+   if (!ht)
+      return;
+
    iter = cso_hash_first_node(ht->cso);
    while (!cso_hash_iter_is_null(iter)) {
       item = (struct hash_table_item *)cso_hash_iter_data(iter);
diff --git a/src/gallium/auxiliary/util/u_keymap.c b/src/gallium/auxiliary/util/u_keymap.c
index 3f70809..508a2ee 100644
--- a/src/gallium/auxiliary/util/u_keymap.c
+++ b/src/gallium/auxiliary/util/u_keymap.c
@@ -194,6 +194,8 @@ util_keymap_insert(struct keymap *map, const void *key,
    struct cso_hash_iter iter;
 
    assert(map);
+   if (!map)
+      return FALSE;
 
    key_hash = hash(key, map->key_size);
 
@@ -234,6 +236,8 @@ util_keymap_lookup(const struct keymap *map, const void *key)
    struct keymap_item *item;
 
    assert(map);
+   if (!map)
+      return NULL;
 
    key_hash = hash(key, map->key_size);
 
@@ -258,6 +262,8 @@ util_keymap_remove(struct keymap *map, const void *key, void *user)
    struct keymap_item *item;
 
    assert(map);
+   if (!map)
+      return;
 
    key_hash = hash(key, map->key_size);
 
@@ -267,6 +273,8 @@ util_keymap_remove(struct keymap *map, const void *key, void *user)
    
    item = hash_table_item(iter);
    assert(item);
+   if (!item)
+      return;
    map->delete_func(map, item->key, item->value, user);
    FREE(item->key);
    FREE(item);
@@ -288,7 +296,9 @@ util_keymap_remove_all(struct keymap *map, void *user)
    struct keymap_item *item;
 
    assert(map);
-   
+   if (!map)
+      return;
+
    iter = cso_hash_first_node(map->cso);
    while (!cso_hash_iter_is_null(iter)) {
       item = (struct keymap_item *)




More information about the mesa-commit mailing list