@@ -364,6 +364,8 @@ header_dump(struct sbd_context *st)
364364 (unsigned long )s_header -> timeout_loop );
365365 printf ("Timeout (msgwait) : %lu\n" ,
366366 (unsigned long )s_header -> timeout_msgwait );
367+
368+ free (s_header );
367369 return 0 ;
368370}
369371
@@ -916,6 +918,7 @@ get_first_msgwait(struct servants_list_item *servants)
916918 if (s_header != NULL ) {
917919 msgwait = (unsigned long )s_header -> timeout_msgwait ;
918920 close_device (st );
921+ free (s_header );
919922 return msgwait ;
920923 }
921924
@@ -1081,13 +1084,15 @@ int servant_md(const char *diskname, int mode, const void* argp)
10811084 s_header = header_get (st );
10821085 if (!s_header ) {
10831086 cl_log (LOG_ERR , "Not a valid header on %s" , diskname );
1084- exit (EXIT_MD_SERVANT_IO_FAIL );
1087+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1088+ goto out ;
10851089 }
10861090
10871091 if (servant_check_timeout_inconsistent (s_header ) < 0 ) {
10881092 cl_log (LOG_ERR , "Timeouts on %s do not match first device" ,
10891093 diskname );
1090- exit (EXIT_MD_SERVANT_IO_FAIL );
1094+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1095+ goto out ;
10911096 }
10921097
10931098 if (s_header -> minor_version > 0 ) {
@@ -1107,7 +1112,8 @@ int servant_md(const char *diskname, int mode, const void* argp)
11071112 if (slot_read (st , mbox , s_node ) < 0 ) {
11081113 cl_log (LOG_ERR , "Unable to read node entry on %s" ,
11091114 diskname );
1110- exit (EXIT_MD_SERVANT_IO_FAIL );
1115+ rc = EXIT_MD_SERVANT_IO_FAIL );
1116+ goto out ;
11111117 }
11121118
11131119 cl_log (LOG_NOTICE , "Monitoring slot %d on disk %s" , mbox , diskname );
@@ -1168,28 +1174,33 @@ int servant_md(const char *diskname, int mode, const void* argp)
11681174 s_header_retry = header_get (st );
11691175 if (!s_header_retry ) {
11701176 cl_log (LOG_ERR , "No longer found a valid header on %s" , diskname );
1171- exit (EXIT_MD_SERVANT_IO_FAIL );
1177+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1178+ goto out ;
11721179 }
11731180 if (memcmp (s_header , s_header_retry , sizeof (* s_header )) != 0 ) {
11741181 cl_log (LOG_ERR , "Header on %s changed since start-up!" , diskname );
1175- exit (EXIT_MD_SERVANT_IO_FAIL );
1182+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1183+ goto out ;
11761184 }
11771185 free (s_header_retry );
11781186
11791187 s_node_retry = sector_alloc ();
11801188 if (slot_read (st , mbox , s_node_retry ) < 0 ) {
11811189 cl_log (LOG_ERR , "slot read failed in servant." );
1182- exit (EXIT_MD_SERVANT_IO_FAIL );
1190+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1191+ goto out ;
11831192 }
11841193 if (memcmp (s_node , s_node_retry , sizeof (* s_node )) != 0 ) {
11851194 cl_log (LOG_ERR , "Node entry 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_node_retry );
11891199
11901200 if (mbox_read (st , mbox , s_mbox ) < 0 ) {
11911201 cl_log (LOG_ERR , "mbox read failed in servant." );
1192- exit (EXIT_MD_SERVANT_IO_FAIL );
1202+ rc = EXIT_MD_SERVANT_IO_FAIL ;
1203+ goto out ;
11931204 }
11941205
11951206 if (s_mbox -> cmd > 0 ) {
@@ -1204,14 +1215,17 @@ int servant_md(const char *diskname, int mode, const void* argp)
12041215 sigqueue (ppid , SIG_TEST , signal_value );
12051216 break ;
12061217 case SBD_MSG_RESET :
1207- exit (EXIT_MD_SERVANT_REQUEST_RESET );
1218+ rc = EXIT_MD_SERVANT_REQUEST_RESET ;
1219+ goto out ;
12081220 case SBD_MSG_OFF :
1209- exit (EXIT_MD_SERVANT_REQUEST_SHUTOFF );
1221+ rc = EXIT_MD_SERVANT_REQUEST_SHUTOFF );
1222+ goto out ;
12101223 case SBD_MSG_EXIT :
12111224 sigqueue (ppid , SIG_EXITREQ , signal_value );
12121225 break ;
12131226 case SBD_MSG_CRASHDUMP :
1214- exit (EXIT_MD_SERVANT_REQUEST_CRASHDUMP );
1227+ rc = EXIT_MD_SERVANT_REQUEST_CRASHDUMP ;
1228+ goto out ;
12151229 default :
12161230 /* FIXME:
12171231 An "unknown" message might result
@@ -1240,6 +1254,8 @@ int servant_md(const char *diskname, int mode, const void* argp)
12401254 }
12411255 }
12421256 out :
1257+ free (s_header );
1258+ free (s_node );
12431259 free (s_mbox );
12441260 close_device (st );
12451261 exit (rc );
0 commit comments