chiark
/
gitweb
/
~ian
/
secnet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
netlink: Break out sender_name
[secnet.git]
/
slip.c
diff --git
a/slip.c
b/slip.c
index a4529262bd1b913de9ec6d40d317cf3583d9d703..aed2551de70d2d695ec1ef99e04081923227dabf 100644
(file)
--- a/
slip.c
+++ b/
slip.c
@@
-7,6
+7,7
@@
#include "util.h"
#include "netlink.h"
#include "process.h"
#include "util.h"
#include "netlink.h"
#include "process.h"
+#include "unaligned.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@
-78,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 };
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]) {
@@
-114,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;
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) {
}
} else {
if (outputchr == OUTPUT_END) {
@@
-122,10
+126,10
@@
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");
}
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) {
} else if (outputchr != OUTPUT_NOTHING) {
if (st->buff->size < st->buff->len) {
-
*(uint8_t *)buf_append(st->buff,1)=outputchr
;
+
buf_append_uint8(st->buff,outputchr)
;
} else {
Message(M_WARNING, "userv_afterpoll: dropping overlong"
" SLIP packet\n");
} else {
Message(M_WARNING, "userv_afterpoll: dropping overlong"
" SLIP packet\n");
@@
-209,6
+213,14
@@
static void userv_deliver_to_kernel(void *sst, struct buffer_if *buf)
{
struct userv *st=sst;
{
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);
}
slip_stuff(&st->slip,buf,st->txfd);
}
@@
-229,7
+241,8
@@
static void userv_userv_callback(void *sst, pid_t pid, int status)
fatal("%s: userv exited unexpectedly: uncaught signal %d",
st->slip.nl.name,WTERMSIG(status));
} else {
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",
}
}
Message(M_WARNING,"%s: userv subprocess died with status %d\n",