- fix segv during library re-open.
- fix incorrect pthreads condition handling for expire requests. - fix master map lexer eval order. - fix bad alloca usage.
This commit is contained in:
parent
d55e640fa8
commit
ea444dc7d4
179
autofs-5.0.3-expire-thread-create-cond-handling.patch
Normal file
179
autofs-5.0.3-expire-thread-create-cond-handling.patch
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
autofs-5.0.3 - fix incorrect pthreads condition handling for expire requests.
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Occassionally, when starting an expire thread we can attempt to use the
|
||||||
|
structure for parameter communication after it has been freed. This patch
|
||||||
|
resolves this issue.
|
||||||
|
---
|
||||||
|
|
||||||
|
daemon/direct.c | 40 +++++++++++++++++++++-------------------
|
||||||
|
daemon/indirect.c | 28 +++++++++++++++-------------
|
||||||
|
2 files changed, 36 insertions(+), 32 deletions(-)
|
||||||
|
|
||||||
|
|
||||||
|
--- autofs-5.0.3.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.0.3/daemon/direct.c
|
||||||
|
@@ -1033,55 +1033,53 @@ static void expire_mutex_unlock(void *ar
|
||||||
|
|
||||||
|
static void *do_expire_direct(void *arg)
|
||||||
|
{
|
||||||
|
- struct pending_args *mt;
|
||||||
|
+ struct pending_args *args, mt;
|
||||||
|
struct autofs_point *ap;
|
||||||
|
size_t len;
|
||||||
|
int status, state;
|
||||||
|
|
||||||
|
- mt = (struct pending_args *) arg;
|
||||||
|
+ args = (struct pending_args *) arg;
|
||||||
|
|
||||||
|
status = pthread_mutex_lock(&ea_mutex);
|
||||||
|
if (status)
|
||||||
|
fatal(status);
|
||||||
|
|
||||||
|
- ap = mt->ap;
|
||||||
|
+ memcpy(&mt, args, sizeof(struct pending_args));
|
||||||
|
+
|
||||||
|
+ ap = mt.ap;
|
||||||
|
|
||||||
|
- mt->signaled = 1;
|
||||||
|
- status = pthread_cond_signal(&mt->cond);
|
||||||
|
+ args->signaled = 1;
|
||||||
|
+ status = pthread_cond_signal(&args->cond);
|
||||||
|
if (status)
|
||||||
|
fatal(status);
|
||||||
|
|
||||||
|
expire_mutex_unlock(NULL);
|
||||||
|
|
||||||
|
- pthread_cleanup_push(free_pending_args, mt);
|
||||||
|
- pthread_cleanup_push(pending_cond_destroy, mt);
|
||||||
|
- pthread_cleanup_push(expire_send_fail, mt);
|
||||||
|
+ pthread_cleanup_push(expire_send_fail, &mt);
|
||||||
|
|
||||||
|
- len = _strlen(mt->name, KEY_MAX_LEN);
|
||||||
|
+ len = _strlen(mt.name, KEY_MAX_LEN);
|
||||||
|
if (!len) {
|
||||||
|
- warn(ap->logopt, "direct key path too long %s", mt->name);
|
||||||
|
+ warn(ap->logopt, "direct key path too long %s", mt.name);
|
||||||
|
/* TODO: force umount ?? */
|
||||||
|
pthread_exit(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
- status = do_expire(ap, mt->name, len);
|
||||||
|
+ status = do_expire(ap, mt.name, len);
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state);
|
||||||
|
if (status)
|
||||||
|
- send_fail(ap->logopt, mt->ioctlfd, mt->wait_queue_token);
|
||||||
|
+ send_fail(ap->logopt, mt.ioctlfd, mt.wait_queue_token);
|
||||||
|
else {
|
||||||
|
struct mapent *me;
|
||||||
|
- cache_readlock(mt->mc);
|
||||||
|
- me = cache_lookup_distinct(mt->mc, mt->name);
|
||||||
|
+ cache_readlock(mt.mc);
|
||||||
|
+ me = cache_lookup_distinct(mt.mc, mt.name);
|
||||||
|
me->ioctlfd = -1;
|
||||||
|
- cache_unlock(mt->mc);
|
||||||
|
- send_ready(ap->logopt, mt->ioctlfd, mt->wait_queue_token);
|
||||||
|
- close(mt->ioctlfd);
|
||||||
|
+ cache_unlock(mt.mc);
|
||||||
|
+ send_ready(ap->logopt, mt.ioctlfd, mt.wait_queue_token);
|
||||||
|
+ close(mt.ioctlfd);
|
||||||
|
}
|
||||||
|
pthread_setcancelstate(state, NULL);
|
||||||
|
|
||||||
|
pthread_cleanup_pop(0);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@@ -1198,6 +1196,8 @@ int handle_packet_expire_direct(struct a
|
||||||
|
cache_unlock(mc);
|
||||||
|
master_source_unlock(ap->entry);
|
||||||
|
|
||||||
|
+ pthread_cleanup_push(free_pending_args, mt);
|
||||||
|
+ pthread_cleanup_push(pending_cond_destroy, mt);
|
||||||
|
pthread_cleanup_push(expire_mutex_unlock, NULL);
|
||||||
|
pthread_setcancelstate(state, NULL);
|
||||||
|
|
||||||
|
@@ -1212,6 +1212,8 @@ int handle_packet_expire_direct(struct a
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
+ pthread_cleanup_pop(1);
|
||||||
|
+ pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--- autofs-5.0.3.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.0.3/daemon/indirect.c
|
||||||
|
@@ -596,40 +596,38 @@ static void expire_mutex_unlock(void *ar
|
||||||
|
|
||||||
|
static void *do_expire_indirect(void *arg)
|
||||||
|
{
|
||||||
|
- struct pending_args *mt;
|
||||||
|
+ struct pending_args *args, mt;
|
||||||
|
struct autofs_point *ap;
|
||||||
|
int status, state;
|
||||||
|
|
||||||
|
- mt = (struct pending_args *) arg;
|
||||||
|
+ args = (struct pending_args *) arg;
|
||||||
|
|
||||||
|
status = pthread_mutex_lock(&ea_mutex);
|
||||||
|
if (status)
|
||||||
|
fatal(status);
|
||||||
|
|
||||||
|
- ap = mt->ap;
|
||||||
|
+ memcpy(&mt, args, sizeof(struct pending_args));
|
||||||
|
|
||||||
|
- mt->signaled = 1;
|
||||||
|
- status = pthread_cond_signal(&mt->cond);
|
||||||
|
+ ap = mt.ap;
|
||||||
|
+
|
||||||
|
+ args->signaled = 1;
|
||||||
|
+ status = pthread_cond_signal(&args->cond);
|
||||||
|
if (status)
|
||||||
|
fatal(status);
|
||||||
|
|
||||||
|
expire_mutex_unlock(NULL);
|
||||||
|
|
||||||
|
- pthread_cleanup_push(free_pending_args, mt);
|
||||||
|
- pthread_cleanup_push(pending_cond_destroy, mt);
|
||||||
|
- pthread_cleanup_push(expire_send_fail, mt);
|
||||||
|
+ pthread_cleanup_push(expire_send_fail, &mt);
|
||||||
|
|
||||||
|
- status = do_expire(mt->ap, mt->name, mt->len);
|
||||||
|
+ status = do_expire(mt.ap, mt.name, mt.len);
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state);
|
||||||
|
if (status)
|
||||||
|
- send_fail(ap->logopt, ap->ioctlfd, mt->wait_queue_token);
|
||||||
|
+ send_fail(ap->logopt, ap->ioctlfd, mt.wait_queue_token);
|
||||||
|
else
|
||||||
|
- send_ready(ap->logopt, ap->ioctlfd, mt->wait_queue_token);
|
||||||
|
+ send_ready(ap->logopt, ap->ioctlfd, mt.wait_queue_token);
|
||||||
|
pthread_setcancelstate(state, NULL);
|
||||||
|
|
||||||
|
pthread_cleanup_pop(0);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@@ -682,6 +680,8 @@ int handle_packet_expire_indirect(struct
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ pthread_cleanup_push(free_pending_args, mt);
|
||||||
|
+ pthread_cleanup_push(pending_cond_destroy, mt);
|
||||||
|
pthread_cleanup_push(expire_mutex_unlock, NULL);
|
||||||
|
pthread_setcancelstate(state, NULL);
|
||||||
|
|
||||||
|
@@ -696,6 +696,8 @@ int handle_packet_expire_indirect(struct
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
+ pthread_cleanup_pop(1);
|
||||||
|
+ pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
63
autofs-5.0.3-fix-bad-alloca-usage.patch
Normal file
63
autofs-5.0.3-fix-bad-alloca-usage.patch
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
autofs-5.0.3 - fix bad alloca usage
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
In the lookup_ghost() function alloca is used within a loop which can
|
||||||
|
lead to stack overflow.
|
||||||
|
---
|
||||||
|
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/lookup.c | 6 +++++-
|
||||||
|
2 files changed, 6 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 879380e..07feb29 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -48,6 +48,7 @@
|
||||||
|
- fix $mandir definition in Makefile.conf.in
|
||||||
|
- fix init script stop function.
|
||||||
|
- fix master map lexer eval order.
|
||||||
|
+- fix bad alloca usage.
|
||||||
|
|
||||||
|
14/01/2008 autofs-5.0.3
|
||||||
|
-----------------------
|
||||||
|
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
||||||
|
index 2233ac8..49030e1 100644
|
||||||
|
--- a/daemon/lookup.c
|
||||||
|
+++ b/daemon/lookup.c
|
||||||
|
@@ -608,7 +608,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
- fullpath = alloca(strlen(me->key) + strlen(root) + 3);
|
||||||
|
+ fullpath = malloc(strlen(me->key) + strlen(root) + 3);
|
||||||
|
if (!fullpath) {
|
||||||
|
warn(ap->logopt, "failed to allocate full path");
|
||||||
|
goto next;
|
||||||
|
@@ -619,6 +619,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
|
||||||
|
if (ret == -1 && errno != ENOENT) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
warn(ap->logopt, "stat error %s", estr);
|
||||||
|
+ free(fullpath);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -627,6 +628,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
warn(ap->logopt,
|
||||||
|
"mkdir_path %s failed: %s", fullpath, estr);
|
||||||
|
+ free(fullpath);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -634,6 +636,8 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
|
||||||
|
me->dev = st.st_dev;
|
||||||
|
me->ino = st.st_ino;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ free(fullpath);
|
||||||
|
next:
|
||||||
|
me = cache_enumerate(mc, me);
|
||||||
|
}
|
48
autofs-5.0.3-fix-master-map-lexer-eval-order.patch
Normal file
48
autofs-5.0.3-fix-master-map-lexer-eval-order.patch
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
autofs-5.0.3 - fix master map lexer eval order
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Two compound regular expressions in the master map lexical
|
||||||
|
analyser lack brackets which leads to an evaluation order
|
||||||
|
error in some versions of flex.
|
||||||
|
---
|
||||||
|
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/master_tok.l | 4 ++--
|
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 8cdaab2..879380e 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -47,6 +47,7 @@
|
||||||
|
- fix incorrect pthreads condition handling for expire requests.
|
||||||
|
- fix $mandir definition in Makefile.conf.in
|
||||||
|
- fix init script stop function.
|
||||||
|
+- fix master map lexer eval order.
|
||||||
|
|
||||||
|
14/01/2008 autofs-5.0.3
|
||||||
|
-----------------------
|
||||||
|
diff --git a/lib/master_tok.l b/lib/master_tok.l
|
||||||
|
index d2c86bc..801aa6f 100644
|
||||||
|
--- a/lib/master_tok.l
|
||||||
|
+++ b/lib/master_tok.l
|
||||||
|
@@ -99,7 +99,7 @@ DNSERVSTR1 ([[:alpha:]][[:alnum:]\-.]*(:[0-9]+)?:)
|
||||||
|
DNSERVSTR2 (\/\/[[:alpha:]][[:alnum:]\-.]*(:[0-9]+)?\/)
|
||||||
|
DNSERVSTR3 (([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}(:[0-9]+)?:)
|
||||||
|
DNSERVSTR4 (\/\/([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}(:[0-9]+)?\/)
|
||||||
|
-DNSERVERSTR {DNSERVSTR1}|{DNSERVSTR2}|{DNSERVSTR3}|{DNSERVSTR4}
|
||||||
|
+DNSERVERSTR ({DNSERVSTR1}|{DNSERVSTR2}|{DNSERVSTR3}|{DNSERVSTR4})
|
||||||
|
|
||||||
|
AT_CN ([cC][[nN])
|
||||||
|
AT_NMN ([nN][iI][sS][Mm][aA][pP][Nn][aA][mM][eE])
|
||||||
|
@@ -108,7 +108,7 @@ AT_OU ([oO][[uU])
|
||||||
|
AT_DC ([dD][[cC])
|
||||||
|
AT_O ([oO])
|
||||||
|
AT_C ([cC])
|
||||||
|
-DNATTRSTR {AT_CN}|{AT_NMN}|{AT_AMN}|{AT_OU}|{AT_DC}|{AT_O}|{AT_C}
|
||||||
|
+DNATTRSTR ({AT_CN}|{AT_NMN}|{AT_AMN}|{AT_OU}|{AT_DC}|{AT_O}|{AT_C})
|
||||||
|
DNNAMESTR1 ([[:alnum:]_.\- ]+)
|
||||||
|
DNNAMESTR2 ([[:alnum:]_.\-]+)
|
||||||
|
|
164
autofs-5.0.3-library-reload-fix.patch
Normal file
164
autofs-5.0.3-library-reload-fix.patch
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
autofs-5.0.3 - library reload fix
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
During a map re-read autofs needs to re-open its lookup libraries but
|
||||||
|
dependent shared libraries can't handle being unloaded and then re-loaded
|
||||||
|
by the same process. This patch preventis dependent libraries from being
|
||||||
|
unloaded during this re-open.
|
||||||
|
---
|
||||||
|
|
||||||
|
daemon/automount.c | 1 -
|
||||||
|
daemon/lookup.c | 21 +++++++++------------
|
||||||
|
daemon/state.c | 3 +++
|
||||||
|
include/master.h | 17 +++--------------
|
||||||
|
lib/master.c | 28 ++++++++++++++++++++++------
|
||||||
|
5 files changed, 37 insertions(+), 33 deletions(-)
|
||||||
|
|
||||||
|
|
||||||
|
--- autofs-5.0.3.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.0.3/daemon/automount.c
|
||||||
|
@@ -85,7 +85,6 @@ int aquire_flag_file(void);
|
||||||
|
void release_flag_file(void);
|
||||||
|
static int umount_all(struct autofs_point *ap, int force);
|
||||||
|
|
||||||
|
-extern pthread_mutex_t master_mutex;
|
||||||
|
extern struct master *master_list;
|
||||||
|
|
||||||
|
static int do_mkdir(const char *parent, const char *path, mode_t mode)
|
||||||
|
--- autofs-5.0.3.orig/daemon/lookup.c
|
||||||
|
+++ autofs-5.0.3/daemon/lookup.c
|
||||||
|
@@ -267,17 +267,17 @@ static int do_read_map(struct autofs_poi
|
||||||
|
struct lookup_mod *lookup;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
- if (!map->lookup) {
|
||||||
|
- lookup = open_lookup(map->type, "",
|
||||||
|
- map->format, map->argc, map->argv);
|
||||||
|
- if (!lookup) {
|
||||||
|
- debug(ap->logopt, "lookup module %s failed", map->type);
|
||||||
|
- return NSS_STATUS_UNAVAIL;
|
||||||
|
- }
|
||||||
|
- map->lookup = lookup;
|
||||||
|
+ lookup = open_lookup(map->type, "", map->format, map->argc, map->argv);
|
||||||
|
+ if (!lookup) {
|
||||||
|
+ debug(ap->logopt, "lookup module %s failed", map->type);
|
||||||
|
+ return NSS_STATUS_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- lookup = map->lookup;
|
||||||
|
+ master_source_writelock(ap->entry);
|
||||||
|
+ if (map->lookup)
|
||||||
|
+ close_lookup(map->lookup);
|
||||||
|
+ map->lookup = lookup;
|
||||||
|
+ master_source_unlock(ap->entry);
|
||||||
|
|
||||||
|
/* If we don't need to create directories then there's no use
|
||||||
|
* reading the map. We just need to test that the map is valid
|
||||||
|
@@ -463,8 +463,6 @@ int lookup_nss_read_map(struct autofs_po
|
||||||
|
* point in the master map) do the nss lookup to
|
||||||
|
* locate the map and read it.
|
||||||
|
*/
|
||||||
|
- pthread_cleanup_push(master_source_lock_cleanup, entry);
|
||||||
|
- master_source_readlock(entry);
|
||||||
|
if (source)
|
||||||
|
map = source;
|
||||||
|
else
|
||||||
|
@@ -557,7 +555,6 @@ int lookup_nss_read_map(struct autofs_po
|
||||||
|
|
||||||
|
map = map->next;
|
||||||
|
}
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
if (!result || at_least_one)
|
||||||
|
return 1;
|
||||||
|
--- autofs-5.0.3.orig/daemon/state.c
|
||||||
|
+++ autofs-5.0.3/daemon/state.c
|
||||||
|
@@ -387,9 +387,12 @@ static void *do_readmap(void *arg)
|
||||||
|
|
||||||
|
info(ap->logopt, "re-reading map for %s", ap->path);
|
||||||
|
|
||||||
|
+ pthread_cleanup_push(master_mutex_lock_cleanup, NULL);
|
||||||
|
+ master_mutex_lock();
|
||||||
|
status = lookup_nss_read_map(ap, NULL, now);
|
||||||
|
if (!status)
|
||||||
|
pthread_exit(NULL);
|
||||||
|
+ pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
if (ap->type == LKP_INDIRECT) {
|
||||||
|
lookup_prune_cache(ap, now);
|
||||||
|
--- autofs-5.0.3.orig/include/master.h
|
||||||
|
+++ autofs-5.0.3/include/master.h
|
||||||
|
@@ -70,6 +70,9 @@ int master_parse_entry(const char *, uns
|
||||||
|
|
||||||
|
/* From master.c master parser utility routines */
|
||||||
|
|
||||||
|
+void master_mutex_lock(void);
|
||||||
|
+void master_mutex_unlock(void);
|
||||||
|
+void master_mutex_lock_cleanup(void *);
|
||||||
|
void master_set_default_timeout(void);
|
||||||
|
void master_set_default_ghost_mode(void);
|
||||||
|
int master_add_autofs_point(struct master_mapent *, time_t, unsigned, unsigned, int);
|
||||||
|
@@ -108,18 +111,4 @@ extern inline unsigned int master_get_lo
|
||||||
|
int master_list_empty(struct master *);
|
||||||
|
int master_kill(struct master *);
|
||||||
|
|
||||||
|
-#define master_mutex_lock() \
|
||||||
|
-do { \
|
||||||
|
- int status = pthread_mutex_lock(&master_mutex); \
|
||||||
|
- if (status) \
|
||||||
|
- fatal(status); \
|
||||||
|
-} while (0)
|
||||||
|
-
|
||||||
|
-#define master_mutex_unlock() \
|
||||||
|
-do { \
|
||||||
|
- int status = pthread_mutex_unlock(&master_mutex); \
|
||||||
|
- if (status) \
|
||||||
|
- fatal(status); \
|
||||||
|
-} while (0)
|
||||||
|
-
|
||||||
|
#endif
|
||||||
|
--- autofs-5.0.3.orig/lib/master.c
|
||||||
|
+++ autofs-5.0.3/lib/master.c
|
||||||
|
@@ -41,8 +41,28 @@ static struct map_source *
|
||||||
|
__master_find_map_source(struct master_mapent *,
|
||||||
|
const char *, const char *, int, const char **);
|
||||||
|
|
||||||
|
-pthread_mutex_t master_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
-pthread_mutex_t instance_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
+static pthread_mutex_t master_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
+static pthread_mutex_t instance_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
+
|
||||||
|
+void master_mutex_lock(void)
|
||||||
|
+{
|
||||||
|
+ int status = pthread_mutex_lock(&master_mutex);
|
||||||
|
+ if (status)
|
||||||
|
+ fatal(status);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void master_mutex_unlock(void)
|
||||||
|
+{
|
||||||
|
+ int status = pthread_mutex_unlock(&master_mutex);
|
||||||
|
+ if (status)
|
||||||
|
+ fatal(status);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void master_mutex_lock_cleanup(void *arg)
|
||||||
|
+{
|
||||||
|
+ master_mutex_unlock();
|
||||||
|
+ return;
|
||||||
|
+}
|
||||||
|
|
||||||
|
int master_add_autofs_point(struct master_mapent *entry,
|
||||||
|
time_t timeout, unsigned logopt, unsigned ghost, int submount)
|
||||||
|
@@ -1109,10 +1129,6 @@ int master_mount_mounts(struct master *m
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- master_source_writelock(ap->entry);
|
||||||
|
- lookup_close_lookup(ap);
|
||||||
|
- master_source_unlock(ap->entry);
|
||||||
|
-
|
||||||
|
cache_readlock(nc);
|
||||||
|
ne = cache_lookup_distinct(nc, this->path);
|
||||||
|
if (ne && this->age > ne->age) {
|
16
autofs.spec
16
autofs.spec
@ -4,7 +4,7 @@
|
|||||||
Summary: A tool for automatically mounting and unmounting filesystems
|
Summary: A tool for automatically mounting and unmounting filesystems
|
||||||
Name: autofs
|
Name: autofs
|
||||||
Version: 5.0.3
|
Version: 5.0.3
|
||||||
Release: 28
|
Release: 30
|
||||||
Epoch: 1
|
Epoch: 1
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
@ -65,6 +65,10 @@ Patch52: autofs-5.0.3-nisplus-partial-and-free.patch
|
|||||||
Patch53: autofs-5.0.3-fix-rootless-direct-multi-mount-expire.patch
|
Patch53: autofs-5.0.3-fix-rootless-direct-multi-mount-expire.patch
|
||||||
Patch54: autofs-5.0.3-wait-submount-expire-complete.patch
|
Patch54: autofs-5.0.3-wait-submount-expire-complete.patch
|
||||||
Patch55: autofs-5.0.3-add-missing-uris-list-locking.patch
|
Patch55: autofs-5.0.3-add-missing-uris-list-locking.patch
|
||||||
|
Patch56: autofs-5.0.3-library-reload-fix.patch
|
||||||
|
Patch57: autofs-5.0.3-expire-thread-create-cond-handling.patch
|
||||||
|
Patch58: autofs-5.0.3-fix-master-map-lexer-eval-order.patch
|
||||||
|
Patch59: autofs-5.0.3-fix-bad-alloca-usage.patch
|
||||||
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, libxml2-devel, cyrus-sasl-devel, openssl-devel module-init-tools util-linux nfs-utils e2fsprogs
|
BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, libxml2-devel, cyrus-sasl-devel, openssl-devel module-init-tools util-linux nfs-utils e2fsprogs
|
||||||
Requires: kernel >= 2.6.17
|
Requires: kernel >= 2.6.17
|
||||||
@ -161,6 +165,10 @@ echo %{version}-%{release} > .version
|
|||||||
%patch53 -p1
|
%patch53 -p1
|
||||||
%patch54 -p1
|
%patch54 -p1
|
||||||
%patch55 -p1
|
%patch55 -p1
|
||||||
|
%patch56 -p1
|
||||||
|
%patch57 -p1
|
||||||
|
%patch58 -p1
|
||||||
|
%patch59 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
#CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir}
|
#CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir}
|
||||||
@ -213,6 +221,12 @@ fi
|
|||||||
%{_libdir}/autofs/
|
%{_libdir}/autofs/
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sun Nov 2 2008 Ian Kent <kent@redhat.com> - 5.0.3-30
|
||||||
|
- fix segv during library re-open.
|
||||||
|
- fix incorrect pthreads condition handling for expire requests.
|
||||||
|
- fix master map lexer eval order.
|
||||||
|
- fix bad alloca usage.
|
||||||
|
|
||||||
* Thu Oct 23 2008 Ian Kent <ikent@redhat.com> - 5.0.3-28
|
* Thu Oct 23 2008 Ian Kent <ikent@redhat.com> - 5.0.3-28
|
||||||
- don't close file handle for rootless direct mounti-mount at mount.
|
- don't close file handle for rootless direct mounti-mount at mount.
|
||||||
- wait submount expire thread completion when expire successful.
|
- wait submount expire thread completion when expire successful.
|
||||||
|
Loading…
Reference in New Issue
Block a user