From 652a72385ca37ff44d372f70f1251dd239bd7ee3 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 22 Jul 2010 21:55:24 +0200 Subject: msgb: Check for available headroom/tailroom and abort() if we violate it --- include/osmocore/msgb.h | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/osmocore/msgb.h b/include/osmocore/msgb.h index 2841dc56..fb4a7013 100644 --- a/include/osmocore/msgb.h +++ b/include/osmocore/msgb.h @@ -23,6 +23,8 @@ #include #include "linuxlist.h" +#define MSGB_DEBUG + struct msgb { struct llist_head list; @@ -58,6 +60,16 @@ extern void msgb_enqueue(struct llist_head *queue, struct msgb *msg); extern struct msgb *msgb_dequeue(struct llist_head *queue); extern void msgb_reset(struct msgb *m); +#ifdef MSGB_DEBUG +#include +#include +static inline void msgb_abort(struct msgb *msg, const char *text) +{ + fprintf(stderr, text); + abort(); +} +#endif + #define msgb_l1(m) ((void *)(m->l1h)) #define msgb_l2(m) ((void *)(m->l2h)) #define msgb_l3(m) ((void *)(m->l3h)) @@ -82,9 +94,24 @@ static inline unsigned int msgb_headlen(const struct msgb *msgb) { return msgb->len - msgb->data_len; } + +static inline int msgb_tailroom(const struct msgb *msgb) +{ + return (msgb->head + msgb->data_len) - msgb->tail; +} + +static inline int msgb_headroom(const struct msgb *msgb) +{ + return (msgb->data - msgb->head); +} + static inline unsigned char *msgb_put(struct msgb *msgb, unsigned int len) { unsigned char *tmp = msgb->tail; +#ifdef MSGB_DEBUG + if (msgb_tailroom(msgb) < len) + msgb_abort(msgb, "Not enough tailroom\n"); +#endif msgb->tail += len; msgb->len += len; return tmp; @@ -132,6 +159,10 @@ static inline uint32_t msgb_get_u32(struct msgb *msgb) } static inline unsigned char *msgb_push(struct msgb *msgb, unsigned int len) { +#ifdef MSGB_DEBUG + if (msgb_headroom(msgb) < len) + msgb_abort(msgb, "Not enough headroom\n"); +#endif msgb->data -= len; msgb->len += len; return msgb->data; @@ -141,10 +172,6 @@ static inline unsigned char *msgb_pull(struct msgb *msgb, unsigned int len) msgb->len -= len; return msgb->data += len; } -static inline int msgb_tailroom(const struct msgb *msgb) -{ - return (msgb->head + msgb->data_len) - msgb->tail; -} /* increase the headroom of an empty msgb, reducing the tailroom */ static inline void msgb_reserve(struct msgb *msg, int len) -- cgit v1.2.3