chiark
/
gitweb
/
~ian
/
userv-utils.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
www-cgi/: Move `xrealloc' to `ucgicommon'.
[userv-utils.git]
/
ipif
/
service.c
diff --git
a/ipif/service.c
b/ipif/service.c
index 4c9b52463623a2a2437f6f5c0d318724f8f102af..b9e40e29fcdb3a2f26ccabf02122d49ab230d388 100644
(file)
--- a/
ipif/service.c
+++ b/
ipif/service.c
@@
-719,11
+719,13
@@
static void setnonblock(int fd) {
}
static void rx_packet(const uint8_t *packet, int len) {
}
static void rx_packet(const uint8_t *packet, int len) {
+ if (!len)
+ return;
for (;;) {
int r= write(tunfd, packet, len);
if (r<0) {
if (errno==EINTR) continue;
for (;;) {
int r= write(tunfd, packet, len);
if (r<0) {
if (errno==EINTR) continue;
- if (errno==EAGAIN) return; /* oh well */
+ if (errno==EAGAIN
|| errno==ENOMEM
) return; /* oh well */
sysfatal("error writing packet to tun (transmitting)");
}
assert(r==len);
sysfatal("error writing packet to tun (transmitting)");
}
assert(r==len);
@@
-861,7
+863,7
@@
static void copydata(void) {
r= read(0, input_buf + input_waiting, want);
if (r>0) {
input_waiting += r;
r= read(0, input_buf + input_waiting, want);
if (r>0) {
input_waiting += r;
- assert(
r <
sizeof(input_buf));
+ assert(
input_waiting <=
sizeof(input_buf));
more_rx_data(input_buf, rx_packet_buf);
} else if (r==0) {
terminate(0);
more_rx_data(input_buf, rx_packet_buf);
} else if (r==0) {
terminate(0);