summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2014-12-06 09:31:08 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2014-12-06 09:31:08 +0100
commite0fbaf3a2ec1defbf0b21a7f07217f7a508b51fa (patch)
tree1bbe1e08f7799d7a31826f5c3de93e68c2255dfa
parentc81701d1bf5f20932ba77b3b1e1893a51e182f73 (diff)
downloadbiruda-e0fbaf3a2ec1defbf0b21a7f07217f7a508b51fa.tar.gz
biruda-e0fbaf3a2ec1defbf0b21a7f07217f7a508b51fa.tar.bz2
fixed some segfaults in master when writing output from workers
-rw-r--r--src/master.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/master.c b/src/master.c
index 0c59db1..fafbbbe 100644
--- a/src/master.c
+++ b/src/master.c
@@ -317,6 +317,8 @@ static int master_output_init( const char *spool_dir, const char *name )
char filename[1024];
worker_t *worker = worker_by_name( name );
+ if( worker == NULL ) return 0;
+
snprintf( filename, sizeof( filename ), "%s%c%s.output",
spool_dir, PORT_DIR_SEPARATOR, worker->name );
@@ -329,6 +331,9 @@ static int master_output_init( const char *spool_dir, const char *name )
static int master_output_free( const char *name )
{
worker_t *worker = worker_by_name( name );
+
+ if( worker == NULL ) return 0;
+
execution_worker_data_t *wed = (execution_worker_data_t *)worker->execution_data;
if( wed->spool_file != NULL ) {
@@ -339,10 +344,18 @@ static int master_output_free( const char *name )
return 0;
}
-static int master_output_write( const char *name, const char *msg )
+static int master_output_write( const char *spool_dir, const char *name, const char *msg )
{
- worker_t *worker = worker_by_name( name );
- execution_worker_data_t *wed = (execution_worker_data_t *)worker->execution_data;
+ worker_t *w = worker_by_name( name );
+
+ if( w == NULL ) return 0;
+
+ execution_worker_data_t *wed = (execution_worker_data_t *)w->execution_data;
+
+ if( wed->spool_file == NULL ) {
+ master_output_init( spool_dir, name );
+ if( wed->spool_file == NULL ) return 0;
+ }
fputs( msg, wed->spool_file );
fflush( wed->spool_file );
@@ -471,7 +484,7 @@ NEXT_COMMAND:
json_object *msg_obj;
json_object_object_get_ex( recv_obj, "msg", &msg_obj );
const char *msg = json_object_get_string( msg_obj );
- master_output_write( worker, msg );
+ master_output_write( tdata->spool_dir, worker, msg );
} else {
fprintf( stderr, "WARNING: master received unkown message: %s\n", answer );
}