
We should call jffs2_clean_cache() if we return from jffs2_build_lists() with an error to prevent usage of incomplete lists. Also we should free() a local buffer to prevent memory leaks.
Signed-off-by: Ilya Yanok yanok@emcraft.com --- fs/jffs2/jffs2_1pass.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/fs/jffs2/jffs2_1pass.c b/fs/jffs2/jffs2_1pass.c index 07511b9..1923ed9 100644 --- a/fs/jffs2/jffs2_1pass.c +++ b/fs/jffs2/jffs2_1pass.c @@ -1496,6 +1496,8 @@ jffs2_1pass_build_lists(struct part_info * part) if (!sumptr) { putstr("Can't get memory for summary " "node!\n"); + free(buf); + jffs2_free_cache(part); return 0; } memcpy(sumptr + sumlen - buf_len, buf + @@ -1517,8 +1519,11 @@ jffs2_1pass_build_lists(struct part_info * part)
if (buf_size && sumlen > buf_size) free(sumptr); - if (ret < 0) + if (ret < 0) { + free(buf); + jffs2_free_cache(part); return 0; + } if (ret) continue;
@@ -1632,8 +1637,11 @@ jffs2_1pass_build_lists(struct part_info * part) break;
if (insert_node(&pL->frag, (u32) part->offset + - ofs) == NULL) + ofs) == NULL) { + free(buf); + jffs2_free_cache(part); return 0; + } if (max_totlen < node->totlen) max_totlen = node->totlen; break; @@ -1659,8 +1667,11 @@ jffs2_1pass_build_lists(struct part_info * part) if (! (counterN%100)) puts ("\b\b. "); if (insert_node(&pL->dir, (u32) part->offset + - ofs) == NULL) + ofs) == NULL) { + free(buf); + jffs2_free_cache(part); return 0; + } if (max_totlen < node->totlen) max_totlen = node->totlen; counterN++;