- fix lsb init script header.

- fix memory leak reading ldap master map.
- fix st_remove_tasks() locking.
- reset flex scanner when setting buffer.
- zero s_magic is valid.
This commit is contained in:
Ian Kent 2009-04-16 04:03:30 +00:00
parent 9bf5a1c9db
commit 597437726a
7 changed files with 417 additions and 1 deletions

View File

@ -0,0 +1,57 @@
autofs-5.0.4 - fix lsb init script header
From: Ian Kent <raven@themaw.net>
It truns out that "Should-Start:" is not sufficient to enforce
the required ordering of services and a "Required-Start:" is
needed instead.
---
CHANGELOG | 1 +
redhat/autofs.init.in | 4 ++--
samples/rc.autofs.in | 4 ++--
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 91edd14..2be7683 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -35,6 +35,7 @@
- use misc device ioctl interface by default, if available.
- fix call restorecon when misc device file doesn't exist.
- clear rpc client on lookup fail.
+- fix lsb init script header.
4/11/2008 autofs-5.0.4
-----------------------
diff --git a/redhat/autofs.init.in b/redhat/autofs.init.in
index a9a33c8..fded1d8 100644
--- a/redhat/autofs.init.in
+++ b/redhat/autofs.init.in
@@ -9,8 +9,8 @@
#
### BEGIN INIT INFO
# Provides: $autofs
-# Should-Start: $network $ypbind
-# Should-Stop: $network $ypbind
+# Required-Start: $network $ypbind
+# Required-Stop: $network $ypbind
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Automounts filesystems on demand
diff --git a/samples/rc.autofs.in b/samples/rc.autofs.in
index 78cbec2..b193a4e 100644
--- a/samples/rc.autofs.in
+++ b/samples/rc.autofs.in
@@ -8,8 +8,8 @@
#
### BEGIN INIT INFO
# Provides: $autofs
-# Should-Start: $network $ypbind
-# Should-Stop: $network $ypbind
+# Required-Start: $network $ypbind
+# Required-Stop: $network $ypbind
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Automounts filesystems on demand

View File

@ -0,0 +1,38 @@
autofs-5.0.4 - fix memory leak reading ldap master map
From: Ian Kent <raven@themaw.net>
When reading the master map the storage allocated by getting the location
value is not freed after use.
---
CHANGELOG | 1 +
modules/lookup_ldap.c | 2 ++
2 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 2be7683..a143294 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -36,6 +36,7 @@
- fix call restorecon when misc device file doesn't exist.
- clear rpc client on lookup fail.
- fix lsb init script header.
+- fix memory leak reading master map.
4/11/2008 autofs-5.0.4
-----------------------
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
index 5a54b5f..9b1180c 100644
--- a/modules/lookup_ldap.c
+++ b/modules/lookup_ldap.c
@@ -1563,6 +1563,8 @@ int lookup_read_master(struct master *master, time_t age, void *context)
ldap_value_free(values);
goto next;
}
+ ldap_value_free(values);
+
master_parse_entry(parse_buf, timeout, logging, age);
next:
ldap_value_free(keyValue);

View File

@ -0,0 +1,60 @@
autofs-5.0.4 - fix st_remove_tasks() locking
From: Ian Kent <raven@themaw.net>
The autofs serialization of state changing during task (mount, umount etc.)
execution was being done twice, with the state queue manager and by using
a pipe to communicate state changes to the handle_mounts() thread. This
required the use of two mutexes which was unnecessary and problematic. So
the pipe was removed and the state queue alone now handles this. When this
was done most of the state queue locking was moved into the state queue
manager functions, however, the locking was inadvertantly left out of the
st_remove_tasks() function.
---
CHANGELOG | 1 +
daemon/state.c | 8 +++++++-
2 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index a143294..c8b88e4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -37,6 +37,7 @@
- clear rpc client on lookup fail.
- fix lsb init script header.
- fix memory leak reading master map.
+- fix st_remove_tasks() locking.
4/11/2008 autofs-5.0.4
-----------------------
diff --git a/daemon/state.c b/daemon/state.c
index 417fde1..533e241 100644
--- a/daemon/state.c
+++ b/daemon/state.c
@@ -783,10 +783,14 @@ void st_remove_tasks(struct autofs_point *ap)
struct state_queue *task, *waiting;
int status;
+ st_mutex_lock();
+
head = &state_queue;
- if (list_empty(head))
+ if (list_empty(head)) {
+ st_mutex_unlock();
return;
+ }
p = head->next;
while (p != head) {
@@ -823,6 +827,8 @@ void st_remove_tasks(struct autofs_point *ap)
if (status)
fatal(status);
+ st_mutex_unlock();
+
return;
}

View File

