]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Add more sanity guards for evictions
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 13 May 2017 08:58:07 +0000 (09:58 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 13 May 2017 08:58:07 +0000 (09:58 +0100)
src/libutil/hash.c

index 1de90b6059bde92054e20fe848b7e3f0871f7614..1f4fdc22bcdf595bd1d2913a514a6be92bb45fdc 100644 (file)
@@ -71,24 +71,33 @@ rspamd_lru_hash_remove_evicted (rspamd_lru_hash_t *hash,
 {
        guint i;
 
-       g_assert (elt->eviction_pos < eviction_candidates);
+       g_assert (hash->eviction_used > 0);
+       g_assert (elt->eviction_pos < hash->eviction_used);
 
        memmove (&hash->eviction_pool[elt->eviction_pos],
                        &hash->eviction_pool[elt->eviction_pos + 1],
                        sizeof (rspamd_lru_element_t *) *
                                        (eviction_candidates - elt->eviction_pos - 1));
-       hash->eviction_used --;
 
-       if (elt->lg_usages <= hash->eviction_min_prio) {
-               /* We also need to update min_prio */
-               hash->eviction_min_prio = G_MAXUINT;
+       hash->eviction_used--;
 
-               for (i = 0; i < hash->eviction_used; i ++) {
-                       if (hash->eviction_min_prio > hash->eviction_pool[i]->lg_usages) {
-                               hash->eviction_min_prio = hash->eviction_pool[i]->lg_usages;
+       if (hash->eviction_used > 0) {
+               if (elt->lg_usages <= hash->eviction_min_prio) {
+                       /* We also need to update min_prio */
+                       hash->eviction_min_prio = G_MAXUINT;
+
+                       for (i = 0; i < hash->eviction_used; i ++) {
+                               if (hash->eviction_min_prio > hash->eviction_pool[i]->lg_usages) {
+                                       hash->eviction_min_prio = hash->eviction_pool[i]->lg_usages;
+                               }
                        }
                }
        }
+       else {
+               hash->eviction_min_prio = G_MAXUINT;
+       }
+
+
 }
 
 static void
@@ -143,7 +152,7 @@ rspamd_lru_hash_maybe_evict (rspamd_lru_hash_t *hash,
 
                        return TRUE;
                }
-               else if (hash->eviction_min_prio > elt->lg_usages) {
+               else {
                        /* Find any candidate that has higher usage count */
                        for (i = 0; i < hash->eviction_used; i ++) {
                                cur = hash->eviction_pool[i];
@@ -152,7 +161,10 @@ rspamd_lru_hash_maybe_evict (rspamd_lru_hash_t *hash,
                                        cur->eviction_pos = -1;
                                        elt->eviction_pos = i;
                                        hash->eviction_pool[i] = elt;
-                                       hash->eviction_min_prio = elt->lg_usages;
+
+                                       if (hash->eviction_min_prio > elt->lg_usages) {
+                                               hash->eviction_min_prio = elt->lg_usages;
+                                       }
 
                                        return TRUE;
                                }