[PATCH 1/2] cobalt/vfile: seq_file seek index must progress

Jan Kiszka jan.kiszka at siemens.com
Tue May 25 08:00:15 CEST 2021


On 24.05.21 09:32, Philippe Gerum wrote:
> From: Philippe Gerum <rpm at xenomai.org>
> 
> The offset field we receive from the kernel in a vfile next() handler
> must progress in order for the loop to stop properly, independently
> from our own tracking of the end-of-list condition.
> 
> Bug is reproducible by running two loops in parallel:
> 
> - one continuously spawning an application which creates a few tenths
> of threads (10-20 would suffice) before exiting shortly after.
> 
> - another one continuously reading from /proc/xenomai/sched/{threads,
>   stat, acct}.
> 
> At some point, the vfile handler should cause a kernel crash.
> 
> Signed-off-by: Philippe Gerum <rpm at xenomai.org>
> ---
>  kernel/cobalt/vfile.c | 10 ++++------
>  1 file changed, 4 insertions(+), 6 deletions(-)
> 
> diff --git a/kernel/cobalt/vfile.c b/kernel/cobalt/vfile.c
> index c7b81a704..fae0cc377 100644
> --- a/kernel/cobalt/vfile.c
> +++ b/kernel/cobalt/vfile.c
> @@ -109,11 +109,11 @@ static void *vfile_snapshot_next(struct seq_file *seq, void *v, loff_t *offp)
>  	struct xnvfile_snapshot_iterator *it = seq->private;
>  	loff_t pos = *offp;
>  
> +	++*offp;
> +
>  	if (pos >= it->nrdata)
>  		return NULL;
>  
> -	++*offp;
> -
>  	return it->databuf + pos * it->vfile->datasz;
>  }
>  
> @@ -452,17 +452,15 @@ static void *vfile_regular_next(struct seq_file *seq, void *v, loff_t *offp)
>  	struct xnvfile_regular *vfile = it->vfile;
>  	void *data;
>  
> +	it->pos = ++(*offp);
> +
>  	if (vfile->ops->next == NULL)
>  		return NULL;
>  
> -	it->pos = *offp + 1;
> -
>  	data = vfile->ops->next(it);
>  	if (data == NULL)
>  		return NULL;
>  
> -	*offp = it->pos;
> -
>  	return data;
>  }
>  
> 

Thanks, applied to next and all stable branches.

Jan

-- 
Siemens AG, T RDA IOT
Corporate Competence Center Embedded Linux



More information about the Xenomai mailing list