51f42b
From 0b83636e914a894b324836e3fb2f20a2f7599fc4 Mon Sep 17 00:00:00 2001
51f42b
From: Jindrich Novy <jnovy@redhat.com>
51f42b
Date: Wed, 27 May 2020 11:01:02 +0200
51f42b
Subject: [PATCH] Fix possible infinite loops and use-after-free
51f42b
MIME-Version: 1.0
51f42b
Content-Type: text/plain; charset=UTF-8
51f42b
Content-Transfer-Encoding: 8bit
51f42b
51f42b
Error: USE_AFTER_FREE (CWE-416): [#def1]
51f42b
libslirp-4.3.0/src/ip_icmp.c:79: freed_arg: "icmp_detach" frees "slirp->icmp.so_next".
51f42b
libslirp-4.3.0/src/ip_icmp.c:79: deref_arg: Calling "icmp_detach" dereferences freed pointer "slirp->icmp.so_next".
51f42b
   77|   {
51f42b
   78|       while (slirp->icmp.so_next != &slirp->icmp) {
51f42b
   79|->         icmp_detach(slirp->icmp.so_next);
51f42b
   80|       }
51f42b
   81|   }
51f42b
51f42b
Error: USE_AFTER_FREE (CWE-416): [#def27]
51f42b
libslirp-4.3.0/src/udp.c:56: freed_arg: "udp_detach" frees "slirp->udb.so_next".
51f42b
libslirp-4.3.0/src/udp.c:56: deref_arg: Calling "udp_detach" dereferences freed pointer "slirp->udb.so_next".
51f42b
   54|   {
51f42b
   55|       while (slirp->udb.so_next != &slirp->udb) {
51f42b
   56|->         udp_detach(slirp->udb.so_next);
51f42b
   57|       }
51f42b
   58|   }
51f42b
51f42b
Signed-off-by: Jindrich Novy <jnovy@redhat.com>
51f42b
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
51f42b
---
51f42b
 src/ip_icmp.c | 7 +++++--
51f42b
 src/udp.c     | 5 ++++-
51f42b
 2 files changed, 9 insertions(+), 3 deletions(-)
51f42b
51f42b
diff --git a/src/ip_icmp.c b/src/ip_icmp.c
51f42b
index fe0add4..7533595 100644
51f42b
--- libslirp-4.3.0/src/ip_icmp.c
51f42b
+++ libslirp-4.3.0/src/ip_icmp.c
51f42b
@@ -75,8 +75,11 @@ void icmp_init(Slirp *slirp)
51f42b
 
51f42b
 void icmp_cleanup(Slirp *slirp)
51f42b
 {
51f42b
-    while (slirp->icmp.so_next != &slirp->icmp) {
51f42b
-        icmp_detach(slirp->icmp.so_next);
51f42b
+    struct socket *so, *so_next;
51f42b
+
51f42b
+    for (so = slirp->icmp.so_next; so != &slirp->icmp; so = so_next) {
51f42b
+        so_next = so->so_next;
51f42b
+        icmp_detach(so);
51f42b
     }
51f42b
 }
51f42b
 
51f42b
diff --git a/src/udp.c b/src/udp.c
51f42b
index 6bde20f..9ed1e74 100644
51f42b
--- libslirp-4.3.0/src/udp.c
51f42b
+++ libslirp-4.3.0/src/udp.c
51f42b
@@ -52,7 +52,10 @@ void udp_init(Slirp *slirp)
51f42b
 
51f42b
 void udp_cleanup(Slirp *slirp)
51f42b
 {
51f42b
-    while (slirp->udb.so_next != &slirp->udb) {
51f42b
+    struct socket *so, *so_next;
51f42b
+
51f42b
+    for (so = slirp->udb.so_next; so != &slirp->udb; so = so_next) {
51f42b
+        so_next = so->so_next;
51f42b
         udp_detach(slirp->udb.so_next);
51f42b
     }
51f42b
 }
51f42b
-- 
51f42b
2.26.2
51f42b
51f42b
From 2d79c0b7d78e55624790a102fbd924a4259eef16 Mon Sep 17 00:00:00 2001
51f42b
From: Jindrich Novy <jnovy@redhat.com>
51f42b
Date: Wed, 27 May 2020 11:07:19 +0200
51f42b
Subject: [PATCH] Use secure string copy to avoid overflow
51f42b
MIME-Version: 1.0
51f42b
Content-Type: text/plain; charset=UTF-8
51f42b
Content-Transfer-Encoding: 8bit
51f42b
51f42b
Error: STRING_OVERFLOW (CWE-120): [#def2]
51f42b
libslirp-4.3.0/src/ip_icmp.c:277: fixed_size_dest: You might overrun the 20-character fixed-size string "bufa" by copying the return value of "inet_ntoa" without checking the length.
51f42b
  275|       if (slirp_debug & DBG_MISC) {
51f42b
  276|           char bufa[20], bufb[20];
51f42b
  277|->         strcpy(bufa, inet_ntoa(ip->ip_src));
51f42b
  278|           strcpy(bufb, inet_ntoa(ip->ip_dst));
51f42b
  279|           DEBUG_MISC(" %.16s to %.16s", bufa, bufb);
51f42b
51f42b
Error: STRING_OVERFLOW (CWE-120): [#def3]
51f42b
libslirp-4.3.0/src/ip_icmp.c:278: fixed_size_dest: You might overrun the 20-character fixed-size string "bufb" by copying the return value of "inet_ntoa" without checking the length.
51f42b
  276|           char bufa[20], bufb[20];
51f42b
  277|           strcpy(bufa, inet_ntoa(ip->ip_src));
51f42b
  278|->         strcpy(bufb, inet_ntoa(ip->ip_dst));
51f42b
  279|           DEBUG_MISC(" %.16s to %.16s", bufa, bufb);
51f42b
  280|       }
51f42b
51f42b
Signed-off-by: Jindrich Novy <jnovy@redhat.com>
51f42b
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
51f42b
---
51f42b
 src/ip_icmp.c | 4 ++--
51f42b
 1 file changed, 2 insertions(+), 2 deletions(-)
51f42b
51f42b
diff --git a/src/ip_icmp.c b/src/ip_icmp.c
51f42b
index 7533595..13a0e55 100644
51f42b
--- libslirp-4.3.0/src/ip_icmp.c
51f42b
+++ libslirp-4.3.0/src/ip_icmp.c
51f42b
@@ -277,8 +277,8 @@ void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize,
51f42b
     ip = mtod(msrc, struct ip *);
51f42b
     if (slirp_debug & DBG_MISC) {
51f42b
         char bufa[20], bufb[20];
51f42b
-        strcpy(bufa, inet_ntoa(ip->ip_src));
51f42b
-        strcpy(bufb, inet_ntoa(ip->ip_dst));
51f42b
+        slirp_pstrcpy(bufa, sizeof(bufa), inet_ntoa(ip->ip_src));
51f42b
+        slirp_pstrcpy(bufb, sizeof(bufb), inet_ntoa(ip->ip_dst));
51f42b
         DEBUG_MISC(" %.16s to %.16s", bufa, bufb);
51f42b
     }
51f42b
     if (ip->ip_off & IP_OFFMASK)
51f42b
-- 
51f42b
2.26.2
51f42b
51f42b
From 961a676e93fe7d599d3856e63bd132fe0d2decb2 Mon Sep 17 00:00:00 2001
51f42b
From: Jindrich Novy <jnovy@redhat.com>
51f42b
Date: Wed, 27 May 2020 11:16:57 +0200
51f42b
Subject: [PATCH] Check lseek() for failure
51f42b
MIME-Version: 1.0
51f42b
Content-Type: text/plain; charset=UTF-8
51f42b
Content-Transfer-Encoding: 8bit
51f42b
51f42b
Error: CHECKED_RETURN (CWE-252): [#def26]
51f42b
libslirp-4.3.0/src/tftp.c:121: check_return: Calling "lseek(spt->fd, block_nr * spt->block_size, 0)" without checking return value. This library function may fail and return an error code.
51f42b
  119|
51f42b
  120|       if (len) {
51f42b
  121|->         lseek(spt->fd, block_nr * spt->block_size, SEEK_SET);
51f42b
  122|
51f42b
  123|           bytes_read = read(spt->fd, buf, len);
51f42b
51f42b
Signed-off-by: Jindrich Novy <jnovy@redhat.com>
51f42b
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
51f42b
---
51f42b
 src/tftp.c | 4 +++-
51f42b
 1 file changed, 3 insertions(+), 1 deletion(-)
51f42b
51f42b
diff --git a/src/tftp.c b/src/tftp.c
51f42b
index c209145..c6950ee 100644
51f42b
--- libslirp-4.3.0/src/tftp.c
51f42b
+++ libslirp-4.3.0/src/tftp.c
51f42b
@@ -118,7 +118,9 @@ static int tftp_read_data(struct tftp_session *spt, uint32_t block_nr,
51f42b
     }
51f42b
 
51f42b
     if (len) {
51f42b
-        lseek(spt->fd, block_nr * spt->block_size, SEEK_SET);
51f42b
+        if (lseek(spt->fd, block_nr * spt->block_size, SEEK_SET) == (off_t)-1) {
51f42b
+            return -1;
51f42b
+        }
51f42b
 
51f42b
         bytes_read = read(spt->fd, buf, len);
51f42b
     }
51f42b
-- 
51f42b
2.26.2
51f42b
51f42b
From b0fc01a6b8cf6a50a1af69845cca692cc42dd970 Mon Sep 17 00:00:00 2001
51f42b
From: Jindrich Novy <jnovy@redhat.com>
51f42b
Date: Wed, 27 May 2020 11:18:36 +0200
51f42b
Subject: [PATCH] Be sure to initialize sockaddr structure
51f42b
MIME-Version: 1.0
51f42b
Content-Type: text/plain; charset=UTF-8
51f42b
Content-Transfer-Encoding: 8bit
51f42b
51f42b
Error: UNINIT (CWE-457): [#def30]
51f42b
libslirp-4.3.0/src/udp.c:325: var_decl: Declaring variable "addr" without initializer.
51f42b
libslirp-4.3.0/src/udp.c:342: uninit_use_in_call: Using uninitialized value "addr". Field "addr.sin_zero" is uninitialized when calling "bind".
51f42b
51f42b
Signed-off-by: Jindrich Novy <jnovy@redhat.com>
51f42b
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
51f42b
---
51f42b
 src/udp.c | 1 +
51f42b
 1 file changed, 1 insertion(+)
51f42b
51f42b
diff --git a/src/udp.c b/src/udp.c
51f42b
index 9ed1e74..0ad44d7 100644
51f42b
--- libslirp-4.3.0/src/udp.c
51f42b
+++ libslirp-4.3.0/src/udp.c
51f42b
@@ -329,6 +329,7 @@ struct socket *udp_listen(Slirp *slirp, uint32_t haddr, unsigned hport,
51f42b
     struct socket *so;
51f42b
     socklen_t addrlen = sizeof(struct sockaddr_in);
51f42b
 
51f42b
+    memset(&addr, 0, sizeof(addr));
51f42b
     so = socreate(slirp);
51f42b
     so->s = slirp_socket(AF_INET, SOCK_DGRAM, 0);
51f42b
     if (so->s < 0) {
51f42b
-- 
51f42b
2.26.2
51f42b