diff options
-rw-r--r-- | src/arp_table.c | 2 | ||||
-rw-r--r-- | src/misc.c | 10 | ||||
-rw-r--r-- | src/sbuf.c | 11 | ||||
-rw-r--r-- | src/slirp.c | 5 | ||||
-rw-r--r-- | src/socket.c | 4 |
5 files changed, 19 insertions, 13 deletions
diff --git a/src/arp_table.c b/src/arp_table.c index 022a52e..054fbf5 100644 --- a/src/arp_table.c +++ b/src/arp_table.c @@ -71,7 +71,7 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr, DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){ .s_addr = ip_addr })); /* If broadcast address */ - if (ip_addr == 0xffffffff || ip_addr == broadcast_addr) { + if (ip_addr == 0 || ip_addr == 0xffffffff || ip_addr == broadcast_addr) { /* return Ethernet broadcast address */ memset(out_ethaddr, 0xff, ETH_ALEN); return 1; @@ -168,7 +168,8 @@ g_spawn_async_with_fds_slirp(const gchar *working_directory, gchar **argv, int fork_exec(struct socket *so, const char *ex) { GError *err = NULL; - char **argv; + gint argc = 0; + gchar **argv = NULL; int opt, sp[2]; DEBUG_CALL("fork_exec"); @@ -179,7 +180,12 @@ int fork_exec(struct socket *so, const char *ex) return 0; } - argv = g_strsplit(ex, " ", -1); + if (!g_shell_parse_argv(ex, &argc, &argv, &err)) { + g_critical("fork_exec invalid command: %s\nerror: %s", ex, err->message); + g_error_free(err); + return 0; + } + g_spawn_async_with_fds(NULL /* cwd */, argv, NULL /* env */, G_SPAWN_SEARCH_PATH, fork_exec_child_setup, NULL /* data */, NULL /* child_pid */, sp[1], sp[1], @@ -39,13 +39,16 @@ void sbreserve(struct sbuf *sb, int size) if (sb->sb_data) { /* Already alloced, realloc if necessary */ if (sb->sb_datalen != size) { - sb->sb_wptr = sb->sb_rptr = sb->sb_data = - (char *)realloc(sb->sb_data, size); + char *new = realloc(sb->sb_data, size); sb->sb_cc = 0; - if (sb->sb_wptr) + if (new) { + sb->sb_data = sb->sb_wptr = sb->sb_rptr = new; sb->sb_datalen = size; - else + } else { + free(sb->sb_data); + sb->sb_data = sb->sb_wptr = sb->sb_rptr = NULL; sb->sb_datalen = 0; + } } } else { sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)malloc(size); diff --git a/src/slirp.c b/src/slirp.c index 911a7a6..22ca7d3 100644 --- a/src/slirp.c +++ b/src/slirp.c @@ -845,11 +845,6 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct ethhdr *eh, { const struct ip *iph = (const struct ip *)ifm->m_data; - if (iph->ip_dst.s_addr == 0) { - /* 0.0.0.0 can not be a destination address, something went wrong, - * avoid making it worse */ - return 1; - } if (!arp_table_search(slirp, iph->ip_dst.s_addr, ethaddr)) { uint8_t arp_req[ETH_HLEN + sizeof(struct slirp_arphdr)]; struct ethhdr *reh = (struct ethhdr *)arp_req; diff --git a/src/socket.c b/src/socket.c index f9ef0d5..bc6ee47 100644 --- a/src/socket.c +++ b/src/socket.c @@ -195,7 +195,9 @@ int soread(struct socket *so) err = errno; if (nn == 0) { - if (getpeername(so->s, paddr, &alen) < 0) { + int shutdown_wr = so->so_state & SS_FCANTSENDMORE; + + if (!shutdown_wr && getpeername(so->s, paddr, &alen) < 0) { err = errno; } else { getsockopt(so->s, SOL_SOCKET, SO_ERROR, &err, &elen); |