summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-07-22 21:55:24 +0200
committerHarald Welte <laforge@gnumonks.org>2010-07-22 21:56:10 +0200
commit652a72385ca37ff44d372f70f1251dd239bd7ee3 (patch)
treea303c4273388d9366804650ceb4331684faa6fd7
parent0d60aa2ad78948a75d7a35f5849450346c861643 (diff)
msgb: Check for available headroom/tailroom and abort() if we violate it
-rw-r--r--include/osmocore/msgb.h35
1 files changed, 31 insertions, 4 deletions
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 <stdint.h>
#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 <stdio.h>
+#include <stdlib.h>
+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)