Simultaneously opening Opening a file multiple times that is already open has implementation-defined behavior. On some platforms, this is not allowed. On others, it might result in race conditions.
Non-Compliant Coding Example
, according to the C Standard, 7.21.3, paragraph 8 [ISO/IEC 9899:2011]:
Functions that open additional (nontemporary) files require a file name, which is a string. The rules for composing valid file names are implementation-defined. Whether the same file can be simultaneously open multiple times is also implementation-defined.
Some implementations do not allow multiple copies of the same file to be open at the same time. Consequently, portable code cannot depend on what will happen if this rule is violated. Even on implementations that do not outright fail to open an already-opened file, a TOCTOU (time-of-check, time-of-use) race condition exists in which the second open could operate on a different file from the first due to the file being moved or deleted (see FIO45-C. Avoid TOCTOU race conditions while accessing files for more details on TOCTOU race conditions).
Noncompliant Code Example
This noncompliant The following non-compliant code example logs the program's state at runtime.:
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h> void do_stuff(void) { FILE *logfile = fopen("log", "a"); if (logfile == NULL) { /* Check for errors, write Handle error */ } /* Write logs pertaining to do_stuff(), etc. */ fprintf(logfile, "do_stuff\n"); } int main(void) { FILE *logfile = fopen("log", "a"); if (logfile == NULL) { /* Check for errors, write Handle error */ } /* Write logs pertaining to main(), etc. */ fprintf(logfile, "main\n"); do_stuff(); if (fclose(logfile) == EOF) { /* Handle ...error */ } return 0; } |
Because However, the file log
is opened twice simultaneously. The result is (once in main()
and again in do_stuff()
), this program has implementation-defined and potentially dangerousbehavior.
Compliant Solution
In this compliant solution, a reference to the file pointer is passed around so that the file does not have to be opened twice separatelyas an argument to functions that need to perform operations on that file. This reference eliminates the need to open the same file multiple times.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h> void do_stuff(FILE **filelogfile) { FILE *logfile = *file; /* Check for errors, writeWrite logs pertaining to do_stuff,() etc. */ fprintf(logfile, "do_stuff\n"); } int main(void) { FILE *logfile = fopen("log", "a"); if (logfile == NULL) { /* Handle error * Check for errors, write/ } /* Write logs pertaining to main,() etc. */ fprintf(logfile, "main\n"); do_stuff(&logfile); if (fclose(logfile) == EOF) { /* Handle ...error */ } return 0; } |
Risk Assessment
Simultaneously opening a file multiple times could can result in abnormal program termination or a data integrity violationunexpected errors and nonportable behavior.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|
FIO31-C
2 (medium)
2 (probable)
2 (medium)
P8
L2
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
References
Wiki Markup |
---|
\[[ISO/IEC 9899-1999|AA. C References#ISO/IEC 9899-1999]\] Section 7.19.3, "Files" |
FIO24-C | Medium | Probable | High | P4 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
CodeSonar |
| IO.RACE IO.BRAW | File system race condition File Open for Both Read and Write | ||||||
LDRA tool suite |
| 75 D | Partially implemented | ||||||
Parasoft C/C++test |
| CERT_C-FIO24-a | Avoid race conditions while accessing files | ||||||
| CERT C: Rec. FIO24-C | Checks for situations where previously opened resources are reopened (rec. fully covered) |
Related Guidelines
SEI CERT C Coding Standard | FIO45-C. Avoid TOCTOU race conditions while accessing files |
SEI CERT C++ Coding Standard | VOID FIO21-CPP. Do not simultaneously open the same file multiple times |
MITRE CWE | CWE-362, Concurrent Execution Using Shared Resource with Improper Synchronization ("Race Condition") CWE-675, Duplicate Operations on Resource |
Bibliography
[ISO/IEC 9899:2011] | Subclause 7.21.3, "Files" |
...
09. Input Output (FIO) FIO32-C. Detect and handle file operation errors