libmount: more robust options string parsing

# mount -o=rw /dev/sdb /mnt/test
 mount: libmount/src/optmap.c:212: mnt_optmap_get_entry: Assertion `namelen' failed.
 Aborted (core dumped)

Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=968786
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2013-05-30 13:29:34 +02:00
parent 3e5c0a2db2
commit 8225bb78a6
2 changed files with 4 additions and 2 deletions

View File

@ -77,7 +77,7 @@ static int mnt_optstr_parse_next(char **optstr, char **name, size_t *namesz,
open_quote ^= 1; /* reverse the status */
if (open_quote)
continue; /* still in quoted block */
if (!sep && *p == '=')
if (!sep && p > start && *p == '=')
sep = p; /* name and value separator */
if (*p == ',')
stop = p; /* terminate the option item */
@ -540,7 +540,7 @@ int mnt_split_optstr(const char *optstr, char **user, char **vfs,
if (user)
*user = NULL;
while(!mnt_optstr_next_option(&str, &name, &namesz, &val, &valsz)) {
while (!mnt_optstr_next_option(&str, &name, &namesz, &val, &valsz)) {
int rc = 0;
const struct libmnt_optmap *ent = NULL;
const struct libmnt_optmap *m =

View File

@ -682,6 +682,8 @@ static void sanitize_paths(struct libmnt_context *cxt)
static void append_option(struct libmnt_context *cxt, const char *opt)
{
if (opt && (*opt == '=' || *opt == '\'' || *opt == '\"' || isblank(*opt)))
errx(MOUNT_EX_USAGE, _("unsupported option format: %s"), opt);
if (mnt_context_append_options(cxt, opt))
err(MOUNT_EX_SYSERR, _("failed to append option '%s'"), opt);
}