瀏覽代碼

mem: safety prev free checks for f_malloc extract operation

- following a report by Alex Balashov

(cherry picked from commit a620bfec37cdcdc5c5debcdfb5219b09464065fe)
(cherry picked from commit de7eb56737ca57429dd6ffcb01907b11609318f1)
Daniel-Constantin Mierla 10 年之前
父節點
當前提交
b1c4c1966d
共有 1 個文件被更改,包括 23 次插入0 次删除
  1. 23 0
      mem/f_malloc.c

+ 23 - 0
mem/f_malloc.c

@@ -203,6 +203,29 @@ static inline void fm_extract_free(struct fm_block* qm, struct fm_frag* frag)
 	pf = frag->prv_free;
 	hash = GET_HASH(frag->size);
 
+	if(unlikely(pf==0)) {
+		/* try to discover previous fragment (safety review) */
+		LM_WARN("missing prev info for fragment %p from %p [%d]\n",
+					frag, qm, hash);
+		if(likely(qm->free_hash[hash].first)) {
+			if(likely(qm->free_hash[hash].first==frag)) {
+				pf = &(qm->free_hash[hash].first);
+			} else {
+				for(pf=&(qm->free_hash[hash].first); (*pf); pf=&((*pf)->u.nxt_free)) {
+					if((*pf)->u.nxt_free==frag) {
+						break;
+					}
+				}
+			}
+		}
+		if(unlikely(pf==0)) {
+			LM_ALERT("attemting to extract inexistent fragment %p from %p [%d]\n",
+					frag, qm, hash);
+			return;
+		}
+		frag->prv_free = pf;
+	}
+
 	*pf=frag->u.nxt_free;
 
 	if(frag->u.nxt_free) frag->u.nxt_free->prv_free = pf;