...
If len
is equal to sizeof(buf)
, the null terminator is written one byte past the end of buf
.
Code Block | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
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 only reading in sizeof(buf)-1
characters. It also properly checks to see if an error has occurred.
Code Block | ||||
---|---|---|---|---|
| ||||
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 */ } |
...