aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arp_table.c2
-rw-r--r--src/misc.c10
-rw-r--r--src/sbuf.c11
-rw-r--r--src/slirp.c5
-rw-r--r--src/socket.c4
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;
diff --git a/src/misc.c b/src/misc.c
index 6675acc..560d5f1 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -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],
diff --git a/src/sbuf.c b/src/sbuf.c
index abced48..0569c34 100644
--- a/src/sbuf.c
+++ b/src/sbuf.c
@@ -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);