From: Karel Zak Date: Mon, 15 Apr 2019 10:55:46 +0000 (+0200) Subject: libmount: fix memleak on parse errors X-Git-Tag: v2.34-rc1~29 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Futil-linux.git;a=commitdiff_plain;h=82e39473a5b9139248c94a0d3b2f6432d57566cc libmount: fix memleak on parse errors Addresses: https://github.com/systemd/systemd/pull/12252 Signed-off-by: Karel Zak --- diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c index 16e7956af8..9b8bfc5933 100644 --- a/libmount/src/tab_parse.c +++ b/libmount/src/tab_parse.c @@ -95,7 +95,7 @@ static inline const char *skip_nonspearator(const char *p) static int mnt_parse_table_line(struct libmnt_fs *fs, const char *s) { int rc = 0; - char *p; + char *p = NULL; fs->passno = fs->freq = 0; @@ -103,6 +103,7 @@ static int mnt_parse_table_line(struct libmnt_fs *fs, const char *s) p = unmangle(s, &s); if (!p || (rc = __mnt_fs_set_source_ptr(fs, p))) { DBG(TAB, ul_debug("tab parse error: [source]")); + free(p); goto fail; } @@ -121,6 +122,7 @@ static int mnt_parse_table_line(struct libmnt_fs *fs, const char *s) p = unmangle(s, &s); if (!p || (rc = __mnt_fs_set_fstype_ptr(fs, p))) { DBG(TAB, ul_debug("tab parse error: [fstype]")); + free(p); goto fail; } @@ -130,11 +132,13 @@ static int mnt_parse_table_line(struct libmnt_fs *fs, const char *s) p = unmangle(s, &s); if (p && (rc = mnt_fs_set_options(fs, p))) { DBG(TAB, ul_debug("tab parse error: [options]")); + free(p); goto fail; } - if (!p) goto done; + free(p); + s = skip_separator(s); if (!s || !*s) goto done; @@ -250,6 +254,7 @@ static int mnt_parse_mountinfo_line(struct libmnt_fs *fs, const char *s) p = unmangle(s, &s); if (!p || (rc = __mnt_fs_set_fstype_ptr(fs, p))) { DBG(TAB, ul_debug("tab parse error: [fstype]")); + free(p); goto fail; } @@ -267,6 +272,7 @@ static int mnt_parse_mountinfo_line(struct libmnt_fs *fs, const char *s) p = unmangle(s, &s); if (!p || (rc = __mnt_fs_set_source_ptr(fs, p))) { DBG(TAB, ul_debug("tab parse error: [regular source]")); + free(p); goto fail; } } @@ -319,7 +325,8 @@ static int mnt_parse_utab_line(struct libmnt_fs *fs, const char *s) char *v = unmangle(p + 4, &end); if (!v) goto enomem; - __mnt_fs_set_source_ptr(fs, v); + if (__mnt_fs_set_source_ptr(fs, v)) + free(v); } else if (!fs->target && !strncmp(p, "TARGET=", 7)) { fs->target = unmangle(p + 7, &end); @@ -378,6 +385,7 @@ static int mnt_parse_swaps_line(struct libmnt_fs *fs, const char *s) } if (!p || (rc = __mnt_fs_set_source_ptr(fs, p))) { DBG(TAB, ul_debug("tab parse error: [source]")); + free(p); goto fail; }