[PATCH 1/2] cobalt/vfile: seq_file seek index must progress
Philippe Gerum
rpm at xenomai.org
Mon May 24 09:32:39 CEST 2021
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;
}
--
2.31.1
More information about the Xenomai
mailing list