From 108291b3d4d032bc8c8464088d7964461aff19c0 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 5 Sep 2019 17:40:16 -0700 Subject: [PATCH] ETHER: Fix fault when parsing bad NAT: parameters adding better error reporting --- sim_ether.c | 6 +++--- slirp_glue/sim_slirp.c | 22 +++++++++++----------- slirp_glue/sim_slirp.h | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/sim_ether.c b/sim_ether.c index 8e63ae61..f242e909 100644 --- a/sim_ether.c +++ b/sim_ether.c @@ -1572,10 +1572,10 @@ static void eth_get_nic_hw_addr(ETH_DEV* dev, const char *devname) memset(command, 0, sizeof(command)); /* try to force an otherwise unused interface to be turned on */ - snprintf(command, sizeof(command)-1, "ifconfig %s up", devname); + snprintf(command, sizeof(command)-1, "ifconfig %.*s up", (int)(sizeof(command) - 14), devname); (void)system(command); for (i=0; patterns[i] && (0 == dev->have_host_nic_phy_addr); ++i) { - snprintf(command, sizeof(command)-1, "ifconfig %s | %s >NIC.hwaddr", devname, patterns[i]); + snprintf(command, sizeof(command)-1, "ifconfig %.*s | %s >NIC.hwaddr", (int)(sizeof(command) - (26 + strlen(patterns[i]))), devname, patterns[i]); (void)system(command); if (NULL != (f = fopen("NIC.hwaddr", "r"))) { while (0 == dev->have_host_nic_phy_addr) { @@ -2118,7 +2118,7 @@ else { /* !tap: */ while (isspace(*devname)) ++devname; - if (!(*handle = (void*) sim_slirp_open(devname, opaque, &_slirp_callback, dptr, dbit))) + if (!(*handle = (void*) sim_slirp_open(devname, opaque, &_slirp_callback, dptr, dbit, errbuf, PCAP_ERRBUF_SIZE))) strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); else { *eth_api = ETH_API_NAT; diff --git a/slirp_glue/sim_slirp.c b/slirp_glue/sim_slirp.c index b63af46f..fe83f70b 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 00493ff3..0411e3fc 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);