Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Section 7.21.5.3 of C11 the C Standard [ISO/IEC 9899:2011] places the following restrictions on update streams:

...

Code Block
bgColor#ffcccc
langc
char data[BUFFERSIZE];
char append_data[BUFFERSIZE];
char *file_name;
FILE *file;

/* Initialize file_name */

file = fopen(file_name, "a+");
if (file == NULL) {
  /* Handle error */
}

/* initializeInitialize append_data */

if (fwrite(append_data, BUFFERSIZE, 1, file) != BUFFERSIZE) {
  /* Handle error */
}
if (fread(data, BUFFERSIZE, 1, file) != 0) {
  /* Handle there not being data */
}

fclose(file);

However, because the stream is not flushed in between the call to fread() and fwrite(), the behavior is undefined.

...

In this compliant solution, fseek() is called in between the output and input, eliminating the undefined behavior.

Code Block
bgColor#ccccff
langc
char data[BUFFERSIZE];
char append_data[BUFFERSIZE];
char *file_name;
FILE *file;

/* initializeInitialize file_name */

file = fopen(file_name, "a+");
if (file == NULL) {
  /* Handle error */
}

/* Initialize append_data */

if (fwrite(append_data, BUFFERSIZE, 1, file) != BUFFERSIZE) {
  /* Handle error */
}

if (fseek(file, 0L, SEEK_SET) != 0) {
  /* Handle error */
}

if (fread(data, BUFFERSIZE, 1, file) != 0) {
  /* Handle there not being data */
}

fclose(file);

...

Tool

Version

Checker

Description

Compass/ROSE

 

Fortify SCA

V. 5.0 

Can detect simple violations of this rule with CERT C Rule Pack.

Compass/ROSE

Fortify SCA

5.0

 

 

Can detect simple violations of this rule with CERT C Rule Pack.

LDRA tool suite

Include Page
LDRA_V
LDRA_V

84 D

Fully implemented.

...

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

Related Guidelines

...

...

ISO/IEC TS 17961 (Draft)Interleaving stream inputs and outputs without a flush or positioning call [ioileave]

Bibliography

[ISO/IEC 9899:2011]Section 7.21.5.3, "The fopen Function"

...