[PATCH 39/41] slip: Buffer management (max_start_pad) fixes
Ian Jackson
ijackson at chiark.greenend.org.uk
Thu Jul 25 18:41:05 BST 2013
Nothing in slip.c calls buffer_init for the first packet. We don't
normally notice this because userv-ipif _both_ prints a confirmation
END byte right away, _and_ bookends packets with ENDs.
But this should be fixed. Otherwise we fail an assertion when we try
to prepend things to the first data packet.
Signed-off-by: Ian Jackson <ijackson at chiark.greenend.org.uk>
---
netlink.c | 4 +++-
slip.c | 7 +++++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/netlink.c b/netlink.c
index 173d412..bc70757 100644
--- a/netlink.c
+++ b/netlink.c
@@ -603,11 +603,13 @@ static void netlink_incoming(struct netlink *st, struct netlink_client *client,
uint32_t source,dest;
struct iphdr *iph;
char errmsgbuf[50];
+ const char *sourcedesc=client?client->name:"host";
BUF_ASSERT_USED(buf);
+
if (!netlink_check(st,buf,errmsgbuf,sizeof(errmsgbuf))) {
Message(M_WARNING,"%s: bad IP packet from %s: %s\n",
- st->name,client?client->name:"host",
+ st->name,sourcedesc,
errmsgbuf);
BUF_FREE(buf);
return;
diff --git a/slip.c b/slip.c
index 5eb8dbd..9e63cb3 100644
--- a/slip.c
+++ b/slip.c
@@ -79,6 +79,9 @@ static void slip_unstuff(struct slip *st, uint8_t *buf, uint32_t l)
int outputchr;
enum { OUTPUT_END = 256, OUTPUT_NOTHING = 257 };
+ if (!st->buff->size)
+ buffer_init(st->buff,calculate_max_start_pad());
+
if (st->pending_esc) {
st->pending_esc=False;
switch(buf[i]) {
@@ -115,7 +118,7 @@ static void slip_unstuff(struct slip *st, uint8_t *buf, uint32_t l)
if (st->ignoring_packet) {
if (outputchr == OUTPUT_END) {
st->ignoring_packet=False;
- buffer_init(st->buff,calculate_max_start_pad());
+ st->buff->size=0;
}
} else {
if (outputchr == OUTPUT_END) {
@@ -123,7 +126,7 @@ static void slip_unstuff(struct slip *st, uint8_t *buf, uint32_t l)
st->netlink_to_tunnel(&st->nl,st->buff);
BUF_ALLOC(st->buff,"userv_afterpoll");
}
- buffer_init(st->buff,calculate_max_start_pad());
+ st->buff->size=0;
} else if (outputchr != OUTPUT_NOTHING) {
if (st->buff->size < st->buff->len) {
buf_append_uint8(st->buff,outputchr);
--
1.7.2.5
More information about the sgo-software-discuss
mailing list