Versions Compared

Key

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

...

If len is equal to sizeof(buf), the null terminator is written 1 byte past the end of buf.:

Code Block
bgColor#FFcccc
langc
char buf[1024];
ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf));
buf[len] = '\0';

An incorrect solution to this problem is to try to make buf large enough that it can always hold the result.:

Code Block
bgColor#ffcccc
langc
long symlink_max;
size_t bufsize;
char *buf;
ssize_t len;

errno = 0;
symlink_max = pathconf("/usr/bin/", _PC_SYMLINK_MAX);
if (symlink_max == -1) {
  if (errno != 0) {
    /* handle error condition */
  }
  bufsize = 10000;
}
else {
  bufsize = symlink_max+1;
}

buf = (char *)malloc(bufsize);
if (buf == NULL) {
  /* handle error condition */
}

len = readlink("/usr/bin/perl", buf, bufsize);
buf[len] = '\0';

...

This compliant solution ensures there is no overflow by reading in only sizeof(buf)-1 characters. It also properly checks to see if an error has occurred.:

Code Block
bgColor#ccccff
langc
enum { BUFFERSIZE = 1024 };
char buf[BUFFERSIZE];
ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf)-1);

if (len != -1) {
  buf[len] = '\0';
}
else {
  /* handle error condition */
}

...

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

Related Guidelines

...

...

Improper null termination

...

...

Bibliography

 

...

Image Modified