Skip to content

Commit

Permalink
ETHER: Fix fault when parsing bad NAT: parameters adding better error…
Browse files Browse the repository at this point in the history
… reporting
  • Loading branch information
markpizz committed Sep 6, 2019
1 parent 7398e63 commit 108291b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 15 deletions.
6 changes: 3 additions & 3 deletions sim_ether.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down
22 changes: 11 additions & 11 deletions slirp_glue/sim_slirp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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) {
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion slirp_glue/sim_slirp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 108291b

Please sign in to comment.