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