Fix readlink's do-while-loop

The function pid_link tries to handle programs which contain very
long paths to their executables. If 1024 bytes are not enough to
contain the path, the loop wants to get more and more space until
the path can fit.

The loop's condition does not fit though.

readlink will never return a value higher than its supplied size
limit, which is "path_alloc_size - 1", therefore the loop-check of
"len == path_alloc_size" will always be false: the loop will never
be repeated.

While at it, the if-condition inside the loop's body can be omitted,
because it is always true.
This commit is contained in:
Tobias Stoeckmann 2015-07-11 21:30:31 +02:00
parent 30986cb22e
commit e8430bad00

12
pidof.c
View File

@ -103,20 +103,18 @@ static char *pid_link (pid_t pid, const char *base_name)
{ {
char link [PROCPATHLEN]; char link [PROCPATHLEN];
char *result; char *result;
int path_alloc_size; ssize_t path_alloc_size;
int len; ssize_t len;
snprintf(link, sizeof(link), "/proc/%d/%s", pid, base_name); snprintf(link, sizeof(link), "/proc/%d/%s", pid, base_name);
len = path_alloc_size = 0; len = path_alloc_size = 0;
result = NULL; result = NULL;
do { do {
if (len == path_alloc_size) { grow_size(path_alloc_size);
grow_size (path_alloc_size); result = xrealloc(result, path_alloc_size);
result = (char *) xrealloc (result, path_alloc_size);
}
if ((len = readlink(link, result, path_alloc_size - 1)) < 0) { if ((len = readlink(link, result, path_alloc_size)) < 0) {
len = 0; len = 0;
break; break;
} }