@ -0,0 +1,59 @@
autofs-5.0.4 - reset flex scanner when setting buffer
From: Ian Kent <raven@themaw.net>
We still have problems resetting the flex scan buffer after an error
is detected. This appears to fix the problem.
---
CHANGELOG | 1 +
lib/master_tok.l | 9 ++++++++-
2 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index c8b88e4..5f1cf7f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -38,6 +38,7 @@
- fix lsb init script header.
- fix memory leak reading master map.
- fix st_remove_tasks() locking.
+- reset flex scanner when setting buffer.
4/11/2008 autofs-5.0.4
-----------------------
diff --git a/lib/master_tok.l b/lib/master_tok.l
index b6cc8be..373248b 100644
--- a/lib/master_tok.l
+++ b/lib/master_tok.l
@@ -130,7 +130,6 @@ OPTNTOUT (-n{OPTWS}|-n{OPTWS}={OPTWS}|--negative-timeout{OPTWS}|--negative-timeo
\x00 {
if (optr != buff) {
*optr = '\0';
- optr = buff;
strcpy(master_lval.strtype, buff);
return NILL;
}
@@ -139,6 +138,11 @@ OPTNTOUT (-n{OPTWS}|-n{OPTWS}={OPTWS}|--negative-timeout{OPTWS}|--negative-timeo
#.* { return COMMENT; }
"/" {
+ if (optr != buff) {
+ *optr = '\0';
+ strcpy(master_lval.strtype, buff);
+ return NILL;
+ }
BEGIN(PATHSTR);
bptr = buff;
yyless(0);
@@ -410,6 +414,9 @@ static void master_echo(void)
void master_set_scan_buffer(const char *buffer)
{
+ master_lex_destroy();
+ optr = buff;
+
line = buffer;
line_pos = &line[0];
/*

View File

@ -0,0 +1,136 @@
autofs-5.0.4 - use percent hack for master map keys
From: Ian Kent <raven@themaw.net>
The percent hack translation has been done for map keys but it
isn't used for master map keys.
---
CHANGELOG | 1 +
modules/lookup_ldap.c | 66 +++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 59 insertions(+), 8 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 4ed80e0..8258e00 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -40,6 +40,7 @@
- fix st_remove_tasks() locking.
- reset flex scanner when setting buffer.
- zero s_magic is valid.
+- use percent hack for master map keys.
4/11/2008 autofs-5.0.4
-----------------------
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
index 9b1180c..8c6a8f2 100644
--- a/modules/lookup_ldap.c
+++ b/modules/lookup_ldap.c
@@ -60,6 +60,7 @@ struct ldap_search_params {
};
static LDAP *auth_init(unsigned logopt, const char *, struct lookup_context *);
+static int decode_percent_hack(const char *, char **);
#ifndef HAVE_LDAP_CREATE_PAGE_CONTROL
int ldap_create_page_control(LDAP *ldap, ber_int_t pagesize,
@@ -1508,6 +1509,9 @@ int lookup_read_master(struct master *master, time_t age, void *context)
debug(logopt, MODPREFIX "examining entries");
while (e) {
+ char *key = NULL;
+ int dec_len, i;
+
keyValue = ldap_get_values(ldap, e, entry);
if (!keyValue || !*keyValue) {
@@ -1519,19 +1523,63 @@ int lookup_read_master(struct master *master, time_t age, void *context)
* By definition keys must be unique within
* each map entry
*/
- if (ldap_count_values(keyValue) > 1) {
- error(logopt,
- MODPREFIX
- "key %s has duplicate entries - ignoring",
- *keyValue);
- goto next;
+ count = ldap_count_values(keyValue);
+ if (strcasecmp(class, "nisObject")) {
+ if (count > 1) {
+ error(logopt, MODPREFIX
+ "key %s has duplicates - ignoring",
+ *keyValue);
+ goto next;
+ }
+ key = strdup(keyValue[0]);
+ if (!key) {
+ error(logopt, MODPREFIX
+ "failed to dup map key %s - ignoring",
+ *keyValue);
+ goto next;
+ }
+ } else if (count == 1) {
+ dec_len = decode_percent_hack(keyValue[0], &key);
+ if (dec_len < 0) {
+ error(logopt, MODPREFIX
+ "invalid map key %s - ignoring",
+ *keyValue);
+ goto next;
+ }
+ } else {
+ dec_len = decode_percent_hack(keyValue[0], &key);
+ if (dec_len < 0) {
+ error(logopt, MODPREFIX
+ "invalid map key %s - ignoring",
+ *keyValue);
+ goto next;
+ }
+
+ for (i = 1; i < count; i++) {
+ char *k;
+ dec_len = decode_percent_hack(keyValue[i], &k);
+ if (dec_len < 0) {
+ error(logopt, MODPREFIX
+ "invalid map key %s - ignoring",
+ *keyValue);
+ goto next;
+ }
+ if (strcmp(key, k)) {
+ error(logopt, MODPREFIX
+ "key entry mismatch %s - ignoring",
+ *keyValue);
+ free(k);
+ goto next;
+ }
+ free(k);
+ }
}
/*
* Ignore keys beginning with '+' as plus map
* inclusion is only valid in file maps.
*/
- if (**keyValue == '+') {
+ if (*key == '+') {
warn(logopt,
MODPREFIX
"ignoreing '+' map entry - not in file map");
@@ -1558,7 +1606,7 @@ int lookup_read_master(struct master *master, time_t age, void *context)
}
if (snprintf(parse_buf, sizeof(parse_buf), "%s %s",
- *keyValue, *values) >= sizeof(parse_buf)) {
+ key, *values) >= sizeof(parse_buf)) {
error(logopt, MODPREFIX "map entry too long");
ldap_value_free(values);
goto next;
@@ -1568,6 +1616,8 @@ int lookup_read_master(struct master *master, time_t age, void *context)
master_parse_entry(parse_buf, timeout, logging, age);
next:
ldap_value_free(keyValue);
+ if (key)
+ free(key);
e = ldap_next_entry(ldap, e);
}

View File

@ -0,0 +1,47 @@
autofs-5.0.4 - zero s_magic is valid
From: Ian Kent <raven@themaw.net>
When checking the super magic using the mount control ioctl
re-implementation an incorrect assumption is made that s_magic
field in the super block will not be zero.
---
CHANGELOG | 1 +
lib/dev-ioctl-lib.c | 10 ++++------
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 5f1cf7f..4ed80e0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -39,6 +39,7 @@
- fix memory leak reading master map.
- fix st_remove_tasks() locking.
- reset flex scanner when setting buffer.
+- zero s_magic is valid.
4/11/2008 autofs-5.0.4
-----------------------
diff --git a/lib/dev-ioctl-lib.c b/lib/dev-ioctl-lib.c
index 7c8c433..a034a3d 100644
--- a/lib/dev-ioctl-lib.c
+++ b/lib/dev-ioctl-lib.c
@@ -764,12 +764,10 @@ static int dev_ioctl_ismountpoint(unsigned int logopt,
if (err) {
*mountpoint = DEV_IOCTL_IS_MOUNTED;
- if (param->ismountpoint.out.magic) {
- if (param->ismountpoint.out.magic == AUTOFS_SUPER_MAGIC)
- *mountpoint |= DEV_IOCTL_IS_AUTOFS;
- else
- *mountpoint |= DEV_IOCTL_IS_OTHER;
- }
+ if (param->ismountpoint.out.magic == AUTOFS_SUPER_MAGIC)
+ *mountpoint |= DEV_IOCTL_IS_AUTOFS;
+ else
+ *mountpoint |= DEV_IOCTL_IS_OTHER;
}
free_dev_ioctl_path(param);

View File

@ -4,7 +4,7 @@
Summary: A tool for automatically mounting and unmounting filesystems
Name: autofs
Version: 5.0.4
Release: 24
Release: 26
Epoch: 1
License: GPLv2+
Group: System Environment/Daemons
@ -45,6 +45,12 @@ Patch32: autofs-5.0.4-always-read-file-maps-fix.patch
Patch33: autofs-5.0.4-use-misc-device.patch
Patch34: autofs-5.0.4-fix-restorecon.patch
Patch35: autofs-5.0.4-clear-rpc-client-on-lookup-fail.patch
Patch36: autofs-5.0.4-fix-lsb-init-script-header.patch
Patch37: autofs-5.0.4-fix-memory-leak-reading-ldap-master.patch
Patch38: autofs-5.0.4-fix-st_remove_tasks-locking.patch
Patch39: autofs-5.0.4-reset-flex-scanner-when-setting-buffer.patch
Patch40: autofs-5.0.4-zero-s_magic-is-valid.patch
Patch41: autofs-5.0.4-use-percent-hack-for-master.patch
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 libtirpc-devel
Requires: kernel >= 2.6.17
@ -121,6 +127,12 @@ echo %{version}-%{release} > .version
%patch33 -p1
%patch34 -p1
%patch35 -p1
%patch36 -p1
%patch37 -p1
%patch38 -p1
%patch39 -p1
%patch40 -p1
%patch41 -p1
%build
#CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir}
@ -173,6 +185,13 @@ fi
%{_libdir}/autofs/
%changelog
* Thu Apr 16 2009 Ian Kent <ikent@redhat.com> - 1:5.0.4-26
- fix lsb init script header.
- fix memory leak reading ldap master map.
- fix st_remove_tasks() locking.
- reset flex scanner when setting buffer.
- zero s_magic is valid.
* Mon Mar 30 2009 Ian Kent <ikent@redhat.com> - 1:5.0.4-24
- clear rpc client on lookup fail.