bool_t ignoring_packet; /* If this packet was corrupt or overlong,
we ignore everything up to the next END */
netlink_deliver_fn *netlink_to_tunnel;
- uint32_t local_address;
};
/* Generic SLIP mangling code */
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->ignoring_packet) {
if (outputchr == OUTPUT_END) {
st->ignoring_packet=False;
- buffer_init(st->buff,st->nl.max_start_pad);
+ st->buff->size=0;
}
} else {
if (outputchr == OUTPUT_END) {
st->netlink_to_tunnel(&st->nl,st->buff);
BUF_ALLOC(st->buff,"userv_afterpoll");
}
- buffer_init(st->buff,st->nl.max_start_pad);
+ st->buff->size=0;
} else if (outputchr != OUTPUT_NOTHING) {
- if (st->buff->size < st->buff->len) {
+ if (buf_remaining_space(st->buff)) {
buf_append_uint8(st->buff,outputchr);
} else {
Message(M_WARNING, "userv_afterpoll: dropping overlong"
netlink_init(&st->nl,st,loc,dict,
"netlink-userv-ipif",NULL,to_host);
st->buff=find_cl_if(dict,"buffer",CL_BUFFER,True,"name",loc);
- st->local_address=string_item_to_ipaddr(
- dict_find_item(dict,"local-address", True, name, loc),"netlink");
BUF_ALLOC(st->buff,"slip_init");
st->pending_esc=False;
st->ignoring_packet=False;
{
struct userv *st=sst;
+ if (buf->size > st->slip.nl.mtu) {
+ Message(M_ERR,"%s: packet of size %"PRIu32" exceeds mtu %"PRIu32":"
+ " cannot be injected into kernel, dropped\n",
+ st->slip.nl.name, buf->size, st->slip.nl.mtu);
+ BUF_FREE(buf);
+ return;
+ }
+
slip_stuff(&st->slip,buf,st->txfd);
}
fatal("%s: userv exited unexpectedly: uncaught signal %d",
st->slip.nl.name,WTERMSIG(status));
} else {
- fatal("%s: userv stopped unexpectedly");
+ fatal("%s: userv stopped unexpectedly",
+ st->slip.nl.name);
}
}
Message(M_WARNING,"%s: userv subprocess died with status %d\n",
addrs=safe_malloc(512,"userv_invoke_userv:addrs");
snprintf(addrs,512,"%s,%s,%d,slip",
- ipaddr_to_string(st->slip.local_address),
+ ipaddr_to_string(st->slip.nl.local_address),
ipaddr_to_string(st->slip.nl.secnet_address),st->slip.nl.mtu);
allnets=ipset_new();