- fix uri list locking (again). - check for stale SASL credentials upon connect fail. - add "forcestart" and "forcerestart" init script options to allow use of 5.0.3 strartup behavior if required. - always read entire file map into cache to speed lookups. - make MAX_ERR_BUF and PARSE_MAX_BUF use easier to audit. - make some easy alloca replacements. - update to configure libtirpc if present. - update to provide ipv6 name and address support. - update to provide ipv6 address parsing.
1138 lines
32 KiB
Diff
1138 lines
32 KiB
Diff
autofs-5.0.4 - easy alloca replacements
|
|
|
|
From: Valerie Aurora Henson <vaurora@redhat.com>
|
|
|
|
alloca() is compiler-dependent, non-standard, and has undefined
|
|
behavior when it fails (IOW, the program crashes). Replace with
|
|
normal C stack variables where possible and malloc() where not.
|
|
---
|
|
|
|
CHANGELOG | 1
|
|
daemon/automount.c | 29 ++++++--------
|
|
daemon/direct.c | 12 ++----
|
|
daemon/flag.c | 13 +++---
|
|
daemon/indirect.c | 12 ++----
|
|
daemon/module.c | 45 +++++++---------------
|
|
lib/cache.c | 31 +++++----------
|
|
lib/cat_path.c | 1
|
|
modules/lookup_file.c | 82 +++++++++++++----------------------------
|
|
modules/lookup_ldap.c | 93 +++++++++++++++++++++++++++++------------------
|
|
modules/lookup_nisplus.c | 71 ++++++++++++++++++++---------------
|
|
modules/mount_autofs.c | 1
|
|
modules/mount_bind.c | 7 +--
|
|
modules/mount_changer.c | 5 --
|
|
modules/mount_ext2.c | 5 --
|
|
modules/mount_generic.c | 5 --
|
|
16 files changed, 185 insertions(+), 228 deletions(-)
|
|
|
|
|
|
--- autofs-5.0.4.orig/daemon/automount.c
|
|
+++ autofs-5.0.4/daemon/automount.c
|
|
@@ -127,8 +127,8 @@ static int do_mkdir(const char *parent,
|
|
|
|
int mkdir_path(const char *path, mode_t mode)
|
|
{
|
|
- char *buf = alloca(strlen(path) + 1);
|
|
- char *parent = alloca(strlen(path) + 1);
|
|
+ char buf[PATH_MAX];
|
|
+ char parent[PATH_MAX];
|
|
const char *cp = path, *lcp = path;
|
|
char *bp = buf, *pp = parent;
|
|
|
|
@@ -163,7 +163,7 @@ int mkdir_path(const char *path, mode_t
|
|
int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev)
|
|
{
|
|
int len = strlen(path);
|
|
- char *buf = alloca(len + 1);
|
|
+ char buf[PATH_MAX];
|
|
char *cp;
|
|
int first = 1;
|
|
struct stat st;
|
|
@@ -468,20 +468,17 @@ static int umount_subtree_mounts(struct
|
|
pthread_cleanup_push(cache_lock_cleanup, mc);
|
|
|
|
if (me->multi) {
|
|
- char *root, *base;
|
|
- size_t ap_len;
|
|
+ char root[PATH_MAX];
|
|
+ char *base;
|
|
int cur_state;
|
|
|
|
- ap_len = strlen(ap->path);
|
|
-
|
|
- if (!strchr(me->multi->key, '/')) {
|
|
+ if (!strchr(me->multi->key, '/'))
|
|
/* Indirect multi-mount root */
|
|
- root = alloca(ap_len + strlen(me->multi->key) + 2);
|
|
- strcpy(root, ap->path);
|
|
- strcat(root, "/");
|
|
- strcat(root, me->multi->key);
|
|
- } else
|
|
- root = me->multi->key;
|
|
+ /* sprintf okay - if it's mounted, it's
|
|
+ * PATH_MAX or less bytes */
|
|
+ sprintf(root, "%s/%s", ap->path, me->multi->key);
|
|
+ else
|
|
+ strcpy(root, me->multi->key);
|
|
|
|
if (is_mm_root)
|
|
base = NULL;
|
|
@@ -929,14 +926,14 @@ static int get_pkt(struct autofs_point *
|
|
|
|
int do_expire(struct autofs_point *ap, const char *name, int namelen)
|
|
{
|
|
- char buf[PATH_MAX + 1];
|
|
+ char buf[PATH_MAX];
|
|
int len, ret;
|
|
|
|
if (*name != '/') {
|
|
len = ncat_path(buf, sizeof(buf), ap->path, name, namelen);
|
|
} else {
|
|
len = snprintf(buf, PATH_MAX, "%s", name);
|
|
- if (len > PATH_MAX)
|
|
+ if (len >= PATH_MAX)
|
|
len = 0;
|
|
}
|
|
|
|
--- autofs-5.0.4.orig/daemon/direct.c
|
|
+++ autofs-5.0.4/daemon/direct.c
|
|
@@ -637,7 +637,9 @@ int mount_autofs_offset(struct autofs_po
|
|
time_t timeout = ap->exp_timeout;
|
|
struct stat st;
|
|
int ioctlfd, status, ret;
|
|
- const char *type, *map_name = NULL;
|
|
+ const char *hosts_map_name = "-hosts";
|
|
+ const char *map_name = hosts_map_name;
|
|
+ const char *type;
|
|
char mountpoint[PATH_MAX];
|
|
|
|
if (ops->version && ap->flags & MOUNT_FLAG_REMOUNT) {
|
|
@@ -740,13 +742,7 @@ int mount_autofs_offset(struct autofs_po
|
|
mp->options, mountpoint);
|
|
|
|
type = ap->entry->maps->type;
|
|
- if (type && !strcmp(ap->entry->maps->type, "hosts")) {
|
|
- char *tmp = alloca(7);
|
|
- if (tmp) {
|
|
- strcpy(tmp, "-hosts");
|
|
- map_name = (const char *) tmp;
|
|
- }
|
|
- } else
|
|
+ if (!type || strcmp(ap->entry->maps->type, "hosts"))
|
|
map_name = me->mc->map->argv[0];
|
|
|
|
ret = mount(map_name, mountpoint, "autofs", MS_MGC_VAL, mp->options);
|
|
--- autofs-5.0.4.orig/daemon/flag.c
|
|
+++ autofs-5.0.4/daemon/flag.c
|
|
@@ -23,10 +23,10 @@
|
|
#include <sys/stat.h>
|
|
#include <time.h>
|
|
#include <string.h>
|
|
-#include <alloca.h>
|
|
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <errno.h>
|
|
+#include <limits.h>
|
|
|
|
#include "automount.h"
|
|
|
|
@@ -113,12 +113,13 @@ void release_flag_file(void)
|
|
/* * Try to create flag file */
|
|
int aquire_flag_file(void)
|
|
{
|
|
- char *linkf;
|
|
- int len;
|
|
+ char linkf[PATH_MAX];
|
|
+ size_t len;
|
|
|
|
- len = strlen(FLAG_FILE) + MAX_PIDSIZE;
|
|
- linkf = alloca(len + 1);
|
|
- snprintf(linkf, len, "%s.%d", FLAG_FILE, getpid());
|
|
+ len = snprintf(linkf, sizeof(linkf), "%s.%d", FLAG_FILE, getpid());
|
|
+ if (len >= sizeof(linkf))
|
|
+ /* Didn't acquire it */
|
|
+ return 0;
|
|
|
|
/*
|
|
* Repeat until it was us who made the link or we find the
|
|
--- autofs-5.0.4.orig/daemon/indirect.c
|
|
+++ autofs-5.0.4/daemon/indirect.c
|
|
@@ -90,7 +90,9 @@ static int do_mount_autofs_indirect(stru
|
|
struct ioctl_ops *ops = get_ioctl_ops();
|
|
time_t timeout = ap->exp_timeout;
|
|
char *options = NULL;
|
|
- const char *type, *map_name = NULL;
|
|
+ const char *hosts_map_name = "-hosts";
|
|
+ const char *map_name = hosts_map_name;
|
|
+ const char *type;
|
|
struct stat st;
|
|
struct mnt_list *mnts;
|
|
int ret;
|
|
@@ -142,13 +144,7 @@ static int do_mount_autofs_indirect(stru
|
|
}
|
|
|
|
type = ap->entry->maps->type;
|
|
- if (type && !strcmp(ap->entry->maps->type, "hosts")) {
|
|
- char *tmp = alloca(7);
|
|
- if (tmp) {
|
|
- strcpy(tmp, "-hosts");
|
|
- map_name = (const char *) tmp;
|
|
- }
|
|
- } else
|
|
+ if (!type || strcmp(ap->entry->maps->type, "hosts"))
|
|
map_name = ap->entry->maps->argv[0];
|
|
|
|
ret = mount(map_name, root, "autofs", MS_MGC_VAL, options);
|
|
--- autofs-5.0.4.orig/daemon/module.c
|
|
+++ autofs-5.0.4/daemon/module.c
|
|
@@ -58,15 +58,11 @@ struct lookup_mod *open_lookup(const cha
|
|
{
|
|
struct lookup_mod *mod;
|
|
char buf[MAX_ERR_BUF];
|
|
- char *fnbuf;
|
|
- size_t size_name;
|
|
- size_t size_fnbuf;
|
|
+ char fnbuf[PATH_MAX];
|
|
+ size_t size;
|
|
void *dh;
|
|
int *ver;
|
|
|
|
- size_name = _strlen(name, PATH_MAX + 1);
|
|
- if (!size_name)
|
|
- return NULL;
|
|
|
|
mod = malloc(sizeof(struct lookup_mod));
|
|
if (!mod) {
|
|
@@ -77,9 +73,9 @@ struct lookup_mod *open_lookup(const cha
|
|
return NULL;
|
|
}
|
|
|
|
- size_fnbuf = size_name + strlen(AUTOFS_LIB_DIR) + 13;
|
|
- fnbuf = alloca(size_fnbuf);
|
|
- if (!fnbuf) {
|
|
+ size = snprintf(fnbuf, sizeof(fnbuf),
|
|
+ "%s/lookup_%s.so", AUTOFS_LIB_DIR, name);
|
|
+ if (size >= sizeof(fnbuf)) {
|
|
free(mod);
|
|
if (err_prefix) {
|
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
@@ -87,7 +83,6 @@ struct lookup_mod *open_lookup(const cha
|
|
}
|
|
return NULL;
|
|
}
|
|
- snprintf(fnbuf, size_fnbuf, "%s/lookup_%s.so", AUTOFS_LIB_DIR, name);
|
|
|
|
if (!(dh = dlopen(fnbuf, RTLD_NOW))) {
|
|
if (err_prefix)
|
|
@@ -141,15 +136,11 @@ struct parse_mod *open_parse(const char
|
|
{
|
|
struct parse_mod *mod;
|
|
char buf[MAX_ERR_BUF];
|
|
- char *fnbuf;
|
|
- size_t size_name;
|
|
- size_t size_fnbuf;
|
|
+ char fnbuf[PATH_MAX];
|
|
+ size_t size;
|
|
void *dh;
|
|
int *ver;
|
|
|
|
- size_name = _strlen(name, PATH_MAX + 1);
|
|
- if (!size_name)
|
|
- return NULL;
|
|
|
|
mod = malloc(sizeof(struct parse_mod));
|
|
if (!mod) {
|
|
@@ -160,9 +151,9 @@ struct parse_mod *open_parse(const char
|
|
return NULL;
|
|
}
|
|
|
|
- size_fnbuf = size_name + strlen(AUTOFS_LIB_DIR) + 13;
|
|
- fnbuf = alloca(size_fnbuf);
|
|
- if (!fnbuf) {
|
|
+ size = snprintf(fnbuf, sizeof(fnbuf),
|
|
+ "%s/parse_%s.so", AUTOFS_LIB_DIR, name);
|
|
+ if (size >= sizeof(fnbuf)) {
|
|
free(mod);
|
|
if (err_prefix) {
|
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
@@ -170,7 +161,6 @@ struct parse_mod *open_parse(const char
|
|
}
|
|
return NULL;
|
|
}
|
|
- snprintf(fnbuf, size_fnbuf, "%s/parse_%s.so", AUTOFS_LIB_DIR, name);
|
|
|
|
if (!(dh = dlopen(fnbuf, RTLD_NOW))) {
|
|
if (err_prefix)
|
|
@@ -222,15 +212,11 @@ struct mount_mod *open_mount(const char
|
|
{
|
|
struct mount_mod *mod;
|
|
char buf[MAX_ERR_BUF];
|
|
- char *fnbuf;
|
|
- size_t size_name;
|
|
- size_t size_fnbuf;
|
|
+ char fnbuf[PATH_MAX];
|
|
+ size_t size;
|
|
void *dh;
|
|
int *ver;
|
|
|
|
- size_name = _strlen(name, PATH_MAX + 1);
|
|
- if (!size_name)
|
|
- return NULL;
|
|
|
|
mod = malloc(sizeof(struct mount_mod));
|
|
if (!mod) {
|
|
@@ -241,9 +227,9 @@ struct mount_mod *open_mount(const char
|
|
return NULL;
|
|
}
|
|
|
|
- size_fnbuf = size_name + strlen(AUTOFS_LIB_DIR) + 13;
|
|
- fnbuf = alloca(size_fnbuf);
|
|
- if (!fnbuf) {
|
|
+ size = snprintf(fnbuf, sizeof(fnbuf),
|
|
+ "%s/mount_%s.so", AUTOFS_LIB_DIR, name);
|
|
+ if (size >= sizeof(fnbuf)) {
|
|
free(mod);
|
|
if (err_prefix) {
|
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
@@ -251,7 +237,6 @@ struct mount_mod *open_mount(const char
|
|
}
|
|
return NULL;
|
|
}
|
|
- snprintf(fnbuf, size_fnbuf, "%s/mount_%s.so", AUTOFS_LIB_DIR, name);
|
|
|
|
if (!(dh = dlopen(fnbuf, RTLD_NOW))) {
|
|
if (err_prefix)
|
|
--- autofs-5.0.4.orig/lib/cache.c
|
|
+++ autofs-5.0.4/lib/cache.c
|
|
@@ -482,27 +482,23 @@ struct mapent *cache_lookup_offset(const
|
|
{
|
|
struct list_head *p;
|
|
struct mapent *this;
|
|
- int plen = strlen(prefix);
|
|
- char *o_key;
|
|
+ /* Keys for direct maps may be as long as a path name */
|
|
+ char o_key[PATH_MAX];
|
|
+ /* Avoid "//" at the beginning of paths */
|
|
+ const char *path_prefix = strlen(prefix) > 1 ? prefix : "";
|
|
+ size_t size;
|
|
|
|
/* root offset duplicates "/" */
|
|
- if (plen > 1) {
|
|
- o_key = alloca(plen + strlen(offset) + 1);
|
|
- strcpy(o_key, prefix);
|
|
- strcat(o_key, offset);
|
|
- } else {
|
|
- o_key = alloca(strlen(offset) + 1);
|
|
- strcpy(o_key, offset);
|
|
- }
|
|
+ size = snprintf(o_key, sizeof(o_key), "%s%s", path_prefix, offset);
|
|
+ if (size >= sizeof(o_key))
|
|
+ return NULL;
|
|
|
|
list_for_each(p, head) {
|
|
this = list_entry(p, struct mapent, multi_list);
|
|
if (!strcmp(&this->key[start], o_key))
|
|
- goto done;
|
|
+ return this;
|
|
}
|
|
- this = NULL;
|
|
-done:
|
|
- return this;
|
|
+ return NULL;
|
|
}
|
|
|
|
/* cache must be read locked by caller */
|
|
@@ -759,13 +755,8 @@ int cache_delete(struct mapent_cache *mc
|
|
struct mapent *me = NULL, *pred;
|
|
u_int32_t hashval = hash(key, mc->size);
|
|
int status, ret = CHE_OK;
|
|
- char *this;
|
|
+ char this[PATH_MAX];
|
|
|
|
- this = alloca(strlen(key) + 1);
|
|
- if (!this) {
|
|
- ret = CHE_FAIL;
|
|
- goto done;
|
|
- }
|
|
strcpy(this, key);
|
|
|
|
me = mc->hash[hashval];
|
|
--- autofs-5.0.4.orig/lib/cat_path.c
|
|
+++ autofs-5.0.4/lib/cat_path.c
|
|
@@ -12,7 +12,6 @@
|
|
*
|
|
* ----------------------------------------------------------------------- */
|
|
|
|
-#include <alloca.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
#include <ctype.h>
|
|
--- autofs-5.0.4.orig/modules/lookup_file.c
|
|
+++ autofs-5.0.4/modules/lookup_file.c
|
|
@@ -378,8 +378,8 @@ int lookup_read_master(struct master *ma
|
|
unsigned int logopt = master->logopt;
|
|
char *buffer;
|
|
int blen;
|
|
- char *path;
|
|
- char *ent;
|
|
+ char path[KEY_MAX_LEN + 1];
|
|
+ char ent[MAPENT_MAX_LEN + 1];
|
|
FILE *f;
|
|
unsigned int path_len, ent_len;
|
|
int entry, cur_state;
|
|
@@ -393,20 +393,6 @@ int lookup_read_master(struct master *ma
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
|
|
- path = alloca(KEY_MAX_LEN + 1);
|
|
- if (!path) {
|
|
- error(logopt,
|
|
- MODPREFIX "could not malloc storage for path");
|
|
- return NSS_STATUS_UNAVAIL;
|
|
- }
|
|
-
|
|
- ent = alloca(MAPENT_MAX_LEN + 1);
|
|
- if (!ent) {
|
|
- error(logopt,
|
|
- MODPREFIX "could not malloc storage for mapent");
|
|
- return NSS_STATUS_UNAVAIL;
|
|
- }
|
|
-
|
|
f = open_fopen_r(ctxt->mapname);
|
|
if (!f) {
|
|
error(logopt,
|
|
@@ -618,8 +604,8 @@ int lookup_read_map(struct autofs_point
|
|
struct lookup_context *ctxt = (struct lookup_context *) context;
|
|
struct map_source *source;
|
|
struct mapent_cache *mc;
|
|
- char *key;
|
|
- char *mapent;
|
|
+ char key[KEY_MAX_LEN + 1];
|
|
+ char mapent[MAPENT_MAX_LEN + 1];
|
|
FILE *f;
|
|
unsigned int k_len, m_len;
|
|
int entry;
|
|
@@ -639,20 +625,6 @@ int lookup_read_map(struct autofs_point
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
|
|
- key = alloca(KEY_MAX_LEN + 1);
|
|
- if (!key) {
|
|
- error(ap->logopt,
|
|
- MODPREFIX "could not malloc storage for key");
|
|
- return NSS_STATUS_UNAVAIL;
|
|
- }
|
|
-
|
|
- mapent = alloca(MAPENT_MAX_LEN + 1);
|
|
- if (!mapent) {
|
|
- error(ap->logopt,
|
|
- MODPREFIX "could not malloc storage for mapent");
|
|
- return NSS_STATUS_UNAVAIL;
|
|
- }
|
|
-
|
|
f = open_fopen_r(ctxt->mapname);
|
|
if (!f) {
|
|
error(ap->logopt,
|
|
@@ -972,7 +944,7 @@ int lookup_mount(struct autofs_point *ap
|
|
char key[KEY_MAX_LEN + 1];
|
|
int key_len;
|
|
char *mapent = NULL;
|
|
- int mapent_len;
|
|
+ char mapent_buf[MAPENT_MAX_LEN + 1];
|
|
int status = 0;
|
|
int ret = 1;
|
|
|
|
@@ -1076,38 +1048,36 @@ do_cache_lookup:
|
|
}
|
|
if (me && (me->source == source || *me->key == '/')) {
|
|
pthread_cleanup_push(cache_lock_cleanup, mc);
|
|
- mapent_len = strlen(me->mapent);
|
|
- mapent = alloca(mapent_len + 1);
|
|
- strcpy(mapent, me->mapent);
|
|
+ strcpy(mapent_buf, me->mapent);
|
|
+ mapent = mapent_buf;
|
|
pthread_cleanup_pop(0);
|
|
}
|
|
cache_unlock(mc);
|
|
|
|
- if (mapent) {
|
|
- master_source_current_wait(ap->entry);
|
|
- ap->entry->current = source;
|
|
+ if (!mapent)
|
|
+ return NSS_STATUS_TRYAGAIN;
|
|
|
|
- debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent);
|
|
- ret = ctxt->parse->parse_mount(ap, key, key_len,
|
|
- mapent, ctxt->parse->context);
|
|
- if (ret) {
|
|
- time_t now = time(NULL);
|
|
- int rv = CHE_OK;
|
|
+ master_source_current_wait(ap->entry);
|
|
+ ap->entry->current = source;
|
|
|
|
- cache_writelock(mc);
|
|
+ debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent);
|
|
+ ret = ctxt->parse->parse_mount(ap, key, key_len,
|
|
+ mapent, ctxt->parse->context);
|
|
+ if (ret) {
|
|
+ time_t now = time(NULL);
|
|
+ int rv = CHE_OK;
|
|
+
|
|
+ cache_writelock(mc);
|
|
+ me = cache_lookup_distinct(mc, key);
|
|
+ if (!me)
|
|
+ rv = cache_update(mc, source, key, NULL, now);
|
|
+ if (rv != CHE_FAIL) {
|
|
me = cache_lookup_distinct(mc, key);
|
|
- if (!me)
|
|
- rv = cache_update(mc, source, key, NULL, now);
|
|
- if (rv != CHE_FAIL) {
|
|
- me = cache_lookup_distinct(mc, key);
|
|
- me->status = now + ap->negative_timeout;
|
|
- }
|
|
- cache_unlock(mc);
|
|
+ me->status = now + ap->negative_timeout;
|
|
}
|
|
- }
|
|
-
|
|
- if (ret)
|
|
+ cache_unlock(mc);
|
|
return NSS_STATUS_TRYAGAIN;
|
|
+ }
|
|
|
|
return NSS_STATUS_SUCCESS;
|
|
}
|
|
--- autofs-5.0.4.orig/modules/lookup_ldap.c
|
|
+++ autofs-5.0.4/modules/lookup_ldap.c
|
|
@@ -294,10 +294,10 @@ static int get_query_dn(unsigned logopt,
|
|
if (ctxt->mapname)
|
|
l += strlen(key) + strlen(ctxt->mapname) + strlen("(&(=))");
|
|
|
|
- query = alloca(l);
|
|
+ query = malloc(l);
|
|
if (query == NULL) {
|
|
char *estr = strerror_r(errno, buf, sizeof(buf));
|
|
- crit(logopt, MODPREFIX "alloca: %s", estr);
|
|
+ crit(logopt, MODPREFIX "malloc: %s", estr);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
|
|
@@ -310,6 +310,7 @@ static int get_query_dn(unsigned logopt,
|
|
key, (int) strlen(ctxt->mapname), ctxt->mapname) >= l) {
|
|
debug(logopt,
|
|
MODPREFIX "error forming query string");
|
|
+ free(query);
|
|
return 0;
|
|
}
|
|
scope = LDAP_SCOPE_SUBTREE;
|
|
@@ -317,6 +318,7 @@ static int get_query_dn(unsigned logopt,
|
|
if (sprintf(query, "(objectclass=%s)", class) >= l) {
|
|
debug(logopt,
|
|
MODPREFIX "error forming query string");
|
|
+ free(query);
|
|
return 0;
|
|
}
|
|
scope = LDAP_SCOPE_SUBTREE;
|
|
@@ -340,6 +342,7 @@ static int get_query_dn(unsigned logopt,
|
|
error(logopt,
|
|
MODPREFIX "query failed for %s: %s",
|
|
query, ldap_err2string(rv));
|
|
+ free(query);
|
|
return 0;
|
|
}
|
|
|
|
@@ -353,6 +356,7 @@ static int get_query_dn(unsigned logopt,
|
|
MODPREFIX "query succeeded, no matches for %s",
|
|
query);
|
|
ldap_msgfree(result);
|
|
+ free(query);
|
|
return 0;
|
|
}
|
|
} else {
|
|
@@ -395,10 +399,12 @@ static int get_query_dn(unsigned logopt,
|
|
ldap_msgfree(result);
|
|
error(logopt,
|
|
MODPREFIX "failed to find query dn under search base dns");
|
|
+ free(query);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+ free(query);
|
|
qdn = strdup(dn);
|
|
ldap_memfree(dn);
|
|
ldap_msgfree(result);
|
|
@@ -1181,7 +1187,7 @@ static int parse_server_string(unsigned
|
|
else {
|
|
char *estr;
|
|
estr = strerror_r(errno, buf, sizeof(buf));
|
|
- logerr(MODPREFIX "malloc: %s", estr);
|
|
+ logerr(MODPREFIX "strdup: %s", estr);
|
|
if (ctxt->server)
|
|
free(ctxt->server);
|
|
return 0;
|
|
@@ -1441,23 +1447,26 @@ int lookup_read_master(struct master *ma
|
|
|
|
l = strlen("(objectclass=)") + strlen(class) + 1;
|
|
|
|
- query = alloca(l);
|
|
+ query = malloc(l);
|
|
if (query == NULL) {
|
|
char *estr = strerror_r(errno, buf, sizeof(buf));
|
|
- logerr(MODPREFIX "alloca: %s", estr);
|
|
+ logerr(MODPREFIX "malloc: %s", estr);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
|
|
if (sprintf(query, "(objectclass=%s)", class) >= l) {
|
|
error(logopt, MODPREFIX "error forming query string");
|
|
+ free(query);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
query[l] = '\0';
|
|
|
|
/* Initialize the LDAP context. */
|
|
ldap = do_reconnect(logopt, ctxt);
|
|
- if (!ldap)
|
|
+ if (!ldap) {
|
|
+ free(query);
|
|
return NSS_STATUS_UNAVAIL;
|
|
+ }
|
|
|
|
/* Look around. */
|
|
debug(logopt,
|
|
@@ -1469,6 +1478,7 @@ int lookup_read_master(struct master *ma
|
|
error(logopt, MODPREFIX "query failed for %s: %s",
|
|
query, ldap_err2string(rv));
|
|
unbind_ldap_connection(logging, ldap, ctxt);
|
|
+ free(query);
|
|
return NSS_STATUS_NOTFOUND;
|
|
}
|
|
|
|
@@ -1479,6 +1489,7 @@ int lookup_read_master(struct master *ma
|
|
query);
|
|
ldap_msgfree(result);
|
|
unbind_ldap_connection(logging, ldap, ctxt);
|
|
+ free(query);
|
|
return NSS_STATUS_NOTFOUND;
|
|
} else
|
|
debug(logopt, MODPREFIX "examining entries");
|
|
@@ -1548,6 +1559,7 @@ next:
|
|
/* Clean up. */
|
|
ldap_msgfree(result);
|
|
unbind_ldap_connection(logopt, ldap, ctxt);
|
|
+ free(query);
|
|
|
|
return NSS_STATUS_SUCCESS;
|
|
}
|
|
@@ -2174,7 +2186,7 @@ static int read_one_map(struct autofs_po
|
|
/* Build a query string. */
|
|
l = strlen("(objectclass=)") + strlen(class) + 1;
|
|
|
|
- sp.query = alloca(l);
|
|
+ sp.query = malloc(l);
|
|
if (sp.query == NULL) {
|
|
char *estr = strerror_r(errno, buf, sizeof(buf));
|
|
logerr(MODPREFIX "malloc: %s", estr);
|
|
@@ -2183,14 +2195,17 @@ static int read_one_map(struct autofs_po
|
|
|
|
if (sprintf(sp.query, "(objectclass=%s)", class) >= l) {
|
|
error(ap->logopt, MODPREFIX "error forming query string");
|
|
+ free(sp.query);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
sp.query[l] = '\0';
|
|
|
|
/* Initialize the LDAP context. */
|
|
sp.ldap = do_reconnect(ap->logopt, ctxt);
|
|
- if (!sp.ldap)
|
|
+ if (!sp.ldap) {
|
|
+ free(sp.query);
|
|
return NSS_STATUS_UNAVAIL;
|
|
+ }
|
|
|
|
/* Look around. */
|
|
debug(ap->logopt,
|
|
@@ -2215,6 +2230,7 @@ static int read_one_map(struct autofs_po
|
|
if (rv != LDAP_SUCCESS || !sp.result) {
|
|
unbind_ldap_connection(ap->logopt, sp.ldap, ctxt);
|
|
*result_ldap = rv;
|
|
+ free(sp.query);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
|
|
@@ -2223,6 +2239,7 @@ static int read_one_map(struct autofs_po
|
|
ldap_msgfree(sp.result);
|
|
unbind_ldap_connection(ap->logopt, sp.ldap, ctxt);
|
|
*result_ldap = rv;
|
|
+ free(sp.query);
|
|
return NSS_STATUS_NOTFOUND;
|
|
}
|
|
ldap_msgfree(sp.result);
|
|
@@ -2233,6 +2250,7 @@ static int read_one_map(struct autofs_po
|
|
unbind_ldap_connection(ap->logopt, sp.ldap, ctxt);
|
|
|
|
source->age = age;
|
|
+ free(sp.query);
|
|
|
|
return NSS_STATUS_SUCCESS;
|
|
}
|
|
@@ -2328,7 +2346,7 @@ static int lookup_one(struct autofs_poin
|
|
if (enc_len1)
|
|
l += 2*strlen(entry) + enc_len1 + enc_len2 + 6;
|
|
|
|
- query = alloca(l);
|
|
+ query = malloc(l);
|
|
if (query == NULL) {
|
|
char *estr = strerror_r(errno, buf, sizeof(buf));
|
|
crit(ap->logopt, MODPREFIX "malloc: %s", estr);
|
|
@@ -2336,6 +2354,7 @@ static int lookup_one(struct autofs_poin
|
|
free(enc_key1);
|
|
free(enc_key2);
|
|
}
|
|
+ free(query);
|
|
return CHE_FAIL;
|
|
}
|
|
|
|
@@ -2367,14 +2386,17 @@ static int lookup_one(struct autofs_poin
|
|
if (ql >= l) {
|
|
error(ap->logopt,
|
|
MODPREFIX "error forming query string");
|
|
+ free(query);
|
|
return CHE_FAIL;
|
|
}
|
|
query[ql] = '\0';
|
|
|
|
/* Initialize the LDAP context. */
|
|
ldap = do_reconnect(ap->logopt, ctxt);
|
|
- if (!ldap)
|
|
+ if (!ldap) {
|
|
+ free(query);
|
|
return CHE_UNAVAIL;
|
|
+ }
|
|
|
|
debug(ap->logopt,
|
|
MODPREFIX "searching for \"%s\" under \"%s\"", query, ctxt->qdn);
|
|
@@ -2384,6 +2406,7 @@ static int lookup_one(struct autofs_poin
|
|
if ((rv != LDAP_SUCCESS) || !result) {
|
|
crit(ap->logopt, MODPREFIX "query failed for %s", query);
|
|
unbind_ldap_connection(ap->logopt, ldap, ctxt);
|
|
+ free(query);
|
|
return CHE_FAIL;
|
|
}
|
|
|
|
@@ -2396,6 +2419,7 @@ static int lookup_one(struct autofs_poin
|
|
MODPREFIX "got answer, but no entry for %s", query);
|
|
ldap_msgfree(result);
|
|
unbind_ldap_connection(ap->logopt, ldap, ctxt);
|
|
+ free(query);
|
|
return CHE_MISSING;
|
|
}
|
|
|
|
@@ -2610,6 +2634,7 @@ next:
|
|
}
|
|
}
|
|
pthread_cleanup_pop(1);
|
|
+ free(query);
|
|
|
|
return ret;
|
|
}
|
|
@@ -2696,7 +2721,7 @@ int lookup_mount(struct autofs_point *ap
|
|
char key[KEY_MAX_LEN + 1];
|
|
int key_len;
|
|
char *mapent = NULL;
|
|
- int mapent_len;
|
|
+ char mapent_buf[MAPENT_MAX_LEN + 1];
|
|
int status = 0;
|
|
int ret = 1;
|
|
|
|
@@ -2766,38 +2791,36 @@ int lookup_mount(struct autofs_point *ap
|
|
me = cache_lookup_distinct(mc, "*");
|
|
}
|
|
if (me && (me->source == source || *me->key == '/')) {
|
|
- mapent_len = strlen(me->mapent);
|
|
- mapent = alloca(mapent_len + 1);
|
|
- strcpy(mapent, me->mapent);
|
|
+ strcpy(mapent_buf, me->mapent);
|
|
+ mapent = mapent_buf;
|
|
}
|
|
cache_unlock(mc);
|
|
|
|
- if (mapent) {
|
|
- master_source_current_wait(ap->entry);
|
|
- ap->entry->current = source;
|
|
+ if (!mapent)
|
|
+ return NSS_STATUS_TRYAGAIN;
|
|
|
|
- debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent);
|
|
- ret = ctxt->parse->parse_mount(ap, key, key_len,
|
|
- mapent, ctxt->parse->context);
|
|
- if (ret) {
|
|
- time_t now = time(NULL);
|
|
- int rv = CHE_OK;
|
|
+ master_source_current_wait(ap->entry);
|
|
+ ap->entry->current = source;
|
|
|
|
- /* Record the the mount fail in the cache */
|
|
- cache_writelock(mc);
|
|
+ debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent);
|
|
+ ret = ctxt->parse->parse_mount(ap, key, key_len,
|
|
+ mapent, ctxt->parse->context);
|
|
+ if (ret) {
|
|
+ time_t now = time(NULL);
|
|
+ int rv = CHE_OK;
|
|
+
|
|
+ /* Record the the mount fail in the cache */
|
|
+ cache_writelock(mc);
|
|
+ me = cache_lookup_distinct(mc, key);
|
|
+ if (!me)
|
|
+ rv = cache_update(mc, source, key, NULL, now);
|
|
+ if (rv != CHE_FAIL) {
|
|
me = cache_lookup_distinct(mc, key);
|
|
- if (!me)
|
|
- rv = cache_update(mc, source, key, NULL, now);
|
|
- if (rv != CHE_FAIL) {
|
|
- me = cache_lookup_distinct(mc, key);
|
|
- me->status = now + ap->negative_timeout;
|
|
- }
|
|
- cache_unlock(mc);
|
|
+ me->status = now + ap->negative_timeout;
|
|
}
|
|
- }
|
|
-
|
|
- if (ret)
|
|
+ cache_unlock(mc);
|
|
return NSS_STATUS_TRYAGAIN;
|
|
+ }
|
|
|
|
return NSS_STATUS_SUCCESS;
|
|
}
|
|
--- autofs-5.0.4.orig/modules/lookup_nisplus.c
|
|
+++ autofs-5.0.4/modules/lookup_nisplus.c
|
|
@@ -92,10 +92,10 @@ int lookup_read_master(struct master *ma
|
|
int cur_state, len;
|
|
|
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
|
- tablename = alloca(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20);
|
|
+ tablename = malloc(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20);
|
|
if (!tablename) {
|
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
- logerr(MODPREFIX "alloca: %s", estr);
|
|
+ logerr(MODPREFIX "malloc: %s", estr);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
@@ -107,6 +107,7 @@ int lookup_read_master(struct master *ma
|
|
nis_freeresult(result);
|
|
crit(logopt,
|
|
MODPREFIX "couldn't locate nis+ table %s", ctxt->mapname);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return NSS_STATUS_NOTFOUND;
|
|
}
|
|
@@ -118,6 +119,7 @@ int lookup_read_master(struct master *ma
|
|
nis_freeresult(result);
|
|
crit(logopt,
|
|
MODPREFIX "couldn't enumrate nis+ map %s", ctxt->mapname);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
@@ -155,6 +157,7 @@ int lookup_read_master(struct master *ma
|
|
}
|
|
|
|
nis_freeresult(result);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
|
|
return NSS_STATUS_SUCCESS;
|
|
@@ -180,10 +183,10 @@ int lookup_read_map(struct autofs_point
|
|
mc = source->mc;
|
|
|
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
|
- tablename = alloca(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20);
|
|
+ tablename = malloc(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20);
|
|
if (!tablename) {
|
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
- logerr(MODPREFIX "alloca: %s", estr);
|
|
+ logerr(MODPREFIX "malloc: %s", estr);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
@@ -195,6 +198,7 @@ int lookup_read_map(struct autofs_point
|
|
nis_freeresult(result);
|
|
crit(ap->logopt,
|
|
MODPREFIX "couldn't locate nis+ table %s", ctxt->mapname);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return NSS_STATUS_NOTFOUND;
|
|
}
|
|
@@ -206,6 +210,7 @@ int lookup_read_map(struct autofs_point
|
|
nis_freeresult(result);
|
|
crit(ap->logopt,
|
|
MODPREFIX "couldn't enumrate nis+ map %s", ctxt->mapname);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return NSS_STATUS_UNAVAIL;
|
|
}
|
|
@@ -245,6 +250,7 @@ int lookup_read_map(struct autofs_point
|
|
|
|
source->age = age;
|
|
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
|
|
return NSS_STATUS_SUCCESS;
|
|
@@ -271,11 +277,11 @@ static int lookup_one(struct autofs_poin
|
|
mc = source->mc;
|
|
|
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
|
- tablename = alloca(strlen(key) +
|
|
- strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20);
|
|
+ tablename = malloc(strlen(key) + strlen(ctxt->mapname) +
|
|
+ strlen(ctxt->domainname) + 20);
|
|
if (!tablename) {
|
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
- logerr(MODPREFIX "alloca: %s", estr);
|
|
+ logerr(MODPREFIX "malloc: %s", estr);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return -1;
|
|
}
|
|
@@ -286,6 +292,7 @@ static int lookup_one(struct autofs_poin
|
|
if (result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) {
|
|
nis_error rs = result->status;
|
|
nis_freeresult(result);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
if (rs == NIS_NOTFOUND ||
|
|
rs == NIS_S_NOTFOUND ||
|
|
@@ -303,6 +310,7 @@ static int lookup_one(struct autofs_poin
|
|
cache_unlock(mc);
|
|
|
|
nis_freeresult(result);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
|
|
return ret;
|
|
@@ -327,10 +335,10 @@ static int lookup_wild(struct autofs_poi
|
|
mc = source->mc;
|
|
|
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
|
- tablename = alloca(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20);
|
|
+ tablename = malloc(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20);
|
|
if (!tablename) {
|
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
- logerr(MODPREFIX "alloca: %s", estr);
|
|
+ logerr(MODPREFIX "malloc: %s", estr);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
return -1;
|
|
}
|
|
@@ -341,6 +349,7 @@ static int lookup_wild(struct autofs_poi
|
|
if (result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) {
|
|
nis_error rs = result->status;
|
|
nis_freeresult(result);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
if (rs == NIS_NOTFOUND ||
|
|
rs == NIS_S_NOTFOUND ||
|
|
@@ -357,6 +366,7 @@ static int lookup_wild(struct autofs_poi
|
|
cache_unlock(mc);
|
|
|
|
nis_freeresult(result);
|
|
+ free(tablename);
|
|
pthread_setcancelstate(cur_state, NULL);
|
|
|
|
return ret;
|
|
@@ -546,36 +556,37 @@ int lookup_mount(struct autofs_point *ap
|
|
}
|
|
if (me && (me->source == source || *me->key == '/')) {
|
|
mapent_len = strlen(me->mapent);
|
|
- mapent = alloca(mapent_len + 1);
|
|
+ mapent = malloc(mapent_len + 1);
|
|
strcpy(mapent, me->mapent);
|
|
}
|
|
cache_unlock(mc);
|
|
|
|
- if (mapent) {
|
|
- master_source_current_wait(ap->entry);
|
|
- ap->entry->current = source;
|
|
+ if (!mapent)
|
|
+ return NSS_STATUS_TRYAGAIN;
|
|
|
|
- debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent);
|
|
- ret = ctxt->parse->parse_mount(ap, key, key_len,
|
|
- mapent, ctxt->parse->context);
|
|
- if (ret) {
|
|
- time_t now = time(NULL);
|
|
- int rv = CHE_OK;
|
|
+ master_source_current_wait(ap->entry);
|
|
+ ap->entry->current = source;
|
|
+
|
|
+ debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent);
|
|
+ ret = ctxt->parse->parse_mount(ap, key, key_len,
|
|
+ mapent, ctxt->parse->context);
|
|
+ if (ret) {
|
|
+ time_t now = time(NULL);
|
|
+ int rv = CHE_OK;
|
|
|
|
- cache_writelock(mc);
|
|
+ cache_writelock(mc);
|
|
+ me = cache_lookup_distinct(mc, key);
|
|
+ if (!me)
|
|
+ rv = cache_update(mc, source, key, NULL, now);
|
|
+ if (rv != CHE_FAIL) {
|
|
me = cache_lookup_distinct(mc, key);
|
|
- if (!me)
|
|
- rv = cache_update(mc, source, key, NULL, now);
|
|
- if (rv != CHE_FAIL) {
|
|
- me = cache_lookup_distinct(mc, key);
|
|
- me->status = time(NULL) + ap->negative_timeout;
|
|
- }
|
|
- cache_unlock(mc);
|
|
+ me->status = time(NULL) + ap->negative_timeout;
|
|
}
|
|
- }
|
|
-
|
|
- if (ret)
|
|
+ cache_unlock(mc);
|
|
+ free(mapent);
|
|
return NSS_STATUS_TRYAGAIN;
|
|
+ }
|
|
+ free(mapent);
|
|
|
|
return NSS_STATUS_SUCCESS;
|
|
}
|
|
--- autofs-5.0.4.orig/modules/mount_autofs.c
|
|
+++ autofs-5.0.4/modules/mount_autofs.c
|
|
@@ -18,7 +18,6 @@
|
|
#include <malloc.h>
|
|
#include <string.h>
|
|
#include <signal.h>
|
|
-#include <alloca.h>
|
|
#include <sys/param.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
--- autofs-5.0.4.orig/modules/mount_bind.c
|
|
+++ autofs-5.0.4/modules/mount_bind.c
|
|
@@ -69,7 +69,7 @@ out:
|
|
int mount_mount(struct autofs_point *ap, const char *root, const char *name, int name_len,
|
|
const char *what, const char *fstype, const char *options, void *context)
|
|
{
|
|
- char *fullpath;
|
|
+ char fullpath[PATH_MAX];
|
|
char buf[MAX_ERR_BUF];
|
|
int err;
|
|
int i, len;
|
|
@@ -80,14 +80,11 @@ int mount_mount(struct autofs_point *ap,
|
|
/* Root offset of multi-mount */
|
|
len = strlen(root);
|
|
if (root[len - 1] == '/') {
|
|
- fullpath = alloca(len);
|
|
len = snprintf(fullpath, len, "%s", root);
|
|
/* Direct mount name is absolute path so don't use root */
|
|
} else if (*name == '/') {
|
|
- fullpath = alloca(len + 1);
|
|
len = sprintf(fullpath, "%s", root);
|
|
} else {
|
|
- fullpath = alloca(len + name_len + 2);
|
|
len = sprintf(fullpath, "%s/%s", root, name);
|
|
}
|
|
fullpath[len] = '\0';
|
|
@@ -141,7 +138,7 @@ int mount_mount(struct autofs_point *ap,
|
|
}
|
|
} else {
|
|
char *cp;
|
|
- char *basepath = alloca(strlen(fullpath) + 1);
|
|
+ char basepath[PATH_MAX];
|
|
int status;
|
|
struct stat st;
|
|
|
|
--- autofs-5.0.4.orig/modules/mount_changer.c
|
|
+++ autofs-5.0.4/modules/mount_changer.c
|
|
@@ -44,7 +44,7 @@ int mount_init(void **context)
|
|
int mount_mount(struct autofs_point *ap, const char *root, const char *name, int name_len,
|
|
const char *what, const char *fstype, const char *options, void *context)
|
|
{
|
|
- char *fullpath;
|
|
+ char fullpath[PATH_MAX];
|
|
char buf[MAX_ERR_BUF];
|
|
int err;
|
|
int len, status, existed = 1;
|
|
@@ -57,14 +57,11 @@ int mount_mount(struct autofs_point *ap,
|
|
/* Root offset of multi-mount */
|
|
len = strlen(root);
|
|
if (root[len - 1] == '/') {
|
|
- fullpath = alloca(len);
|
|
len = snprintf(fullpath, len, "%s", root);
|
|
/* Direct mount name is absolute path so don't use root */
|
|
} else if (*name == '/') {
|
|
- fullpath = alloca(len + 1);
|
|
len = sprintf(fullpath, "%s", root);
|
|
} else {
|
|
- fullpath = alloca(len + name_len + 2);
|
|
len = sprintf(fullpath, "%s/%s", root, name);
|
|
}
|
|
fullpath[len] = '\0';
|
|
--- autofs-5.0.4.orig/modules/mount_ext2.c
|
|
+++ autofs-5.0.4/modules/mount_ext2.c
|
|
@@ -36,7 +36,7 @@ int mount_init(void **context)
|
|
int mount_mount(struct autofs_point *ap, const char *root, const char *name, int name_len,
|
|
const char *what, const char *fstype, const char *options, void *context)
|
|
{
|
|
- char *fullpath;
|
|
+ char fullpath[PATH_MAX];
|
|
char buf[MAX_ERR_BUF];
|
|
const char *p, *p1;
|
|
int err, ro = 0;
|
|
@@ -49,14 +49,11 @@ int mount_mount(struct autofs_point *ap,
|
|
/* Root offset of multi-mount */
|
|
len = strlen(root);
|
|
if (root[len - 1] == '/') {
|
|
- fullpath = alloca(len);
|
|
len = snprintf(fullpath, len, "%s", root);
|
|
/* Direct mount name is absolute path so don't use root */
|
|
} else if (*name == '/') {
|
|
- fullpath = alloca(len + 1);
|
|
len = sprintf(fullpath, "%s", root);
|
|
} else {
|
|
- fullpath = alloca(len + name_len + 2);
|
|
len = sprintf(fullpath, "%s/%s", root, name);
|
|
}
|
|
fullpath[len] = '\0';
|
|
--- autofs-5.0.4.orig/modules/mount_generic.c
|
|
+++ autofs-5.0.4/modules/mount_generic.c
|
|
@@ -37,7 +37,7 @@ int mount_mount(struct autofs_point *ap,
|
|
const char *what, const char *fstype, const char *options,
|
|
void *context)
|
|
{
|
|
- char *fullpath;
|
|
+ char fullpath[PATH_MAX];
|
|
char buf[MAX_ERR_BUF];
|
|
int err;
|
|
int len, status, existed = 1;
|
|
@@ -48,14 +48,11 @@ int mount_mount(struct autofs_point *ap,
|
|
/* Root offset of multi-mount */
|
|
len = strlen(root);
|
|
if (root[len - 1] == '/') {
|
|
- fullpath = alloca(len);
|
|
len = snprintf(fullpath, len, "%s", root);
|
|
/* Direct mount name is absolute path so don't use root */
|
|
} else if (*name == '/') {
|
|
- fullpath = alloca(len + 1);
|
|
len = sprintf(fullpath, "%s", root);
|
|
} else {
|
|
- fullpath = alloca(len + name_len + 2);
|
|
len = sprintf(fullpath, "%s/%s", root, name);
|
|
}
|
|
fullpath[len] = '\0';
|
|
--- autofs-5.0.4.orig/CHANGELOG
|
|
+++ autofs-5.0.4/CHANGELOG
|
|
@@ -16,6 +16,7 @@
|
|
use of 5.0.3 strartup behavior if required.
|
|
- always read entire file map into cache to speed lookups.
|
|
- make MAX_ERR_BUF and PARSE_MAX_BUF use easier to audit.
|
|
+- make some easy alloca replacements (Valerie Aurora Henson).
|
|
|
|
4/11/2008 autofs-5.0.4
|
|
-----------------------
|