[PATCH] lib/fwts_uefi.c: fix time-of-use race on open/stat (LP: #1209251)
Colin King
colin.king at canonical.com
Wed Aug 7 14:12:11 UTC 2013
From: Colin Ian King <colin.king at canonical.com>
Coverity Scan reports that the stat/open may give a small window
of opportunity for a stat/open race condition. Instead, do open
and fstat.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/lib/src/fwts_uefi.c | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/lib/src/fwts_uefi.c b/src/lib/src/fwts_uefi.c
index 55308ba..f3576f2 100644
--- a/src/lib/src/fwts_uefi.c
+++ b/src/lib/src/fwts_uefi.c
@@ -270,33 +270,35 @@ static int fwts_uefi_get_variable_efivars_fs(const char *varname, fwts_uefi_var
snprintf(filename, sizeof(filename), "%s/%s", path, varname);
- if (stat(filename, &statbuf) < 0)
+ if ((fd = open(filename, O_RDONLY)) < 0)
+ return FWTS_ERROR;
+
+ if (fstat(fd, &statbuf) < 0) {
+ close(fd);
return FWTS_ERROR;
+ }
/* Variable name, less the GUID, in 16 bit ints */
var->varname = calloc(1, (varname_len + 1 - 36) * sizeof(uint16_t));
- if (var->varname == NULL)
+ if (var->varname == NULL) {
+ close(fd);
return FWTS_ERROR;
+ }
/* Convert name to internal 16 bit version */
fwts_uefi_str_to_str16(var->varname, varname_len - 36, varname);
/* Need to read the data in one read, so allocate a buffer big enough */
if ((efivars_fs_var = calloc(1, statbuf.st_size)) == NULL) {
+ close(fd);
free(var->varname);
return FWTS_ERROR;
}
- if ((fd = open(filename, O_RDONLY)) < 0) {
- free(var->varname);
- free(efivars_fs_var);
- return FWTS_ERROR;
- }
-
if (read(fd, efivars_fs_var, statbuf.st_size) != statbuf.st_size) {
+ close(fd);
free(var->varname);
free(efivars_fs_var);
- close(fd);
return FWTS_ERROR;
}
close(fd);
--
1.8.3.2
More information about the fwts-devel
mailing list