Fix possible nil pointer deref in interface check

This change address a potential nil pointer dereference when
building a list of interface names that might be used for
connection listening.

Issue-ID: RIC-307

Signed-off-by: E. Scott Daniels <daniels@research.att.com>
Change-Id: I3b63bebe31afc61073bd4d4093f1fb42d018963e
diff --git a/CHANGES_CORE.txt b/CHANGES_CORE.txt
index 4e382e8..a8b20b7 100644
--- a/CHANGES_CORE.txt
+++ b/CHANGES_CORE.txt
@@ -1,10 +1,14 @@
-# this file should contain ONLY the changes related to the 
+# this file should contain ONLY the changes related to the
 # core RMR code and doc.  Other change files exist for other
 # things.
 
 # API and build change  and fix summaries. Doc correctsions
 # and/or changes are not mentioned here; see the commit messages.
 
+2020 April 2; version 3.6.5
+	Correct potential nil pointer use when examining interfaces for
+	use as a listen target (RIC-307)
+
 2020 April 1; version 3.6.4
 	Correct potential nil pointer use in the NNG interface (RIC-303)
 	Correct issue preventing CI build without a container
@@ -13,7 +17,7 @@
 	Correct the max receive message size constant in rmr.h (RIC-301)
 
 2020 March 23; version 3.6.2
-	Fix message initialisation bug when pulling a message from 
+	Fix message initialisation bug when pulling a message from
 	the pool (RIC-295)
 
 2020 March 19; version 3.6.1
@@ -28,7 +32,7 @@
 
 2020 March 10; version 3.5.1
 	Add missing health check message types.
-	
+
 2020 March 9; version 3.5.0
 	Added new wormhole send function: rmr_wh_call().
 
@@ -73,7 +77,7 @@
 
 2020 January 31; verison 3.1.1
 	Allow route table thread logging to be completely disabled
-	when logging is turned off.	
+	when logging is turned off.
 
 2020 January 26; verison 3.1.0
 	First step to allowing the user programme to control messages
@@ -120,7 +124,7 @@
 
 2019 November 7; version 1.12.0
 	Version cut to support continued development for next release
-	preserving the 1.11.* versions for release 1 (Amber) and 
+	preserving the 1.11.* versions for release 1 (Amber) and
 	related fixes.
 
 2019 October 31; version 1.10.2
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 076448e..e2392c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,7 +40,7 @@
 
 set( major_version "3" )		# should be automatically populated from git tag later, but until CI process sets a tag we use this
 set( minor_version "6" )
-set( patch_level "4" )
+set( patch_level "5" )
 
 set( install_root "${CMAKE_INSTALL_PREFIX}" )
 set( install_inc "include/rmr" )
diff --git a/src/rmr/common/src/tools_static.c b/src/rmr/common/src/tools_static.c
index 2adf9a5..b4245cd 100644
--- a/src/rmr/common/src/tools_static.c
+++ b/src/rmr/common/src/tools_static.c
@@ -327,13 +327,15 @@
 		if( ele && strcmp( ele->ifa_name, "lo" ) &&									// do NOT capture the loopback interface address
 			(target_if == NULL || strcmp( ele->ifa_name, target_if ) == 0 ) ) {		// no target, or matches ENV_BIND_IF target
 
-			if( ele->ifa_addr->sa_family == AF_INET ) {
-				getnameinfo( ele->ifa_addr, sizeof( struct sockaddr_in ),  octs, NI_MAXHOST, NULL, 0, NI_NUMERICHOST );
-				fmt = "%s:%s";
-			} else {
-				if( ele->ifa_addr->sa_family == AF_INET6 ) {
-					getnameinfo( ele->ifa_addr, sizeof( struct sockaddr_in6 ),  octs, NI_MAXHOST, NULL, 0, NI_NUMERICHOST );
-					fmt = "[%s]:%s";
+			if( ele->ifa_addr != NULL ) {						// possible for some interfaces to not have an address
+				if( ele->ifa_addr->sa_family == AF_INET ) {
+					getnameinfo( ele->ifa_addr, sizeof( struct sockaddr_in ),  octs, NI_MAXHOST, NULL, 0, NI_NUMERICHOST );
+					fmt = "%s:%s";
+				} else {
+					if( ele->ifa_addr->sa_family == AF_INET6 ) {
+						getnameinfo( ele->ifa_addr, sizeof( struct sockaddr_in6 ),  octs, NI_MAXHOST, NULL, 0, NI_NUMERICHOST );
+						fmt = "[%s]:%s";
+					}
 				}
 			}
 
diff --git a/test/si95_test.c b/test/si95_test.c
index 399ff78..d5bcc3a 100644
--- a/test/si95_test.c
+++ b/test/si95_test.c
@@ -106,19 +106,19 @@
 
 	iptr = SInew( IOQ_BLK );
 	errors += fail_if_nil( iptr, "memory: sinew returned nil when given ioq request" );
-	iptr = SInew( IOQ_BLK );
 	SItrash(  IOQ_BLK, iptr );
 
 	ptr = SInew( TP_BLK );
 	errors += fail_if_nil( ptr, "memory: sinew returned nil when given tpblk request" );
 	if( ptr ) {
+		iptr = SInew( IOQ_BLK );
 		((struct tp_blk *)ptr)->squeue = iptr;
 		SItrash(  TP_BLK, ptr );
 	}
 	
 	ptr = SInew( GI_BLK );
 	errors += fail_if_nil( ptr, "memory: sinew returned nil when given giblk request" );
-	SItrash(  GI_BLK, ptr );
+	SItrash(  GI_BLK, ptr );		// GI block cannot be trashed, ensure this (valgind will complain about a leak)
 
 
 	return errors;