File 1451-changes-to-fix-erlang-hung-issue-on-IPv6-setup.patch of Package erlang

From a0976e2287e52ecf86ee098d2f593762390493e3 Mon Sep 17 00:00:00 2001
From: peculiar-pooja <pooja.desai10@gmail.com>
Date: Thu, 14 Apr 2022 00:23:47 +0530
Subject: [PATCH 1/3] changes to fix erlang hung issue on IPv6 setup

Fixing problem in inet_drv.c where code is crashing due to infinite loop while searching interfaces
Also updated code to avoid use of uninitialised pointer and updated macro to set variable to NULL after free.
---
 erts/emulator/drivers/common/inet_drv.c | 39 +++++++++++++------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index cf3c5fa3f6..b6bd30481f 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -1558,12 +1558,14 @@ static void *realloc_wrapper(void *current, ErlDrvSizeT size){
     return ret;
 }
 #define REALLOC(X,Y) realloc_wrapper(X,Y)
-#define FREE(P) driver_free((P))
+#define FREE(P) { driver_free((P)); \
+    (P) = NULL;}
 #else /* FATAL_MALLOC */
 
 #define ALLOC(X) driver_alloc((X))
 #define REALLOC(X,Y) driver_realloc((X), (Y))
-#define FREE(P) driver_free((P))
+#define FREE(P) { driver_free((P)); \
+    (P) = NULL;}
 
 #endif /* FATAL_MALLOC */
 
@@ -5840,9 +5842,10 @@ static ErlDrvSSizeT inet_ctl_getifaddrs(inet_descriptor* desc_p,
 {
     int i;
     DWORD ret, n;
-    IP_INTERFACE_INFO *info_p;
-    MIB_IPADDRTABLE *ip_addrs_p;
-    IP_ADAPTER_ADDRESSES *ip_adaddrs_p, *ia_p;
+    IP_INTERFACE_INFO *info_p = NULL;
+    MIB_IPADDRTABLE *ip_addrs_p = NULL;
+    IP_ADAPTER_ADDRESSES *ip_adaddrs_p = NULL;
+    IP_ADAPTER_ADDRESSES *ia_p = NULL;
 
     char *buf_p;
     char *buf_alloc_p;
@@ -5901,10 +5904,10 @@ static ErlDrvSSizeT inet_ctl_getifaddrs(inet_descriptor* desc_p,
 		if (ret == NO_ERROR) break;
 		if (ret == ERROR_BUFFER_OVERFLOW) continue;
 		i = 0;
+		break;
 	    }
 	    if (! i) {
 		FREE(ip_adaddrs_p);
-		ip_adaddrs_p = NULL;
 	    }
 	} else ip_adaddrs_p = NULL;
     }
@@ -5921,11 +5924,9 @@ static ErlDrvSSizeT inet_ctl_getifaddrs(inet_descriptor* desc_p,
 	    if (ret == NO_ERROR) break;
 	    if (ret == ERROR_INSUFFICIENT_BUFFER) continue;
 	    i = 0;
+	    break;
 	}
-	if (! i) {
-	    FREE(info_p);
-	    info_p = NULL;
-	}
+	if (! i) FREE(info_p);
     }
 
     if (! ip_adaddrs_p) {
@@ -5940,6 +5941,7 @@ static ErlDrvSSizeT inet_ctl_getifaddrs(inet_descriptor* desc_p,
 	    if (ret == NO_ERROR) break;
 	    if (ret == ERROR_INSUFFICIENT_BUFFER) continue;
 	    i = 0;
+	    break;
 	}
 	if (! i) {
 	    if (info_p) FREE(info_p);
@@ -5982,13 +5984,14 @@ index:
 	} else {
 	    /* Then try IP_ADAPTER_INDEX_MAP.Name (only IPv4 adapters) */
 	    int j;
-	    for (j = 0;  j < info_p->NumAdapters;  j++) {
-		if (info_p->Adapter[j].Index == (ULONG) ifrow.dwIndex) {
-		    if (info_p->Adapter[j].Name[0] != 0) {
-			wname_p = info_p->Adapter[j].Name;
+	    if (info_p) {
+	        for (j = 0;  j < info_p->NumAdapters;  j++) {
+		    if (info_p->Adapter[j].Index == (ULONG) ifrow.dwIndex) {
+		        if (info_p->Adapter[j].Name[0] != 0) {
+			    wname_p = info_p->Adapter[j].Name;
+		        }
+		        break;
 		    }
-		    break;
-		}
 	    }
 	}
 	if (wname_p) {
@@ -13516,7 +13519,7 @@ subs_list *subs;
   this = subs->next;
   while(this) {
     next = this->next;
-    FREE((void *) this);
+    FREE(this);
     this = next;
   }
 
@@ -13547,7 +13550,7 @@ static void send_to_subscribers
 
     if(free_subs && !first) {
       next = this->next;
-      FREE((void *) this);
+      FREE(this);
       this = next;
     }
     else
-- 
2.35.3

openSUSE Build Service is sponsored by