@@ -333,11 +333,13 @@ header_get(struct sbd_context *st)
333333
334334 if (header_read (st , s_header ) < 0 ) {
335335 cl_log (LOG_ERR , "Unable to read header from device %d" , st -> devfd );
336+ free (s_header );
336337 return NULL ;
337338 }
338339
339340 if (valid_header (s_header ) < 0 ) {
340341 cl_log (LOG_ERR , "header on device %d is not valid." , st -> devfd );
342+ free (s_header );
341343 return NULL ;
342344 }
343345
@@ -375,6 +377,8 @@ header_dump(struct sbd_context *st)
375377 (unsigned long )s_header -> timeout_loop );
376378 printf ("Timeout (msgwait) : %lu\n" ,
377379 (unsigned long )s_header -> timeout_msgwait );
380+
381+ free (s_header );
378382 return 0 ;
379383}
380384
@@ -927,6 +931,7 @@ get_first_msgwait(struct servants_list_item *servants)
927931 if (s_header != NULL ) {
928932 msgwait = (unsigned long )s_header -> timeout_msgwait ;
929933 close_device (st );
934+ free (s_header );
930935 return msgwait ;
931936 }
932937
@@ -1092,13 +1097,15 @@ int servant_md(const char *diskname, int mode, const void* argp)
10921097 s_header = header_get (st );
10931098 if (!s_header ) {
10941099 cl_log (LOG_ERR , "Not a valid header on %s" , diskname );
1095- exit (EXIT_MD_SERVANT_IO_FAIL );
1100+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1101+ goto out ;
10961102 }
10971103
10981104 if (servant_check_timeout_inconsistent (s_header ) < 0 ) {
10991105 cl_log (LOG_ERR , "Timeouts on %s do not match first device" ,
11001106 diskname );
1101- exit (EXIT_MD_SERVANT_IO_FAIL );
1107+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1108+ goto out ;
11021109 }
11031110
11041111 if (s_header -> minor_version > 0 ) {
@@ -1118,7 +1125,8 @@ int servant_md(const char *diskname, int mode, const void* argp)
11181125 if (slot_read (st , mbox , s_node ) < 0 ) {
11191126 cl_log (LOG_ERR , "Unable to read node entry on %s" ,
11201127 diskname );
1121- exit (EXIT_MD_SERVANT_IO_FAIL );
1128+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1129+ goto out ;
11221130 }
11231131
11241132 cl_log (LOG_NOTICE , "Monitoring slot %d on disk %s" , mbox , diskname );
@@ -1179,28 +1187,33 @@ int servant_md(const char *diskname, int mode, const void* argp)
11791187 s_header_retry = header_get (st );
11801188 if (!s_header_retry ) {
11811189 cl_log (LOG_ERR , "No longer found a valid header on %s" , diskname );
1182- exit (EXIT_MD_SERVANT_IO_FAIL );
1190+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1191+ goto out ;
11831192 }
11841193 if (memcmp (s_header , s_header_retry , sizeof (* s_header )) != 0 ) {
11851194 cl_log (LOG_ERR , "Header on %s changed since start-up!" , diskname );
1186- exit (EXIT_MD_SERVANT_IO_FAIL );
1195+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1196+ goto out ;
11871197 }
11881198 free (s_header_retry );
11891199
11901200 s_node_retry = sector_alloc ();
11911201 if (slot_read (st , mbox , s_node_retry ) < 0 ) {
11921202 cl_log (LOG_ERR , "slot read failed in servant." );
1193- exit (EXIT_MD_SERVANT_IO_FAIL );
1203+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1204+ goto out ;
11941205 }
11951206 if (memcmp (s_node , s_node_retry , sizeof (* s_node )) != 0 ) {
11961207 cl_log (LOG_ERR , "Node entry on %s changed since start-up!" , diskname );
1197- exit (EXIT_MD_SERVANT_IO_FAIL );
1208+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1209+ goto out ;
11981210 }
11991211 free (s_node_retry );
12001212
12011213 if (mbox_read (st , mbox , s_mbox ) < 0 ) {
12021214 cl_log (LOG_ERR , "mbox read failed in servant." );
1203- exit (EXIT_MD_SERVANT_IO_FAIL );
1215+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1216+ goto out ;
12041217 }
12051218
12061219 if (s_mbox -> cmd > 0 ) {
@@ -1215,14 +1228,17 @@ int servant_md(const char *diskname, int mode, const void* argp)
12151228 sigqueue (ppid , SIG_TEST , signal_value );
12161229 break ;
12171230 case SBD_MSG_RESET :
1218- exit (EXIT_MD_SERVANT_REQUEST_RESET );
1231+ rc = EXIT_MD_SERVANT_REQUEST_RESET ;
1232+ goto out ;
12191233 case SBD_MSG_OFF :
1220- exit (EXIT_MD_SERVANT_REQUEST_SHUTOFF );
1234+ rc = EXIT_MD_SERVANT_REQUEST_SHUTOFF ;
1235+ goto out ;
12211236 case SBD_MSG_EXIT :
12221237 sigqueue (ppid , SIG_EXITREQ , signal_value );
12231238 break ;
12241239 case SBD_MSG_CRASHDUMP :
1225- exit (EXIT_MD_SERVANT_REQUEST_CRASHDUMP );
1240+ rc = EXIT_MD_SERVANT_REQUEST_CRASHDUMP ;
1241+ goto out ;
12261242 default :
12271243 /* FIXME:
12281244 An "unknown" message might result
@@ -1251,6 +1267,8 @@ int servant_md(const char *diskname, int mode, const void* argp)
12511267 }
12521268 }
12531269 out :
1270+ free (s_header );
1271+ free (s_node );
12541272 free (s_mbox );
12551273 close_device (st );
12561274 exit (rc );
0 commit comments