From 6ef260fa4f7b3666dfd2b23807cc8d2aa9499fa3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 17 Oct 2020 14:11:09 -0300 Subject: [PATCH 1/4] SLiRP forward protocol should be compared using regular strcmp --- src/network/net_slirp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_slirp.c b/src/network/net_slirp.c index 1c743d674..02ae6556e 100644 --- a/src/network/net_slirp.c +++ b/src/network/net_slirp.c @@ -331,7 +331,7 @@ poll_thread(void *arg) char key[20]; while (1) { sprintf(key, "%d_protocol", i); - udp = strncmp(config_get_string(category, key, "tcp"), "udp", -1) == 0; + udp = strcmp(config_get_string(category, key, "tcp"), "udp") == 0; sprintf(key, "%d_external", i); external = config_get_int(category, key, 0); sprintf(key, "%d_internal", i); From a620168bd3896147b09dcbb7ade4d1f584ea4477 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 17 Oct 2020 17:44:57 -0300 Subject: [PATCH 2/4] Unpause network RX queue on PLIP timeout --- src/network/net_plip.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/net_plip.c b/src/network/net_plip.c index ca58b5824..25bf60bce 100644 --- a/src/network/net_plip.c +++ b/src/network/net_plip.c @@ -117,6 +117,8 @@ timeout_timer(void *priv) dev->rx_pkt = NULL; } + network_rx_pause = 0; + timer_disable(&dev->timeout_timer); } From 8ed105feafc192126d1e09342fbf2ccc11e896bc Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 17 Oct 2020 20:17:36 -0300 Subject: [PATCH 3/4] Fix VIA ISA bridge subsystem ID write --- src/chipset/via_pipc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index b175b7ff7..6233ac488 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -466,7 +466,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv) if (func == 0) { /* PCI-ISA bridge */ /* Read-only addresses */ if ((addr < 4) || (addr == 5) || ((addr >= 8) && (addr < 0x40)) || (addr == 0x49) || (addr == 0x4b) || - (addr == 0x53) || ((addr >= 0x5d) && (addr < 0x5f)) || ((addr >= 0x71) && (addr < 0x74)) || (addr >= 0x90)) + (addr == 0x53) || ((addr >= 0x5d) && (addr < 0x5f)) || (addr >= 0x90)) return; if ((dev->local <= VIA_PIPC_586A) && ((addr >= 0x58) && (addr < 0x80))) From 3e054a5c456dcc8e0e54480c4a69793d01432953 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 17 Oct 2020 20:28:30 -0300 Subject: [PATCH 4/4] Improve thread safety and add safeguards to the network packet dumping code --- src/network/network.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/network/network.c b/src/network/network.c index 1e7dfa308..fe3507e13 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -145,7 +145,8 @@ static struct { #ifdef ENABLE_NETWORK_LOG int network_do_log = ENABLE_NETWORK_LOG; -FILE *network_dump = NULL; +static FILE *network_dump = NULL; +static mutex_t *network_dump_mutex; static void @@ -175,9 +176,23 @@ network_dump_packet(netpkt_t *pkt) tv.tv_sec, tv.tv_usec, pkt->len, pkt->len }; - fwrite(&pcap_packet_hdr, sizeof(pcap_packet_hdr), 1, network_dump); - fwrite(pkt->data, pkt->len, 1, network_dump); - fflush(network_dump); + if (network_dump_mutex) + thread_wait_mutex(network_dump_mutex); + + size_t written; + if ((written = fwrite(&pcap_packet_hdr, 1, sizeof(pcap_packet_hdr), network_dump)) < sizeof(pcap_packet_hdr)) { + network_log("NETWORK: failed to write dump packet header\n"); + fseek(network_dump, -written, SEEK_CUR); + } else { + if ((written = fwrite(pkt->data, 1, pkt->len, network_dump)) < pkt->len) { + network_log("NETWORK: failed to write dump packet data\n"); + fseek(network_dump, -written - sizeof(pcap_packet_hdr), SEEK_CUR); + } + fflush(network_dump); + } + + if (network_dump_mutex) + thread_release_mutex(network_dump_mutex); } #else #define network_log(fmt, ...) @@ -452,6 +467,10 @@ network_close(void) thread_close_mutex(network_mutex); network_mutex = NULL; network_mac = NULL; +#ifdef ENABLE_NETWORK_LOG + thread_close_mutex(network_dump_mutex); + network_dump_mutex = NULL; +#endif /* Here is where we clear the queues. */ network_queue_clear(0); @@ -491,6 +510,9 @@ network_reset(void) if ((network_type==NET_TYPE_NONE) || (network_card==0)) return; network_mutex = thread_create_mutex(); +#ifdef ENABLE_NETWORK_LOG + network_dump_mutex = thread_create_mutex(); +#endif /* Initialize the platform module. */ switch(network_type) {