slist/dlist: container node can't be NULL in *_PEEK_NEXT_CONTAINER

Using MPU enabled HW it was evident that a NULL access
(with offset) was happening in the TCP stack due to the
following message:
***** MPU FAULT *****
  Executing thread ID (thread): 0x20009b0c
  Faulting instruction address:  0x8034496
  Data Access Violation
  Address: 0x34
Fatal fault in essential thread! Spinning...

Turns out we are referencing a potentially de-referenced
NULL pointer in the SYS_SLIST_PEEK_NEXT_CONTAINER macro.

Let's avoid this by checking the container node for NULL.

Also fix dlist.h SYS_DLIST_PEEK_NEXT_CONTAINER with the same
issue.

Change-Id: I2e765b9af7bcaf8fb13f7c9b7e081f9e6d4928f2
Signed-off-by: Michael Scott <michael.scott@linaro.org>
This commit is contained in:
Michael Scott 2017-04-27 13:54:45 -07:00 committed by Anas Nashif
parent acedb70a94
commit 841a59cb0c
2 changed files with 4 additions and 2 deletions

View file

@ -127,7 +127,8 @@ typedef struct _dnode sys_dnode_t;
* @param __n The field name of sys_dnode_t within the container struct
*/
#define SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n) \
SYS_DLIST_CONTAINER(sys_dlist_peek_next(__dl, &(__cn->__n)), __cn, __n)
((__cn) ? SYS_DLIST_CONTAINER(sys_dlist_peek_next(__dl, &(__cn->__n)), \
__cn, __n) : NULL)
/**
* @brief Provide the primitive to iterate on a list under a container

View file

@ -133,7 +133,8 @@ typedef struct _slist sys_slist_t;
*/
#define SYS_SLIST_PEEK_NEXT_CONTAINER(__cn, __n) \
SYS_SLIST_CONTAINER(sys_slist_peek_next(&((__cn)->__n)), __cn, __n)
((__cn) ? SYS_SLIST_CONTAINER(sys_slist_peek_next(&((__cn)->__n)), \
__cn, __n) : NULL)
/**
* @brief Provide the primitive to iterate on a list under a container