From a7e08e893eb796637ca2c53cd32a529f453ace12 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 14 Nov 2016 22:40:40 -0500 Subject: Check for readdir() errors everywhere. --- eval.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 1e88a93..80df040 100644 --- a/eval.c +++ b/eval.c @@ -498,14 +498,23 @@ bool eval_empty(const struct expr *expr, struct eval_state *state) { ret = true; - struct dirent *de; - while ((de = readdir(dir)) != NULL) { + while (true) { + struct dirent *de; + if (xreaddir(dir, &de) != 0) { + eval_error(state); + goto done_dir; + } + if (!de) { + break; + } + if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0) { ret = false; break; } } + done_dir: closedir(dir); } else { const struct stat *statbuf = fill_statbuf(state); @@ -1038,8 +1047,11 @@ static int infer_fdlimit(const struct cmdline *cmdline) { // Account for 'dir' itself nopen = -1; - struct dirent *de; - while ((de = readdir(dir)) != NULL) { + while (true) { + struct dirent *de; + if (xreaddir(dir, &de) != 0 || !de) { + break; + } if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0) { ++nopen; } -- cgit v1.2.3