| From 86d32f9a7c54ad74f4514d7fef7c847883207291 Mon Sep 17 00:00:00 2001 |
| From: Vasily Averin <vvs@virtuozzo.com> |
| Date: Tue, 14 Apr 2020 21:33:16 +0100 |
| Subject: keys: Fix proc_keys_next to increase position index |
| |
| From: Vasily Averin <vvs@virtuozzo.com> |
| |
| commit 86d32f9a7c54ad74f4514d7fef7c847883207291 upstream. |
| |
| If seq_file .next function does not change position index, |
| read after some lseek can generate unexpected output: |
| |
| $ dd if=/proc/keys bs=1 # full usual output |
| 0f6bfdf5 I--Q--- 2 perm 3f010000 1000 1000 user 4af2f79ab8848d0a: 740 |
| 1fb91b32 I--Q--- 3 perm 1f3f0000 1000 65534 keyring _uid.1000: 2 |
| 27589480 I--Q--- 1 perm 0b0b0000 0 0 user invocation_id: 16 |
| 2f33ab67 I--Q--- 152 perm 3f030000 0 0 keyring _ses: 2 |
| 33f1d8fa I--Q--- 4 perm 3f030000 1000 1000 keyring _ses: 1 |
| 3d427fda I--Q--- 2 perm 3f010000 1000 1000 user 69ec44aec7678e5a: 740 |
| 3ead4096 I--Q--- 1 perm 1f3f0000 1000 65534 keyring _uid_ses.1000: 1 |
| 521+0 records in |
| 521+0 records out |
| 521 bytes copied, 0,00123769 s, 421 kB/s |
| |
| But a read after lseek in middle of last line results in the partial |
| last line and then a repeat of the final line: |
| |
| $ dd if=/proc/keys bs=500 skip=1 |
| dd: /proc/keys: cannot skip to specified offset |
| g _uid_ses.1000: 1 |
| 3ead4096 I--Q--- 1 perm 1f3f0000 1000 65534 keyring _uid_ses.1000: 1 |
| 0+1 records in |
| 0+1 records out |
| 97 bytes copied, 0,000135035 s, 718 kB/s |
| |
| and a read after lseek beyond end of file results in the last line being |
| shown: |
| |
| $ dd if=/proc/keys bs=1000 skip=1 # read after lseek beyond end of file |
| dd: /proc/keys: cannot skip to specified offset |
| 3ead4096 I--Q--- 1 perm 1f3f0000 1000 65534 keyring _uid_ses.1000: 1 |
| 0+1 records in |
| 0+1 records out |
| 76 bytes copied, 0,000119981 s, 633 kB/s |
| |
| See https://bugzilla.kernel.org/show_bug.cgi?id=206283 |
| |
| Fixes: 1f4aace60b0e ("fs/seq_file.c: simplify seq_file iteration code ...") |
| Signed-off-by: Vasily Averin <vvs@virtuozzo.com> |
| Signed-off-by: David Howells <dhowells@redhat.com> |
| Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| security/keys/proc.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/security/keys/proc.c |
| +++ b/security/keys/proc.c |
| @@ -139,6 +139,8 @@ static void *proc_keys_next(struct seq_f |
| n = key_serial_next(p, v); |
| if (n) |
| *_pos = key_node_serial(n); |
| + else |
| + (*_pos)++; |
| return n; |
| } |
| |