ETHER: Fix fault when parsing bad NAT: parameters adding better error reporting

This commit is contained in:
Mark Pizzolato 2019-09-05 17:40:16 -07:00
parent 7398e63b00
commit 108291b3d4
3 changed files with 15 additions and 15 deletions

View file

@ -1572,10 +1572,10 @@ static void eth_get_nic_hw_addr(ETH_DEV* dev, const char *devname)
memset(command, 0, sizeof(command)); memset(command, 0, sizeof(command));
/* try to force an otherwise unused interface to be turned on */ /* 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); (void)system(command);
for (i=0; patterns[i] && (0 == dev->have_host_nic_phy_addr); ++i) { 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); (void)system(command);
if (NULL != (f = fopen("NIC.hwaddr", "r"))) { if (NULL != (f = fopen("NIC.hwaddr", "r"))) {
while (0 == dev->have_host_nic_phy_addr) { while (0 == dev->have_host_nic_phy_addr) {
@ -2118,7 +2118,7 @@ else { /* !tap: */
while (isspace(*devname)) while (isspace(*devname))
++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); strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
else { else {
*eth_api = ETH_API_NAT; *eth_api = ETH_API_NAT;

View file

@ -172,7 +172,7 @@ uint32 slirp_dbit;
} }
#endif #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)); SLIRP *slirp = (SLIRP *)g_malloc0(sizeof(*slirp));
char *targs = g_strdup (args); char *targs = g_strdup (args);
@ -191,6 +191,7 @@ slirp->maskbits = 24;
slirp->dhcpmgmt = 1; slirp->dhcpmgmt = 1;
slirp->db_chime = INVALID_SOCKET; slirp->db_chime = INVALID_SOCKET;
inet_aton(DEFAULT_IP_ADDR,&slirp->vgateway); inet_aton(DEFAULT_IP_ADDR,&slirp->vgateway);
pthread_mutex_init (&slirp->write_buffer_lock, NULL);
err = 0; err = 0;
while (*tptr && !err) { while (*tptr && !err) {
@ -209,7 +210,7 @@ while (*tptr && !err) {
if (cptr && *cptr) if (cptr && *cptr)
slirp->tftp_path = g_strdup (cptr); slirp->tftp_path = g_strdup (cptr);
else { else {
sim_printf ("Missing TFTP Path\n"); strlcpy (errbuf, "Missing TFTP Path", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
@ -218,7 +219,7 @@ while (*tptr && !err) {
if (cptr && *cptr) if (cptr && *cptr)
slirp->boot_file = g_strdup (cptr); slirp->boot_file = g_strdup (cptr);
else { else {
sim_printf ("Missing DHCP Boot file name\n"); strlcpy (errbuf, "Missing DHCP Boot file name", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
@ -228,7 +229,7 @@ while (*tptr && !err) {
if (cptr && *cptr) if (cptr && *cptr)
inet_aton (cptr, &slirp->vnameserver); inet_aton (cptr, &slirp->vnameserver);
else { else {
sim_printf ("Missing nameserver\n"); strlcpy (errbuf, "Missing nameserver", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
@ -253,7 +254,7 @@ while (*tptr && !err) {
} while (name && *name); } while (name && *name);
} }
else { else {
sim_printf ("Missing DNS search list\n"); strlcpy (errbuf, "Missing DNS search list", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
@ -266,7 +267,7 @@ while (*tptr && !err) {
inet_aton (abuf, &slirp->vgateway); inet_aton (abuf, &slirp->vgateway);
} }
else { else {
sim_printf ("Missing host\n"); strlcpy (errbuf, "Missing host", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
@ -279,7 +280,7 @@ while (*tptr && !err) {
inet_aton (abuf, &slirp->vnetwork); inet_aton (abuf, &slirp->vnetwork);
} }
else { else {
sim_printf ("Missing network\n"); strlcpy (errbuf, "Missing network", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
@ -292,7 +293,7 @@ while (*tptr && !err) {
if (cptr && *cptr) if (cptr && *cptr)
err = _parse_redirect_port (&slirp->rtcp, cptr, IS_UDP); err = _parse_redirect_port (&slirp->rtcp, cptr, IS_UDP);
else { else {
sim_printf ("Missing UDP port mapping\n"); strlcpy (errbuf, "Missing UDP port mapping", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
@ -301,12 +302,12 @@ while (*tptr && !err) {
if (cptr && *cptr) if (cptr && *cptr)
err = _parse_redirect_port (&slirp->rtcp, cptr, IS_TCP); err = _parse_redirect_port (&slirp->rtcp, cptr, IS_TCP);
else { else {
sim_printf ("Missing TCP port mapping\n"); strlcpy (errbuf, "Missing TCP port mapping", errbuf_size);
err = 1; err = 1;
} }
continue; continue;
} }
sim_printf ("Unexpected NAT argument: %s\n", gbuf); snprintf (errbuf, errbuf_size - 1, "Unexpected NAT argument: %s", gbuf);
err = 1; err = 1;
} }
if (err) { if (err) {
@ -337,7 +338,6 @@ else {
GPollFD pfd; GPollFD pfd;
int64_t rnd_val = qemu_clock_get_ns ((QEMUClockType)0) / 1000000; 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)); slirp->gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD));
/* setup transmit packet wakeup doorbell */ /* setup transmit packet wakeup doorbell */
do { do {

View file

@ -8,7 +8,7 @@ typedef struct sim_slirp SLIRP;
typedef void (*packet_callback)(void *opaque, const unsigned char *buf, int len); 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); void sim_slirp_close (SLIRP *slirp);
int sim_slirp_send (SLIRP *slirp, const char *msg, size_t len, int flags); int sim_slirp_send (SLIRP *slirp, const char *msg, size_t len, int flags);
int sim_slirp_select (SLIRP *slirp, int ms_timeout); int sim_slirp_select (SLIRP *slirp, int ms_timeout);