Message ID | 20201027114925.21843-1-colin.king@canonical.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | net: atm: fix update of position index in lec_seq_next | expand |
Context | Check | Description |
---|---|---|
jkicinski/cover_letter | success | Link |
jkicinski/fixes_present | success | Link |
jkicinski/patch_count | success | Link |
jkicinski/tree_selection | success | Guessed tree name to be net-next |
jkicinski/subject_prefix | warning | Target tree name not specified in the subject |
jkicinski/source_inline | success | Was 0 now: 0 |
jkicinski/verify_signedoff | success | Link |
jkicinski/module_param | success | Was 0 now: 0 |
jkicinski/build_32bit | fail | Errors and warnings before: 6 this patch: 6 |
jkicinski/kdoc | success | Errors and warnings before: 0 this patch: 0 |
jkicinski/verify_fixes | success | Link |
jkicinski/checkpatch | fail | Link |
jkicinski/build_allmodconfig_warn | success | Errors and warnings before: 2 this patch: 2 |
jkicinski/header_inline | success | Link |
jkicinski/stable | success | Stable not CCed |
On Tue, 27 Oct 2020 11:49:25 +0000 Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > The position index in leq_seq_next is not updated when the next > entry is fetched an no more entries are available. This causes > seq_file to report the following error: > > "seq_file: buggy .next function lec_seq_next [lec] did not update > position index" > > Fix this by always updating the position index. > > [ Note: this is an ancient 2002 bug, the sha is from the > tglx/history repo ] > > Fixes 4aea2cbff417 ("[ATM]: Move lan seq_file ops to lec.c [1/3]") > Signed-off-by: Colin Ian King <colin.king@canonical.com> Applied, very sneaky there with the lack of a colon on the Fixes tag :) BTW looking at seq_read() it seems to eat the potential error code from ->next, doesn't it? @@ -254,9 +254,11 @@ ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) } m->op->stop(m, p); n = min(m->count, size); - err = copy_to_user(buf, m->buf, n); - if (err) - goto Efault; + if (n) { + err = copy_to_user(buf, m->buf, n); + if (err) + goto Efault; + } copied += n; m->count -= n; m->from = n; Maybe? Or at least: @@ -239,10 +239,8 @@ ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) m->op->next); m->index++; } - if (!p || IS_ERR(p)) { - err = PTR_ERR(p); + if (!p || IS_ERR(p)) break; - } if (m->count >= size) break; err = m->op->show(m, p);
diff --git a/net/atm/lec.c b/net/atm/lec.c index dbabb65d8b67..7226c784dbe0 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c @@ -954,9 +954,8 @@ static void *lec_seq_next(struct seq_file *seq, void *v, loff_t *pos) { struct lec_state *state = seq->private; - v = lec_get_idx(state, 1); - *pos += !!PTR_ERR(v); - return v; + ++*pos; + return lec_get_idx(state, 1); } static int lec_seq_show(struct seq_file *seq, void *v)