[CRIU] [PATCH] proc: read all data from /proc/pid/task/tid/children

Pavel Emelyanov xemul at parallels.com
Mon Oct 26 08:41:13 PDT 2015


On 10/26/2015 04:49 PM, Andrey Vagin wrote:
> From: Andrew Vagin <avagin at openvz.org>
> 
> Currently we read only 4096 bytes (the size of buf).
> 
> Signed-off-by: Andrew Vagin <avagin at openvz.org>
> ---
>  proc_parse.c | 31 ++++++++++++++-----------------
>  1 file changed, 14 insertions(+), 17 deletions(-)
> 
> diff --git a/proc_parse.c b/proc_parse.c
> index 75ca682..bd6f023 100644
> --- a/proc_parse.c
> +++ b/proc_parse.c
> @@ -2145,40 +2145,37 @@ int parse_children(pid_t pid, pid_t **_c, int *_n)
>  		return -1;
>  
>  	while ((de = readdir(dir))) {
> -		int fd, len;
> -		char *pos;
> +		FILE *f;
>  
>  		if (dir_dots(de))
>  			continue;
>  
> -		fd = open_proc(pid, "task/%s/children", de->d_name);
> -		if (fd < 0)
> +		f = fopen_proc(pid, "task/%s/children", de->d_name);

Please, use bfd engine for this.

> +		if (f == NULL)
>  			goto err;
>  
> -		len = read(fd, buf, BUF_SIZE);
> -		close(fd);
> -		if (len < 0)
> -			goto err;
> -
> -		buf[len] = '\0';
> -		pos = buf;
>  		while (1) {
>  			pid_t val, *tmp;
>  
> -			val = strtol(pos, &pos, 0);
> -			if (!val) {
> -				BUG_ON(*pos != '\0');
> -				break;
> +			if (fscanf(f, "%u", &val) < 1) {
> +				if (feof(f)) {
> +					fclose(f);
> +					break;
> +				}
> +				pr_perror("Unable to parse task/%s/children", de->d_name);
> +				fclose(f);
> +				goto err;
>  			}
>  
>  			tmp = xrealloc(ch, (nr + 1) * sizeof(pid_t));
> -			if (!tmp)
> +			if (!tmp) {
> +				fclose(f);
>  				goto err;
> +			}
>  
>  			ch = tmp;
>  			ch[nr] = val;
>  			nr++;
> -			pos++; /* space goes after each pid */
>  		}
>  	}
>  
> 



More information about the CRIU mailing list