Skip to content

Commit bdd28f9

Browse files
committed
Fix: sbd-md: properly free one-time-allocations of sector-buffers
1 parent 53277ef commit bdd28f9

1 file changed

Lines changed: 29 additions & 11 deletions

File tree

src/sbd-md.c

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

Comments
 (0)