pud: fix position file stat/use race
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 22 Oct 2012 10:48:29 +0000 (12:48 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 22 Oct 2012 11:55:39 +0000 (13:55 +0200)
Coverity:
CID 739696 (#1 of 1): Time of check time of use (TOCTOU)
At (1): Calling function "stat(char const * restrict,
                               struct stat * restrict)"
        to perform check on "fileName".
At (4): Calling function "fopen(char const * restrict,
                                char const * restrict)"
        that uses "fileName" after a check function. This can cause a
        time-of-check, time-of-use race condition.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/src/posFile.c

index 42d5878..7be49e5 100644 (file)
@@ -8,6 +8,8 @@
 
 /* System includes */
 #include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include <string.h>
 #include <regex.h>
 #include <sys/stat.h>
@@ -116,14 +118,21 @@ static char line[LINE_LENGTH];
  */
 bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) {
        bool retval = false;
+       int fd;
        struct stat statBuf;
        nmeaINFO result;
-       FILE * fd = NULL;
+       FILE * fp = NULL;
        unsigned int lineNumber = 0;
        char * name = NULL;
        char * value = NULL;
 
-       if (stat(fileName, &statBuf)) {
+       fd = open(fileName, O_RDONLY);
+       if (fd < 0) {
+               /* could not access the file */
+               goto out;
+       }
+
+       if (fstat(fd, &statBuf)) {
                /* could not access the file */
                goto out;
        }
@@ -133,8 +142,8 @@ bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) {
                goto out;
        }
 
-       fd = fopen(fileName, "r");
-       if (!fd) {
+       fp = fdopen(fd, "r");
+       if (!fp) {
                goto out;
        }
 
@@ -154,7 +163,7 @@ bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) {
 
        memcpy(&cachedStat.timeStamp, &statBuf.st_mtime, sizeof(cachedStat.timeStamp));
 
-       while (fgets(line, LINE_LENGTH, fd)) {
+       while (fgets(line, LINE_LENGTH, fp)) {
                regmatch_t pmatch[regexNameValuematchCount];
 
                lineNumber++;
@@ -281,8 +290,8 @@ bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) {
                }
        }
 
-       fclose(fd);
-       fd = 0;
+       fclose(fp);
+       fp = 0;
 
        result.smask = POSFILE_DEFAULT_SMASK;
        nmea_INFO_set_present(&result.present, SMASK);
@@ -293,8 +302,11 @@ bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) {
        memcpy(nmeaInfo, &result, sizeof(result));
        retval = true;
 
-       out: if (fd) {
-               fclose(fd);
+       out: if (fp) {
+               fclose(fp);
+       }
+       if (fd) {
+               close(fd);
        }
        return retval;
 }