Skip to content

Commit 4ce0b68

Browse files
committed
Fix: sbd-md: properly free one-time-allocations of sector-buffers
1 parent f4ca41f commit 4ce0b68

1 file changed

Lines changed: 27 additions & 11 deletions

File tree

src/sbd-md.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)