|
|
306fa1 |
autofs-5.1.3 - fix possible memory leak during amd parse
|
|
|
306fa1 |
|
|
|
306fa1 |
From: Ian Kent <raven@themaw.net>
|
|
|
306fa1 |
|
|
|
306fa1 |
If an amd map entry option is given more than once subsequent assignment
|
|
|
306fa1 |
could result in a memory leak.
|
|
|
306fa1 |
|
|
|
306fa1 |
Signed-off-by: Ian Kent <raven@themaw.net>
|
|
|
306fa1 |
---
|
|
|
306fa1 |
CHANGELOG | 1
|
|
|
306fa1 |
modules/amd_parse.y | 92 +++++++++++++++++++++++++++++-----------------------
|
|
|
306fa1 |
2 files changed, 54 insertions(+), 39 deletions(-)
|
|
|
306fa1 |
|
|
|
306fa1 |
--- autofs-5.0.7.orig/CHANGELOG
|
|
|
306fa1 |
+++ autofs-5.0.7/CHANGELOG
|
|
|
306fa1 |
@@ -276,6 +276,7 @@
|
|
|
306fa1 |
- refactor amd_parse.c.
|
|
|
306fa1 |
- fix amd parser double quote handling.
|
|
|
306fa1 |
- fix expandamdent() quote handling.
|
|
|
306fa1 |
+- fix possible memory leak during amd parse.
|
|
|
306fa1 |
|
|
|
306fa1 |
25/07/2012 autofs-5.0.7
|
|
|
306fa1 |
=======================
|
|
|
306fa1 |
--- autofs-5.0.7.orig/modules/amd_parse.y
|
|
|
306fa1 |
+++ autofs-5.0.7/modules/amd_parse.y
|
|
|
306fa1 |
@@ -41,6 +41,7 @@ extern int amd_lex(void);
|
|
|
306fa1 |
extern void amd_set_scan_buffer(const char *);
|
|
|
306fa1 |
|
|
|
306fa1 |
static char *amd_strdup(char *);
|
|
|
306fa1 |
+static void amd_set_value(char **, char *);
|
|
|
306fa1 |
static void local_init_vars(void);
|
|
|
306fa1 |
static void local_free_vars(void);
|
|
|
306fa1 |
|
|
|
306fa1 |
@@ -289,19 +290,22 @@ option_assignment: MAP_OPTION OPTION_ASS
|
|
|
306fa1 |
}
|
|
|
306fa1 |
|
|
|
306fa1 |
if (!strcmp($1, "fs"))
|
|
|
306fa1 |
- entry.fs = fs_opt_val;
|
|
|
306fa1 |
+ amd_set_value(&entry.fs, fs_opt_val);
|
|
|
306fa1 |
else if (!strcmp($1, "sublink")) {
|
|
|
306fa1 |
- entry.sublink = fs_opt_val;
|
|
|
306fa1 |
+ amd_set_value(&entry.sublink, fs_opt_val);
|
|
|
306fa1 |
} else if (!strcmp($1, "pref")) {
|
|
|
306fa1 |
if (strcmp(fs_opt_val, "null"))
|
|
|
306fa1 |
- entry.pref = fs_opt_val;
|
|
|
306fa1 |
+ amd_set_value(&entry.pref, fs_opt_val);
|
|
|
306fa1 |
else {
|
|
|
306fa1 |
- entry.pref = amd_strdup("");
|
|
|
306fa1 |
- if (!entry.pref) {
|
|
|
306fa1 |
+ char *empty;
|
|
|
306fa1 |
+
|
|
|
306fa1 |
+ empty = amd_strdup("");
|
|
|
306fa1 |
+ if (!empty) {
|
|
|
306fa1 |
amd_notify($3);
|
|
|
306fa1 |
free(fs_opt_val);
|
|
|
306fa1 |
YYABORT;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
+ amd_set_value(&entry.pref, empty);
|
|
|
306fa1 |
free(fs_opt_val);
|
|
|
306fa1 |
}
|
|
|
306fa1 |
} else {
|
|
|
306fa1 |
@@ -314,11 +318,14 @@ option_assignment: MAP_OPTION OPTION_ASS
|
|
|
306fa1 |
| MAP_OPTION OPTION_ASSIGN
|
|
|
306fa1 |
{
|
|
|
306fa1 |
if (!strcmp($1, "fs")) {
|
|
|
306fa1 |
- entry.fs = amd_strdup("");
|
|
|
306fa1 |
- if (!entry.fs) {
|
|
|
306fa1 |
+ char *empty;
|
|
|
306fa1 |
+
|
|
|
306fa1 |
+ empty = amd_strdup("");
|
|
|
306fa1 |
+ if (!empty) {
|
|
|
306fa1 |
amd_notify($1);
|
|
|
306fa1 |
YYABORT;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
+ amd_set_value(&entry.fs, empty);
|
|
|
306fa1 |
} else {
|
|
|
306fa1 |
amd_notify($1);
|
|
|
306fa1 |
YYABORT;
|
|
|
306fa1 |
@@ -335,11 +342,11 @@ option_assignment: MAP_OPTION OPTION_ASS
|
|
|
306fa1 |
}
|
|
|
306fa1 |
|
|
|
306fa1 |
if (!strcmp($1, "rhost"))
|
|
|
306fa1 |
- entry.rhost = fs_opt_val;
|
|
|
306fa1 |
+ amd_set_value(&entry.rhost, fs_opt_val);
|
|
|
306fa1 |
else if (!strcmp($1, "rfs"))
|
|
|
306fa1 |
- entry.rfs = fs_opt_val;
|
|
|
306fa1 |
+ amd_set_value(&entry.rfs, fs_opt_val);
|
|
|
306fa1 |
else if (!strcmp($1, "dev"))
|
|
|
306fa1 |
- entry.dev = fs_opt_val;
|
|
|
306fa1 |
+ amd_set_value(&entry.dev, fs_opt_val);
|
|
|
306fa1 |
else if (!strcmp($1, "mount") ||
|
|
|
306fa1 |
!strcmp($1, "unmount") ||
|
|
|
306fa1 |
!strcmp($1, "umount")) {
|
|
|
306fa1 |
@@ -369,11 +376,11 @@ option_assignment: MAP_OPTION OPTION_ASS
|
|
|
306fa1 |
}
|
|
|
306fa1 |
|
|
|
306fa1 |
if (!strcmp($1, "rhost"))
|
|
|
306fa1 |
- entry.rhost = empty;
|
|
|
306fa1 |
+ amd_set_value(&entry.rhost, empty);
|
|
|
306fa1 |
else if (!strcmp($1, "rfs"))
|
|
|
306fa1 |
- entry.rfs = empty;
|
|
|
306fa1 |
+ amd_set_value(&entry.rfs, empty);
|
|
|
306fa1 |
else if (!strcmp($1, "dev"))
|
|
|
306fa1 |
- entry.dev = empty;
|
|
|
306fa1 |
+ amd_set_value(&entry.dev, empty);
|
|
|
306fa1 |
else {
|
|
|
306fa1 |
amd_notify($1);
|
|
|
306fa1 |
free(empty);
|
|
|
306fa1 |
@@ -468,36 +475,27 @@ static int match_map_option_fs_type(char
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
|
|
|
306fa1 |
- if (!strcmp(fs_type, "auto")) {
|
|
|
306fa1 |
+ if (!strcmp(fs_type, "auto"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_AUTO;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "nfs") ||
|
|
|
306fa1 |
- !strcmp(fs_type, "nfs4")) {
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "nfs") ||
|
|
|
306fa1 |
+ !strcmp(fs_type, "nfs4"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_NFS;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "nfsl")) {
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "nfsl"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_NFSL;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "link")) {
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "link"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_LINK;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "linkx")) {
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "linkx"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_LINKX;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "host")) {
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "host"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_HOST;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "lofs")) {
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "lofs"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_LOFS;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "xfs")) {
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "xfs"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_XFS;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
- } else if (!strcmp(fs_type, "ext2") ||
|
|
|
306fa1 |
+ else if (!strcmp(fs_type, "ext2") ||
|
|
|
306fa1 |
!strcmp(fs_type, "ext3") ||
|
|
|
306fa1 |
- !strcmp(fs_type, "ext4")) {
|
|
|
306fa1 |
+ !strcmp(fs_type, "ext4"))
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_EXT;
|
|
|
306fa1 |
- entry.type = fs_type;
|
|
|
306fa1 |
} else if (!strcmp(fs_type, "ufs")) {
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_UFS;
|
|
|
306fa1 |
entry.type = conf_amd_get_linux_ufs_mount_type();
|
|
|
306fa1 |
@@ -508,6 +506,7 @@ static int match_map_option_fs_type(char
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
free(fs_type);
|
|
|
306fa1 |
+ fs_type = NULL;
|
|
|
306fa1 |
} else if (!strcmp(fs_type, "cdfs")) {
|
|
|
306fa1 |
entry.flags |= AMD_MOUNT_TYPE_CDFS;
|
|
|
306fa1 |
entry.type = amd_strdup("iso9660");
|
|
|
306fa1 |
@@ -518,6 +517,7 @@ static int match_map_option_fs_type(char
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
free(fs_type);
|
|
|
306fa1 |
+ fs_type = NULL;
|
|
|
306fa1 |
} else if (!strcmp(fs_type, "jfs") ||
|
|
|
306fa1 |
!strcmp(fs_type, "nfsx") ||
|
|
|
306fa1 |
!strcmp(fs_type, "program") ||
|
|
|
306fa1 |
@@ -534,12 +534,16 @@ static int match_map_option_fs_type(char
|
|
|
306fa1 |
fs_type);
|
|
|
306fa1 |
amd_msg(msg_buf);
|
|
|
306fa1 |
free(fs_type);
|
|
|
306fa1 |
+ fs_type = NULL;
|
|
|
306fa1 |
} else {
|
|
|
306fa1 |
amd_notify(fs_type);
|
|
|
306fa1 |
free(fs_type);
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
|
|
|
306fa1 |
+ if (fs_type)
|
|
|
306fa1 |
+ amd_set_value(&entry.type, fs_type);
|
|
|
306fa1 |
+
|
|
|
306fa1 |
return 1;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
|
|
|
306fa1 |
@@ -558,15 +562,18 @@ static int match_map_option_map_type(cha
|
|
|
306fa1 |
!strcmp(map_type, "nisplus") ||
|
|
|
306fa1 |
!strcmp(map_type, "ldap") ||
|
|
|
306fa1 |
!strcmp(map_type, "hesiod")) {
|
|
|
306fa1 |
- entry.map_type = map_type;
|
|
|
306fa1 |
+ amd_set_value(&entry.map_type, map_type);
|
|
|
306fa1 |
} else if (!strcmp(map_type, "exec")) {
|
|
|
306fa1 |
/* autofs uses "program" for "exec" map type */
|
|
|
306fa1 |
- entry.map_type = amd_strdup("program");
|
|
|
306fa1 |
- if (!entry.map_type) {
|
|
|
306fa1 |
+ char * tmp;
|
|
|
306fa1 |
+
|
|
|
306fa1 |
+ tmp = amd_strdup("program");
|
|
|
306fa1 |
+ if (!tmp) {
|
|
|
306fa1 |
amd_notify(type);
|
|
|
306fa1 |
free(map_type);
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
+ amd_set_value(&entry.map_type, tmp);
|
|
|
306fa1 |
free(map_type);
|
|
|
306fa1 |
} else if (!strcmp(map_type, "passwd")) {
|
|
|
306fa1 |
sprintf(msg_buf, "map type %s is "
|
|
|
306fa1 |
@@ -621,17 +628,17 @@ static int match_mnt_option_options(char
|
|
|
306fa1 |
tmp = amd_strdup(options);
|
|
|
306fa1 |
if (!tmp)
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
- entry.opts = tmp;
|
|
|
306fa1 |
+ amd_set_value(&entry.opts, tmp);
|
|
|
306fa1 |
} else if (!strcmp(mnt_option, "addopts")) {
|
|
|
306fa1 |
tmp = amd_strdup(options);
|
|
|
306fa1 |
if (!tmp)
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
- entry.addopts = tmp;
|
|
|
306fa1 |
+ amd_set_value(&entry.addopts, tmp);
|
|
|
306fa1 |
} else if (!strcmp(mnt_option, "remopts")) {
|
|
|
306fa1 |
tmp = amd_strdup(options);
|
|
|
306fa1 |
if (!tmp)
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
- entry.remopts = tmp;
|
|
|
306fa1 |
+ amd_set_value(&entry.remopts, tmp);
|
|
|
306fa1 |
} else
|
|
|
306fa1 |
return 0;
|
|
|
306fa1 |
|
|
|
306fa1 |
@@ -715,6 +722,13 @@ done:
|
|
|
306fa1 |
return tmp;
|
|
|
306fa1 |
}
|
|
|
306fa1 |
|
|
|
306fa1 |
+static void amd_set_value(char **field, char *value)
|
|
|
306fa1 |
+{
|
|
|
306fa1 |
+ if (*field)
|
|
|
306fa1 |
+ free(*field);
|
|
|
306fa1 |
+ *field = value;
|
|
|
306fa1 |
+}
|
|
|
306fa1 |
+
|
|
|
306fa1 |
static int amd_error(const char *s)
|
|
|
306fa1 |
{
|
|
|
306fa1 |
if (strcmp(s, "syntax"))
|