From ef95be5a0bd72bcce9ec5b408678f4c0374b9c9d Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 25 Aug 2019 01:31:53 -0700 Subject: [PATCH] ETHER: Fix fault when parsing bad NAT: parameters adding better error reporting --- sim_ether.c | 4 +--- slirp_glue/sim_slirp.c | 22 +++++++++++----------- slirp_glue/sim_slirp.h | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/sim_ether.c b/sim_ether.c index cf5cf43..6754827 100644 --- a/sim_ether.c +++ b/sim_ether.c @@ -2118,9 +2118,7 @@ else { /* !tap: */ while (isspace(*devname)) ++devname; - if (!(*handle = (void*) sim_slirp_open(devname, opaque, &_slirp_callback, dptr, dbit))) - strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); - else { + if ((*handle = (void*) sim_slirp_open(devname, opaque, &_slirp_callback, dptr, dbit, errbuf, PCAP_ERRBUF_SIZE))) { *eth_api = ETH_API_NAT; *fd_handle = 0; } diff --git a/slirp_glue/sim_slirp.c b/slirp_glue/sim_slirp.c index 4257775..ff4b80d 100644 --- a/slirp_glue/sim_slirp.c +++ b/slirp_glue/sim_slirp.c @@ -172,7 +172,7 @@ uint32 slirp_dbit; } #endif -SLIRP *sim_slirp_open (const char *args, void *opaque, packet_callback callback, DEVICE *dptr, uint32 dbit) +SLIRP *sim_slirp_open (const char *args, void *opaque, packet_callback callback, DEVICE *dptr, uint32 dbit, char *errbuf, size_t errbuf_size) { SLIRP *slirp = (SLIRP *)g_malloc0(sizeof(*slirp)); char *targs = g_strdup (args); @@ -191,6 +191,7 @@ slirp->maskbits = 24; slirp->dhcpmgmt = 1; slirp->db_chime = INVALID_SOCKET; inet_aton(DEFAULT_IP_ADDR,&slirp->vgateway); +pthread_mutex_init (&slirp->write_buffer_lock, NULL); err = 0; while (*tptr && !err) { @@ -209,7 +210,7 @@ while (*tptr && !err) { if (cptr && *cptr) slirp->tftp_path = g_strdup (cptr); else { - sim_printf ("Missing TFTP Path\n"); + strlcpy (errbuf, "Missing TFTP Path", errbuf_size); err = 1; } continue; @@ -218,7 +219,7 @@ while (*tptr && !err) { if (cptr && *cptr) slirp->boot_file = g_strdup (cptr); else { - sim_printf ("Missing DHCP Boot file name\n"); + strlcpy (errbuf, "Missing DHCP Boot file name", errbuf_size); err = 1; } continue; @@ -228,7 +229,7 @@ while (*tptr && !err) { if (cptr && *cptr) inet_aton (cptr, &slirp->vnameserver); else { - sim_printf ("Missing nameserver\n"); + strlcpy (errbuf, "Missing nameserver", errbuf_size); err = 1; } continue; @@ -253,7 +254,7 @@ while (*tptr && !err) { } while (name && *name); } else { - sim_printf ("Missing DNS search list\n"); + strlcpy (errbuf, "Missing DNS search list", errbuf_size); err = 1; } continue; @@ -266,7 +267,7 @@ while (*tptr && !err) { inet_aton (abuf, &slirp->vgateway); } else { - sim_printf ("Missing host\n"); + strlcpy (errbuf, "Missing host", errbuf_size); err = 1; } continue; @@ -279,7 +280,7 @@ while (*tptr && !err) { inet_aton (abuf, &slirp->vnetwork); } else { - sim_printf ("Missing network\n"); + strlcpy (errbuf, "Missing network", errbuf_size); err = 1; } continue; @@ -292,7 +293,7 @@ while (*tptr && !err) { if (cptr && *cptr) err = _parse_redirect_port (&slirp->rtcp, cptr, IS_UDP); else { - sim_printf ("Missing UDP port mapping\n"); + strlcpy (errbuf, "Missing UDP port mapping", errbuf_size); err = 1; } continue; @@ -301,12 +302,12 @@ while (*tptr && !err) { if (cptr && *cptr) err = _parse_redirect_port (&slirp->rtcp, cptr, IS_TCP); else { - sim_printf ("Missing TCP port mapping\n"); + strlcpy (errbuf, "Missing TCP port mapping", errbuf_size); err = 1; } continue; } - sim_printf ("Unexpected NAT argument: %s\n", gbuf); + snprintf (errbuf, errbuf_size - 1, "Unexpected NAT argument: %s", gbuf); err = 1; } if (err) { @@ -337,7 +338,6 @@ else { GPollFD pfd; int64_t rnd_val = qemu_clock_get_ns ((QEMUClockType)0) / 1000000; - pthread_mutex_init (&slirp->write_buffer_lock, NULL); slirp->gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD)); /* setup transmit packet wakeup doorbell */ do { diff --git a/slirp_glue/sim_slirp.h b/slirp_glue/sim_slirp.h index 00493ff..0411e3f 100644 --- a/slirp_glue/sim_slirp.h +++ b/slirp_glue/sim_slirp.h @@ -8,7 +8,7 @@ typedef struct sim_slirp SLIRP; typedef void (*packet_callback)(void *opaque, const unsigned char *buf, int len); -SLIRP *sim_slirp_open (const char *args, void *opaque, packet_callback callback, DEVICE *dptr, uint32 dbit); +SLIRP *sim_slirp_open (const char *args, void *opaque, packet_callback callback, DEVICE *dptr, uint32 dbit, char *errbuf, size_t errbuf_size); void sim_slirp_close (SLIRP *slirp); int sim_slirp_send (SLIRP *slirp, const char *msg, size_t len, int flags); int sim_slirp_select (SLIRP *slirp, int ms_timeout);