[sr-dev] git:master:a620bfec: mem: safety prev free checks for f_malloc extract operation
Daniel-Constantin Mierla
miconda at gmail.com
Thu Aug 27 15:40:13 CEST 2015
Module: kamailio
Branch: master
Commit: a620bfec37cdcdc5c5debcdfb5219b09464065fe
URL: https://github.com/kamailio/kamailio/commit/a620bfec37cdcdc5c5debcdfb5219b09464065fe
Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2015-08-27T15:38:03+02:00
mem: safety prev free checks for f_malloc extract operation
- following a report by Alex Balashov
---
Modified: mem/f_malloc.c
---
Diff: https://github.com/kamailio/kamailio/commit/a620bfec37cdcdc5c5debcdfb5219b09464065fe.diff
Patch: https://github.com/kamailio/kamailio/commit/a620bfec37cdcdc5c5debcdfb5219b09464065fe.patch
---
diff --git a/mem/f_malloc.c b/mem/f_malloc.c
index fa8cb49..a4def82 100644
--- a/mem/f_malloc.c
+++ b/mem/f_malloc.c
@@ -179,6 +179,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;
More information about the sr-dev
mailing list