 
                            ...
TR 24731-1 defines a new type of errno_t which is type int in <errno.h> and elsewhere. Many of the functions defined in TR 24731-1 return values of this type. As a matter of programming style, errno_t should be used as the type of something that deals only with the values that might be found in errno. For example, a function which returns the value of errno should be declared as having the return type errno_t.
Non-Compliant Code Example
This non-compliant code example illustrates a function called opener() that is declared as returning a value of type int. The function, however, uses this return value to indicate the return status of the function by returning values of errno. Consequently, the meaning of the return value is not as clear as it could be.
| Code Block | ||
|---|---|---|
| 
 | ||
| 
int opener(FILE* file, int *width, int *height, int *data_offset) {
  int file_w;
  int file_h;
  int file_o;
  int offset = 0;
  if (file == NULL) { return -1; }
  if (fscanf(file, "%i %i %i", &file_w, &file_h, &file_o)  != 3) { return -1; }
  if (fsetpos(file, &offset) != 0) { return -1; }
  *width = file_w;
  *height = file_h;
  *data_offset = file_o;
  return 0; 
}
 | 
Compliant Solution
In this compliant solution, the opener() function returns a value of type errno_t providing a clear indication that this returns a values that might be found in errno.
| Code Block | ||
|---|---|---|
| 
 | ||
| 
errno_t opener(FILE* file, int *width, int *height, int *data_offset) {
  int file_w;
  int file_h;
  int file_o;
  int rc;
  fpos_t offset;
  if (file == NULL) { return EINVAL; }
  rc = fgetpos(file, &offset);
  if (rc != 0) { return (errno_t)rc; }
  if (fscanf(file, "%i %i %i", &file_w, &file_h, &file_o)  != 3) { return EIO; }
  rc = fsetpos(file, &offset);
  if (rc != 0) { return -1; }
  *width = file_w;
  *height = file_h;
  *data_offset = file_o;
  return 0; 
}
 | 
Risk Assessment
The misuse of fsetpos() could move a file stream read to a undesired location in the file. If this location held input from user the user would then gain control of the variables being read from the file.
| Rule | Severity | Likelihood | Remediation Cost | Priority | Level | 
|---|---|---|---|---|---|
| DCL08 DCL09-A | 1 (low) | 1 (low) | 2 (medium) | P2 | L3 | 
References
| Wiki Markup | 
|---|
| \[[ISO/IEC TR 24731-2006|AA. C References#ISO/IEC TR 24731-2006]\] \[[ISO/IEC 9899-1999:TC2|AA. C References#ISO/IEC 9899-1999TC2]\] Section 6.7.5.3, "Function declarators (including prototypes)" |