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@chiark.greenend.org.uk>
uint32_t source,dest;
struct iphdr *iph;
char errmsgbuf[50];
uint32_t source,dest;
struct iphdr *iph;
char errmsgbuf[50];
+ const char *sourcedesc=client?client->name:"host";
if (!netlink_check(st,buf,errmsgbuf,sizeof(errmsgbuf))) {
Message(M_WARNING,"%s: bad IP packet from %s: %s\n",
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",
errmsgbuf);
BUF_FREE(buf);
return;
errmsgbuf);
BUF_FREE(buf);
return;
int outputchr;
enum { OUTPUT_END = 256, OUTPUT_NOTHING = 257 };
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]) {
if (st->pending_esc) {
st->pending_esc=False;
switch(buf[i]) {
if (st->ignoring_packet) {
if (outputchr == OUTPUT_END) {
st->ignoring_packet=False;
if (st->ignoring_packet) {
if (outputchr == OUTPUT_END) {
st->ignoring_packet=False;
- buffer_init(st->buff,calculate_max_start_pad());
}
} else {
if (outputchr == OUTPUT_END) {
}
} else {
if (outputchr == OUTPUT_END) {
st->netlink_to_tunnel(&st->nl,st->buff);
BUF_ALLOC(st->buff,"userv_afterpoll");
}
st->netlink_to_tunnel(&st->nl,st->buff);
BUF_ALLOC(st->buff,"userv_afterpoll");
}
- buffer_init(st->buff,calculate_max_start_pad());
} else if (outputchr != OUTPUT_NOTHING) {
if (st->buff->size < st->buff->len) {
buf_append_uint8(st->buff,outputchr);
} else if (outputchr != OUTPUT_NOTHING) {
if (st->buff->size < st->buff->len) {
buf_append_uint8(st->buff,outputchr);