Hey Sasha,

If the call to osm_console_init() fails (most typically b/c bind fails
b/c the port is already used), we can fall through into osm_console()
and segfault b/c a bunch of stuff isn't initialized properly.  Can be
handled multiple ways.  The patch below makes osm_console_init() return
a non-void so we can recognize if an error occurred.

Al

-- 
Albert Chu
[EMAIL PROTECTED]
925-422-5311
Computer Scientist
High Performance Systems Division
Lawrence Livermore National Laboratory
>From 090bd3ebe88febcb59d97d50915189cc5805f948 Mon Sep 17 00:00:00 2001
From: Albert Chu <[EMAIL PROTECTED]>
Date: Wed, 3 Sep 2008 10:30:40 -0700
Subject: [PATCH] fix segfault corner case when osm_console_init fails


Signed-off-by: Albert Chu <[EMAIL PROTECTED]>
---
 opensm/include/opensm/osm_console_io.h |    2 +-
 opensm/opensm/main.c                   |   10 +++++++---
 opensm/opensm/osm_console_io.c         |   10 ++++++----
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/opensm/include/opensm/osm_console_io.h b/opensm/include/opensm/osm_console_io.h
index cf9019f..5fe233d 100644
--- a/opensm/include/opensm/osm_console_io.h
+++ b/opensm/include/opensm/osm_console_io.h
@@ -77,7 +77,7 @@ typedef struct osm_console {
 } osm_console_t;
 
 void osm_console_prompt(FILE * out);
-void osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p_log);
+int osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p_log);
 void osm_console_exit(osm_console_t * p_oct, osm_log_t * p_log);
 int is_console_enabled(osm_subn_opt_t *p_opt);
 
diff --git a/opensm/opensm/main.c b/opensm/opensm/main.c
index e32f539..146ce02 100644
--- a/opensm/opensm/main.c
+++ b/opensm/opensm/main.c
@@ -496,14 +496,18 @@ static int daemonize(osm_opensm_t * osm)
  **********************************************************************/
 int osm_manager_loop(osm_subn_opt_t * p_opt, osm_opensm_t * p_osm)
 {
-	if (is_console_enabled(p_opt))
-		osm_console_init(p_opt, &p_osm->console, &p_osm->log);
+	int console_init = 1;
+
+	if (is_console_enabled(p_opt)) {
+		if (osm_console_init(p_opt, &p_osm->console, &p_osm->log) < 0)
+			console_init = 0;
+	}
 
 	/*
 	   Sit here forever - dwell or do console i/o & cmds
 	 */
 	while (!osm_exit_flag) {
-		if (is_console_enabled(p_opt))
+		if (console_init && is_console_enabled(p_opt))
 			osm_console(p_osm);
 		else
 			cl_thread_suspend(10000);
diff --git a/opensm/opensm/osm_console_io.c b/opensm/opensm/osm_console_io.c
index b46ab7b..2822737 100644
--- a/opensm/opensm/osm_console_io.c
+++ b/opensm/opensm/osm_console_io.c
@@ -144,7 +144,7 @@ void osm_console_prompt(FILE * out)
 	}
 }
 
-void osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p_log)
+int osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p_log)
 {
 	p_oct->socket = -1;
 	strncpy(p_oct->client_type, opt->console, sizeof(p_oct->client_type));
@@ -167,7 +167,7 @@ void osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p
 			OSM_LOG(p_log, OSM_LOG_ERROR,
 				"ERR 4B01: Failed to open console socket: %s\n",
 				strerror(errno));
-			return;
+			return -1;
 		}
 		setsockopt(p_oct->socket, SOL_SOCKET, SO_REUSEADDR,
 			   &optval, sizeof(optval));
@@ -181,13 +181,13 @@ void osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p
 			OSM_LOG(p_log, OSM_LOG_ERROR,
 				"ERR 4B02: Failed to bind console socket: %s\n",
 				strerror(errno));
-			return;
+			return -1;
 		}
 		if (listen(p_oct->socket, 1) < 0) {
 			OSM_LOG(p_log, OSM_LOG_ERROR,
 				"ERR 4B03: Failed to listen on socket: %s\n",
 				strerror(errno));
-			return;
+			return -1;
 		}
 
 		signal(SIGPIPE, SIG_IGN);	/* protect ourselves from closed pipes */
@@ -199,6 +199,8 @@ void osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p
 			"Console listening on port %d\n", opt->console_port);
 #endif
 	}
+
+	return 0;
 }
 
 /* clean up and release resources */
-- 
1.5.4.5

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to