diff --git a/CHANGELOG b/CHANGELOG index 969325bc..943f1cf2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -145,6 +145,9 @@ HISTORY ++ Bugfixes: + 2012-08-22: Simon Goldschmidt + * memp.c: fixed bug #37166: memp_sanity check loops itself + 2012-08-13: Simon Goldschmidt * dhcp.c: fixed bug #36645: Calling dhcp_release before dhcp_start dereferences NULL diff --git a/src/core/memp.c b/src/core/memp.c index 4a55f8f2..8e4b9226 100644 --- a/src/core/memp.c +++ b/src/core/memp.c @@ -181,19 +181,20 @@ static u8_t memp_memory[MEM_ALIGNMENT - 1 #if MEMP_SANITY_CHECK /** - * Check that memp-lists don't form a circle + * Check that memp-lists don't form a circle, using "Floyd's cycle-finding algorithm". */ static int memp_sanity(void) { - s16_t i, c; - struct memp *m, *n; + s16_t i; + struct memp *t, *h; for (i = 0; i < MEMP_MAX; i++) { - for (m = memp_tab[i]; m != NULL; m = m->next) { - c = 1; - for (n = memp_tab[i]; n != NULL; n = n->next) { - if (n == m && --c < 0) { + t = memp_tab[i]; + if(t != NULL) { + for (h = t->next; (t != NULL) && (h != NULL); t = t->next, + h = (((h->next != NULL) && (h->next->next != NULL)) ? h->next->next : NULL)) { + if (t == h) { return 0; } }