mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 20:48:49 +08:00
x86: fix seq_file iteration for pat/memtype.c
The memtype seq_file iterator allocates a buffer in the ->start and ->next functions and frees it in the ->show function. The preferred handling for such resources is to free them in the subsequent ->next or ->stop function call. Since Commit1f4aace60b
("fs/seq_file.c: simplify seq_file iteration code and interface") there is no guarantee that ->show will be called after ->next, so this function can now leak memory. So move the freeing of the buffer to ->next and ->stop. Link: https://lkml.kernel.org/r/161248539022.21478.13874455485854739066.stgit@noble1 Fixes:1f4aace60b
("fs/seq_file.c: simplify seq_file iteration code and interface") Signed-off-by: NeilBrown <neilb@suse.de> Cc: Xin Long <lucien.xin@gmail.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Andy Lutomirski <luto@kernel.org> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Cc: Neil Horman <nhorman@tuxdriver.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Vlad Yasevich <vyasevich@gmail.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b3656d8227
commit
3d2fc4c082
@ -1164,12 +1164,14 @@ static void *memtype_seq_start(struct seq_file *seq, loff_t *pos)
|
|||||||
|
|
||||||
static void *memtype_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
static void *memtype_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||||
{
|
{
|
||||||
|
kfree(v);
|
||||||
++*pos;
|
++*pos;
|
||||||
return memtype_get_idx(*pos);
|
return memtype_get_idx(*pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void memtype_seq_stop(struct seq_file *seq, void *v)
|
static void memtype_seq_stop(struct seq_file *seq, void *v)
|
||||||
{
|
{
|
||||||
|
kfree(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int memtype_seq_show(struct seq_file *seq, void *v)
|
static int memtype_seq_show(struct seq_file *seq, void *v)
|
||||||
@ -1181,8 +1183,6 @@ static int memtype_seq_show(struct seq_file *seq, void *v)
|
|||||||
entry_print->end,
|
entry_print->end,
|
||||||
cattr_name(entry_print->type));
|
cattr_name(entry_print->type));
|
||||||
|
|
||||||
kfree(entry_print);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user