tools: mkimage: Use fstat instead of stat to avoid malicious hacks
authorMichal Simek <michal.simek@xilinx.com>
Tue, 6 Dec 2016 16:17:01 +0000 (17:17 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 9 Dec 2016 13:40:23 +0000 (08:40 -0500)
The patch is fixing:
"tools: mkimage: Check if file is regular file"
(sha1: 56c7e8015509312240b1ee15f2ff74510939a45d)
which contains two issues reported by Coverity
Unchecked return value from stat and incorrect calling sequence where
attack can happen between calling stat and fopen.
Using pair in opposite order (fopen and fstat) is fixing this issue
because fstat is using the same file descriptor (FILE *).

Also fixing issue with:
"tools: mkimage: Add support for initialization table for Zynq and
ZynqMP" (sha1: 3b6460809c2a28360029c1c48247648fac4455c9)
where file wasn't checked that it is regular file.

Reported-by: Coverity (CID: 154711, 154712)
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
tools/zynqimage.c
tools/zynqmpimage.c

index 43876e7a302499fed65ac33ef0afdbc09f2376b9..b47132b02a60f4441bcf1205213da6a08324163f 100644 (file)
@@ -225,16 +225,26 @@ static int zynqimage_check_image_types(uint8_t type)
 static void zynqimage_parse_initparams(struct zynq_header *zynqhdr,
        const char *filename)
 {
-       /* Expect a table of register-value pairs, e.g. "0x12345678 0x4321" */
-       FILE *fp = fopen(filename, "r");
+       FILE *fp;
        struct zynq_reginit reginit;
        unsigned int reg_count = 0;
-       int r;
+       int r, err;
+       struct stat path_stat;
 
+       /* Expect a table of register-value pairs, e.g. "0x12345678 0x4321" */
+       fp = fopen(filename, "r");
        if (!fp) {
                fprintf(stderr, "Cannot open initparams file: %s\n", filename);
                exit(1);
        }
+
+       err = fstat(fileno(fp), &path_stat);
+       if (err)
+               return;
+
+       if (!S_ISREG(path_stat.st_mode))
+               return;
+
        do {
                r = fscanf(fp, "%x %x", &reginit.address, &reginit.data);
                if (r == 2) {
index 202faea07295a39efde8d5e70775aa0656917630..60d8ed23b4a1ca1eda75a261e391578e931e958e 100644 (file)
@@ -240,19 +240,23 @@ static void zynqmpimage_parse_initparams(struct zynqmp_header *zynqhdr,
        FILE *fp;
        struct zynqmp_reginit reginit;
        unsigned int reg_count = 0;
-       int r;
+       int r, err;
        struct stat path_stat;
 
-       stat(filename, &path_stat);
-       if (!S_ISREG(path_stat.st_mode))
-               return;
-
        /* Expect a table of register-value pairs, e.g. "0x12345678 0x4321" */
        fp = fopen(filename, "r");
        if (!fp) {
                fprintf(stderr, "Cannot open initparams file: %s\n", filename);
                exit(1);
        }
+
+       err = fstat(fileno(fp), &path_stat);
+       if (err)
+               return;
+
+       if (!S_ISREG(path_stat.st_mode))
+               return;
+
        do {
                r = fscanf(fp, "%x %x", &reginit.address, &reginit.data);
                if (r == 2) {