Skip to content

Commit 89dab46

Browse files
committed
libsepol: free memory when realloc() fails
In get_class_info(), if realloc(class_buf, new_class_buf_len) fails to grow the memory, the function returns NULL without freeing class_buf. This leads to a memory leak which is reported by clang's static analyzer: https://580-118970575-gh.circle-artifacts.com/0/output-scan-build/2020-11-11-194150-6152-1/report-42a899.html#EndPath Fix the memory leak by calling free(class_buf). While at it, use size_t insted of int to store the size of the buffer which is growing. Signed-off-by: Nicolas Iooss <[email protected]>
1 parent e081620 commit 89dab46

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

libsepol/src/services.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -312,33 +312,36 @@ static char *get_class_info(sepol_security_class_t tclass,
312312
else
313313
state_num = mls + 2;
314314

315-
int class_buf_len = 0;
316-
int new_class_buf_len;
317-
int len, buf_used;
315+
size_t class_buf_len = 0;
316+
size_t new_class_buf_len;
317+
size_t buf_used;
318+
int len;
318319
char *class_buf = NULL, *p;
319320
char *new_class_buf = NULL;
320321

321322
while (1) {
322323
new_class_buf_len = class_buf_len + EXPR_BUF_SIZE;
323324
new_class_buf = realloc(class_buf, new_class_buf_len);
324-
if (!new_class_buf)
325-
return NULL;
325+
if (!new_class_buf) {
326+
free(class_buf);
327+
return NULL;
328+
}
326329
class_buf_len = new_class_buf_len;
327330
class_buf = new_class_buf;
328331
buf_used = 0;
329332
p = class_buf;
330333

331334
/* Add statement type */
332335
len = snprintf(p, class_buf_len - buf_used, "%s", statements[state_num]);
333-
if (len < 0 || len >= class_buf_len - buf_used)
336+
if (len < 0 || (size_t)len >= class_buf_len - buf_used)
334337
continue;
335338

336339
/* Add class entry */
337340
p += len;
338341
buf_used += len;
339342
len = snprintf(p, class_buf_len - buf_used, "%s ",
340343
policydb->p_class_val_to_name[tclass - 1]);
341-
if (len < 0 || len >= class_buf_len - buf_used)
344+
if (len < 0 || (size_t)len >= class_buf_len - buf_used)
342345
continue;
343346

344347
/* Add permission entries (validatetrans does not have perms) */
@@ -351,7 +354,7 @@ static char *get_class_info(sepol_security_class_t tclass,
351354
} else {
352355
len = snprintf(p, class_buf_len - buf_used, "(");
353356
}
354-
if (len < 0 || len >= class_buf_len - buf_used)
357+
if (len < 0 || (size_t)len >= class_buf_len - buf_used)
355358
continue;
356359
break;
357360
}

0 commit comments

Comments
 (0)