vanhofen
6 years ago
23 changed files with 2226 additions and 0 deletions
@ -0,0 +1,38 @@ |
|||||
|
autofs-5.1.4 - add NULL check in prepare_attempt_prefix() |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
prepare_attempt_prefix() calls calloc(3) and continues without |
||||
|
checking if the allocation succeeded. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
lib/log.c | 2 ++ |
||||
|
2 files changed, 3 insertions(+) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 0a56df5a..ad9932a2 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -43,6 +43,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- better handle hesiod support not built in. |
||||
|
- fix indent in automount(8) man page. |
||||
|
- remove autofs4 module load code. |
||||
|
+- add NULL check in prepare_attempt_prefix().
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/lib/log.c b/lib/log.c
|
||||
|
index f6ab77c1..41f95fe8 100644
|
||||
|
--- a/lib/log.c
|
||||
|
+++ b/lib/log.c
|
||||
|
@@ -44,6 +44,8 @@ static char *prepare_attempt_prefix(const char *msg)
|
||||
|
|
||||
|
snprintf(buffer, ATTEMPT_ID_SIZE, "%02lx", *attempt_id); |
||||
|
prefixed_msg = (char *) calloc(len, sizeof(char)); |
||||
|
+ if (!prefixed_msg)
|
||||
|
+ return NULL;
|
||||
|
strcpy(prefixed_msg, buffer); |
||||
|
strcat(prefixed_msg, "|"); |
||||
|
strcat(prefixed_msg, msg); |
@ -0,0 +1,191 @@ |
|||||
|
autofs-5.1.4 - add master map pseudo options for mount propagation |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Add master map entry pseudo mount option of "slave" or "private" to |
||||
|
allow mount propagation of bind mounts to be set to either "slave" or |
||||
|
"private". |
||||
|
|
||||
|
This option may be needed when using multi-mounts that have bind mounts |
||||
|
that bind to a file system that is propagation shared. This is becuase |
||||
|
the bind mount will have the same properties as its target which causes |
||||
|
problems for offset mounts. When this happens an unwanted offset mount |
||||
|
is propagated back to the target file system resulting in a deadlock |
||||
|
when attempting to access the offset. |
||||
|
|
||||
|
By default bind mounts will inherit the mount propagation of the target |
||||
|
file system. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
include/automount.h | 4 ++++ |
||||
|
lib/master_parse.y | 13 +++++++++++++ |
||||
|
lib/master_tok.l | 2 ++ |
||||
|
man/auto.master.5.in | 12 ++++++++++++ |
||||
|
modules/mount_bind.c | 30 +++++++++++++++++++----------- |
||||
|
6 files changed, 51 insertions(+), 11 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 88829564..4765a66e 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -35,6 +35,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix program usage message. |
||||
|
- mark removed cache entry negative. |
||||
|
- set bind mount as propagation slave. |
||||
|
+- add master map pseudo options for mount propagation.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/include/automount.h b/include/automount.h
|
||||
|
index e5c19d23..417dacbb 100644
|
||||
|
--- a/include/automount.h
|
||||
|
+++ b/include/automount.h
|
||||
|
@@ -549,6 +549,10 @@ struct kernel_mod_version {
|
||||
|
/* Read amd map even if it's not to be ghosted (browsable) */ |
||||
|
#define MOUNT_FLAG_AMD_CACHE_ALL 0x0080 |
||||
|
|
||||
|
+/* Set mount propagation for bind mounts */
|
||||
|
+#define MOUNT_FLAG_SLAVE 0x0100
|
||||
|
+#define MOUNT_FLAG_PRIVATE 0x0200
|
||||
|
+
|
||||
|
struct autofs_point { |
||||
|
pthread_t thid; |
||||
|
char *path; /* Mount point name */ |
||||
|
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
||||
|
index 5d687a70..84ca5ca1 100644
|
||||
|
--- a/lib/master_parse.y
|
||||
|
+++ b/lib/master_parse.y
|
||||
|
@@ -58,6 +58,8 @@ static char *format;
|
||||
|
static long timeout; |
||||
|
static long negative_timeout; |
||||
|
static unsigned symlnk; |
||||
|
+static unsigned slave;
|
||||
|
+static unsigned private;
|
||||
|
static unsigned nobind; |
||||
|
static unsigned ghost; |
||||
|
extern unsigned global_selection_options; |
||||
|
@@ -103,6 +105,7 @@ static int master_fprintf(FILE *, char *, ...);
|
||||
|
%token MAP |
||||
|
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE |
||||
|
%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK OPT_MODE |
||||
|
+%token OPT_SLAVE OPT_PRIVATE
|
||||
|
%token COLON COMMA NL DDASH |
||||
|
%type <strtype> map |
||||
|
%type <strtype> options |
||||
|
@@ -196,6 +199,8 @@ line:
|
||||
|
| PATH OPT_DEBUG { master_notify($1); YYABORT; } |
||||
|
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; } |
||||
|
| PATH OPT_SYMLINK { master_notify($1); YYABORT; } |
||||
|
+ | PATH OPT_SLAVE { master_notify($1); YYABORT; }
|
||||
|
+ | PATH OPT_PRIVATE { master_notify($1); YYABORT; }
|
||||
|
| PATH OPT_NOBIND { master_notify($1); YYABORT; } |
||||
|
| PATH OPT_GHOST { master_notify($1); YYABORT; } |
||||
|
| PATH OPT_NOGHOST { master_notify($1); YYABORT; } |
||||
|
@@ -600,6 +605,8 @@ option: daemon_option
|
||||
|
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; } |
||||
|
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; } |
||||
|
| OPT_SYMLINK { symlnk = 1; } |
||||
|
+ | OPT_SLAVE { slave = 1; }
|
||||
|
+ | OPT_PRIVATE { private = 1; }
|
||||
|
| OPT_NOBIND { nobind = 1; } |
||||
|
| OPT_NOGHOST { ghost = 0; } |
||||
|
| OPT_GHOST { ghost = 1; } |
||||
|
@@ -672,6 +679,8 @@ static void local_init_vars(void)
|
||||
|
timeout = -1; |
||||
|
negative_timeout = 0; |
||||
|
symlnk = 0; |
||||
|
+ slave = 0;
|
||||
|
+ private = 0;
|
||||
|
nobind = 0; |
||||
|
ghost = defaults_get_browse_mode(); |
||||
|
random_selection = global_selection_options & MOUNT_FLAG_RANDOM_SELECT; |
||||
|
@@ -878,6 +887,10 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
|
||||
|
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY; |
||||
|
if (symlnk) |
||||
|
entry->ap->flags |= MOUNT_FLAG_SYMLINK; |
||||
|
+ if (slave)
|
||||
|
+ entry->ap->flags |= MOUNT_FLAG_SLAVE;
|
||||
|
+ if (private)
|
||||
|
+ entry->ap->flags |= MOUNT_FLAG_PRIVATE;
|
||||
|
if (negative_timeout) |
||||
|
entry->ap->negative_timeout = negative_timeout; |
||||
|
if (mode && mode < LONG_MAX) |
||||
|
diff --git a/lib/master_tok.l b/lib/master_tok.l
|
||||
|
index 41ac4995..f4e940ce 100644
|
||||
|
--- a/lib/master_tok.l
|
||||
|
+++ b/lib/master_tok.l
|
||||
|
@@ -389,6 +389,8 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTWS})
|
||||
|
-?symlink { return(OPT_SYMLINK); } |
||||
|
-?nobind { return(OPT_NOBIND); } |
||||
|
-?nobrowse { return(OPT_NOGHOST); } |
||||
|
+ -?slave { return(OPT_SLAVE); }
|
||||
|
+ -?private { return(OPT_PRIVATE); }
|
||||
|
-g|--ghost|-?browse { return(OPT_GHOST); } |
||||
|
-v|--verbose { return(OPT_VERBOSE); } |
||||
|
-d|--debug { return(OPT_DEBUG); } |
||||
|
diff --git a/man/auto.master.5.in b/man/auto.master.5.in
|
||||
|
index e9afb97f..68242d45 100644
|
||||
|
--- a/man/auto.master.5.in
|
||||
|
+++ b/man/auto.master.5.in
|
||||
|
@@ -199,6 +199,18 @@ entries only, either in the master map (so it effects all map entries)
|
||||
|
or with individual map entries. The option is ignored for direct mounts |
||||
|
and non-root offest mount entries. |
||||
|
.TP |
||||
|
+.I slave \fPor\fI private
|
||||
|
+This option allows mount propagation of bind mounts to be set to
|
||||
|
+either \fIslave\fP or \fIprivate\fP. This option may be needed when using
|
||||
|
+multi-mounts that have bind mounts that bind to a file system that is
|
||||
|
+propagation shared. This is becuase the bind mount will have the same
|
||||
|
+properties as its target which causes problems for offset mounts. When
|
||||
|
+this happens an unwanted offset mount is propagated back to the target
|
||||
|
+file system resulting in a deadlock when attempting to access the offset.
|
||||
|
+This option is a an autofs pseudo mount option that can be used in the
|
||||
|
+master map only. By default bind mounts will inherit the mount propagation
|
||||
|
+of the target file system.
|
||||
|
+.TP
|
||||
|
.I "\-r, \-\-random-multimount-selection" |
||||
|
Enables the use of random selection when choosing a host from a |
||||
|
list of replicated servers. This option is applied to this mount |
||||
|
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
|
||||
|
index fe1ad9b6..b64cdccc 100644
|
||||
|
--- a/modules/mount_bind.c
|
||||
|
+++ b/modules/mount_bind.c
|
||||
|
@@ -186,17 +186,25 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||
|
what, fstype, fullpath); |
||||
|
} |
||||
|
|
||||
|
- /* The bind mount has succeeded but if the target
|
||||
|
- * mount is propagation shared propagation of child
|
||||
|
- * mounts (autofs offset mounts for example) back to
|
||||
|
- * the target of the bind mount must be avoided or
|
||||
|
- * autofs trigger mounts will deadlock.
|
||||
|
- */
|
||||
|
- err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
|
||||
|
- if (err)
|
||||
|
- warn(ap->logopt,
|
||||
|
- "failed to set propagation type for %s",
|
||||
|
- fullpath);
|
||||
|
+ if (ap->flags & (MOUNT_FLAG_SLAVE | MOUNT_FLAG_PRIVATE)) {
|
||||
|
+ int flags = MS_SLAVE;
|
||||
|
+
|
||||
|
+ if (ap->flags & MOUNT_FLAG_PRIVATE)
|
||||
|
+ flags = MS_PRIVATE;
|
||||
|
+
|
||||
|
+ /* The bind mount has succeeded but if the target
|
||||
|
+ * mount is propagation shared propagation of child
|
||||
|
+ * mounts (autofs offset mounts for example) back to
|
||||
|
+ * the target of the bind mount must be avoided or
|
||||
|
+ * autofs trigger mounts will deadlock.
|
||||
|
+ */
|
||||
|
+ err = mount(NULL, fullpath, NULL, flags, NULL);
|
||||
|
+ if (err) {
|
||||
|
+ warn(ap->logopt,
|
||||
|
+ "failed to set propagation for %s",
|
||||
|
+ fullpath, root);
|
||||
|
+ }
|
||||
|
+ }
|
||||
|
|
||||
|
return 0; |
||||
|
} else { |
@ -0,0 +1,147 @@ |
|||||
|
autofs-5.1.4 - add systemd service command line option |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
When run as a systemd service using the systemd notification method to |
||||
|
synchronise startup, logging should be done to syslog so the log entry |
||||
|
format is consistent between daemon and systemd usage. |
||||
|
|
||||
|
So, rather than run use the forground option, add an option to tell |
||||
|
the automounter it's being run as a systemd service and use syslog |
||||
|
for logging when its present on the command line. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/automount.c | 22 +++++++++++++++++++--- |
||||
|
include/automount.h | 1 + |
||||
|
man/automount.8 | 4 ++++ |
||||
|
samples/autofs.service.in | 2 +- |
||||
|
5 files changed, 26 insertions(+), 4 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 4e1d9c98..21fc9ca7 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -47,6 +47,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- update build info with systemd. |
||||
|
- use flags for startup boolean options. |
||||
|
- move close stdio descriptors to become_daemon(). |
||||
|
+- add systemd service command line option.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||
|
index c1360ed6..4628f20c 100644
|
||||
|
--- a/daemon/automount.c
|
||||
|
+++ b/daemon/automount.c
|
||||
|
@@ -1210,13 +1210,21 @@ static void become_daemon(unsigned int flags)
|
||||
|
} |
||||
|
|
||||
|
/* Detach from foreground process */ |
||||
|
- if (flags & DAEMON_FLAGS_FOREGROUND) {
|
||||
|
+ if (flags & DAEMON_FLAGS_FOREGROUND &&
|
||||
|
+ !(flags & DAEMON_FLAGS_SYSTEMD_SERVICE)) {
|
||||
|
if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) { |
||||
|
fprintf(stderr, "%s: program is already running.\n", |
||||
|
program); |
||||
|
exit(1); |
||||
|
} |
||||
|
log_to_stderr(); |
||||
|
+ } else if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE) {
|
||||
|
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
||||
|
+ fprintf(stderr, "%s: program is already running.\n",
|
||||
|
+ program);
|
||||
|
+ exit(1);
|
||||
|
+ }
|
||||
|
+ open_log();
|
||||
|
} else { |
||||
|
int nullfd; |
||||
|
|
||||
|
@@ -1925,6 +1933,8 @@ static void usage(void)
|
||||
|
" -d --debug log debuging info\n" |
||||
|
" -Dvariable=value, --define variable=value\n" |
||||
|
" define global macro variable\n" |
||||
|
+ " -S --systemd-service\n"
|
||||
|
+ " run automounter as a systemd service\n"
|
||||
|
" -f --foreground do not fork into background\n" |
||||
|
" -r --random-multimount-selection\n" |
||||
|
" use ramdom replicated server selection\n" |
||||
|
@@ -2190,7 +2200,7 @@ int main(int argc, char *argv[])
|
||||
|
time_t timeout; |
||||
|
time_t age = monotonic_time(NULL); |
||||
|
struct rlimit rlim; |
||||
|
- const char *options = "+hp:t:vmdD:fVrO:l:n:CFM";
|
||||
|
+ const char *options = "+hp:t:vmdD:SfVrO:l:n:CFM";
|
||||
|
static const struct option long_options[] = { |
||||
|
{"help", 0, 0, 'h'}, |
||||
|
{"pid-file", 1, 0, 'p'}, |
||||
|
@@ -2198,6 +2208,7 @@ int main(int argc, char *argv[])
|
||||
|
{"verbose", 0, 0, 'v'}, |
||||
|
{"debug", 0, 0, 'd'}, |
||||
|
{"define", 1, 0, 'D'}, |
||||
|
+ {"systemd-service", 0, 0, 'S'},
|
||||
|
{"foreground", 0, 0, 'f'}, |
||||
|
{"random-multimount-selection", 0, 0, 'r'}, |
||||
|
{"negative-timeout", 1, 0, 'n'}, |
||||
|
@@ -2266,6 +2277,10 @@ int main(int argc, char *argv[])
|
||||
|
macro_parse_globalvar(optarg); |
||||
|
break; |
||||
|
|
||||
|
+ case 'S':
|
||||
|
+ flags |= DAEMON_FLAGS_SYSTEMD_SERVICE;
|
||||
|
+ break;
|
||||
|
+
|
||||
|
case 'f': |
||||
|
flags |= DAEMON_FLAGS_FOREGROUND; |
||||
|
break; |
||||
|
@@ -2653,7 +2668,8 @@ int main(int argc, char *argv[])
|
||||
|
} |
||||
|
|
||||
|
#ifdef WITH_SYSTEMD |
||||
|
- sd_notify(1, "READY=1");
|
||||
|
+ if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
|
||||
|
+ sd_notify(1, "READY=1");
|
||||
|
#endif |
||||
|
|
||||
|
state_mach_thid = pthread_self(); |
||||
|
diff --git a/include/automount.h b/include/automount.h
|
||||
|
index 848fd0be..45fde53e 100644
|
||||
|
--- a/include/automount.h
|
||||
|
+++ b/include/automount.h
|
||||
|
@@ -67,6 +67,7 @@
|
||||
|
#endif |
||||
|
|
||||
|
#define DAEMON_FLAGS_FOREGROUND 0x0001 |
||||
|
+#define DAEMON_FLAGS_SYSTEMD_SERVICE 0x0002
|
||||
|
#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004 |
||||
|
#define DAEMON_FLAGS_GHOST 0x0008 |
||||
|
#define DAEMON_FLAGS_CHECK_DAEMON 0x0010 |
||||
|
diff --git a/man/automount.8 b/man/automount.8
|
||||
|
index 68d2aaa3..9f92288e 100644
|
||||
|
--- a/man/automount.8
|
||||
|
+++ b/man/automount.8
|
||||
|
@@ -57,6 +57,10 @@ Define a global macro substitution variable. Global definitions
|
||||
|
are over-ridden macro definitions of the same name specified in |
||||
|
mount entries. |
||||
|
.TP |
||||
|
+.I \-S, \-\-systemd-service
|
||||
|
+Used when running the automounter as a systemd service to ensure log entry
|
||||
|
+format is consistent with the log entry format when running as a daemon.
|
||||
|
+.TP
|
||||
|
.I "\-f, \-\-foreground" |
||||
|
Run the daemon in the foreground and log to stderr instead of syslog." |
||||
|
.TP |
||||
|
diff --git a/samples/autofs.service.in b/samples/autofs.service.in
|
||||
|
index 281d31ef..175a806d 100644
|
||||
|
--- a/samples/autofs.service.in
|
||||
|
+++ b/samples/autofs.service.in
|
||||
|
@@ -6,7 +6,7 @@ Wants=network-online.target rpc-statd.service rpcbind.service
|
||||
|
[Service] |
||||
|
Type=notify |
||||
|
EnvironmentFile=-@@autofsconfdir@@/autofs |
||||
|
-ExecStart=@@sbindir@@/automount $OPTIONS --foreground --dont-check-daemon
|
||||
|
+ExecStart=@@sbindir@@/automount $OPTIONS --systemd-service --dont-check-daemon
|
||||
|
ExecReload=/usr/bin/kill -HUP $MAINPID |
||||
|
KillMode=process |
||||
|
TimeoutSec=180 |
@ -0,0 +1,138 @@ |
|||||
|
autofs-5.1.4 - better handle hesiod support not built in |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
The configure option --without-hesiod is not handled well. |
||||
|
|
||||
|
If this option is given and hesiod is seen in the master |
||||
|
map parser or the amd map parser issue a message telling |
||||
|
the user hesiod support isn't built in. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
lib/master_parse.y | 18 ++++++++++++++++-- |
||||
|
modules/amd_parse.y | 7 +++++++ |
||||
|
modules/parse_amd.c | 28 +++++++++++++++++++++++++--- |
||||
|
4 files changed, 49 insertions(+), 5 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 5a317f12..8e9bd665 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -40,6 +40,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix incorrect locking in sss lookup. |
||||
|
- fix amd parser opts option handling. |
||||
|
- fix possible NULL pointer dereference in get_defaults_entry(). |
||||
|
+- better handle hesiod support not built in.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
||||
|
index 84ca5ca1..9aa57327 100644
|
||||
|
--- a/lib/master_parse.y
|
||||
|
+++ b/lib/master_parse.y
|
||||
|
@@ -171,7 +171,14 @@ line:
|
||||
|
|
||||
|
if ((tmp = strchr($2, ','))) |
||||
|
*tmp++ = '\0'; |
||||
|
-
|
||||
|
+#ifndef WITH_HESIOD
|
||||
|
+ /* Map type or or map type parser is hesiod */
|
||||
|
+ if (!strcmp($2, "hesiod") || !strcmp(tmp, "hesiod")) {
|
||||
|
+ master_error("hesiod support not built in");
|
||||
|
+ local_free_vars();
|
||||
|
+ YYABORT;
|
||||
|
+ }
|
||||
|
+#endif
|
||||
|
if (type) |
||||
|
free(type); |
||||
|
type = master_strdup($2); |
||||
|
@@ -352,7 +359,14 @@ map: PATH
|
||||
|
|
||||
|
if ((tmp = strchr($1, ','))) |
||||
|
*tmp++ = '\0'; |
||||
|
-
|
||||
|
+#ifndef WITH_HESIOD
|
||||
|
+ /* Map type or or map type parser is hesiod */
|
||||
|
+ if (!strcmp($1, "hesiod") || !strcmp(tmp, "hesiod")) {
|
||||
|
+ master_error("hesiod support not built in");
|
||||
|
+ local_free_vars();
|
||||
|
+ YYABORT;
|
||||
|
+ }
|
||||
|
+#endif
|
||||
|
if (type) |
||||
|
free(type); |
||||
|
if (strcmp($1, "exec")) |
||||
|
diff --git a/modules/amd_parse.y b/modules/amd_parse.y
|
||||
|
index be923c2f..17fd9b20 100644
|
||||
|
--- a/modules/amd_parse.y
|
||||
|
+++ b/modules/amd_parse.y
|
||||
|
@@ -574,6 +574,13 @@ static int match_map_option_map_type(char *map_option, char *type)
|
||||
|
!strcmp(map_type, "nisplus") || |
||||
|
!strcmp(map_type, "ldap") || |
||||
|
!strcmp(map_type, "hesiod")) { |
||||
|
+#ifndef WITH_HESIOD
|
||||
|
+ if (!strcmp(map_type, "hesiod")) {
|
||||
|
+ amd_msg("hesiod support not built in");
|
||||
|
+ free(map_type);
|
||||
|
+ return 0;
|
||||
|
+ }
|
||||
|
+#endif
|
||||
|
amd_set_value(&entry.map_type, map_type); |
||||
|
} else if (!strcmp(map_type, "exec")) { |
||||
|
/* autofs uses "program" for "exec" map type */ |
||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||
|
index 7399d19e..0e48e5ce 100644
|
||||
|
--- a/modules/parse_amd.c
|
||||
|
+++ b/modules/parse_amd.c
|
||||
|
@@ -1871,15 +1871,25 @@ struct amd_entry *make_default_entry(struct autofs_point *ap,
|
||||
|
if (amd_parse_list(ap, defaults, &dflts, &sv)) |
||||
|
return NULL; |
||||
|
defaults_entry = list_entry(dflts.next, struct amd_entry, list); |
||||
|
- list_del_init(&defaults_entry->list);
|
||||
|
/* |
||||
|
* If map type isn't given try to inherit from |
||||
|
* parent. A NULL map type is valid and means |
||||
|
* use configured nss sources. |
||||
|
*/ |
||||
|
map_type = conf_amd_get_map_type(ap->path); |
||||
|
- if (map_type)
|
||||
|
+ if (map_type) {
|
||||
|
defaults_entry->map_type = map_type; |
||||
|
+#ifndef HAVE_HESIOD
|
||||
|
+ if (!strcmp(map_type, "hesiod")) {
|
||||
|
+ warn(ap->logopt, MODPREFIX
|
||||
|
+ "hesiod support not built in, "
|
||||
|
+ "defaults map entry not set");
|
||||
|
+ defaults_entry = NULL;
|
||||
|
+ }
|
||||
|
+#endif
|
||||
|
+ }
|
||||
|
+ if (defaults_entry)
|
||||
|
+ list_del_init(&defaults_entry->list);
|
||||
|
/* The list should now be empty .... */ |
||||
|
free_amd_entry_list(&dflts); |
||||
|
return defaults_entry; |
||||
|
@@ -2005,8 +2015,20 @@ static struct amd_entry *get_defaults_entry(struct autofs_point *ap,
|
||||
|
* use configured nss sources. |
||||
|
*/ |
||||
|
char *map_type = conf_amd_get_map_type(ap->path); |
||||
|
- if (map_type)
|
||||
|
+ if (map_type) {
|
||||
|
entry->map_type = map_type; |
||||
|
+#ifndef HAVE_HESIOD
|
||||
|
+ if (!strcmp(map_type, "hesiod")) {
|
||||
|
+ warn(ap->logopt, MODPREFIX
|
||||
|
+ "hesiod support not built in, "
|
||||
|
+ "attempting to use internal "
|
||||
|
+ "default");
|
||||
|
+ free_amd_entry(entry);
|
||||
|
+ free(expand);
|
||||
|
+ goto out;
|
||||
|
+ }
|
||||
|
+#endif
|
||||
|
+ }
|
||||
|
} |
||||
|
free(expand); |
||||
|
} |
@ -0,0 +1,46 @@ |
|||||
|
autofs-5.1.4 - fix age setting at startup |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Commit 2b567ace7d, which resets the master map list on startup |
||||
|
before retrying a read, incorrectly sets age using time() when |
||||
|
it should use monotonic_time(). |
||||
|
|
||||
|
This causes lookup failures for submounts in cases where a master |
||||
|
map read retry was needed. |
||||
|
|
||||
|
The failure happens because the mount entry age is greater than |
||||
|
the map entry age which is meant to indicate the map is no longer |
||||
|
valid which is not the case. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/automount.c | 2 +- |
||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 740f804f..c39aa0e5 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -30,6 +30,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- change expire type naming to better reflect usage. |
||||
|
- use defines for expire type. |
||||
|
- enable SIGUSR2 handling in rpm spec file. |
||||
|
+- fix age setting at startup.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||
|
index 3fbfb9aa..99534295 100644
|
||||
|
--- a/daemon/automount.c
|
||||
|
+++ b/daemon/automount.c
|
||||
|
@@ -2606,7 +2606,7 @@ int main(int argc, char *argv[])
|
||||
|
* we have anyway. |
||||
|
*/ |
||||
|
do_master_list_reset(master_list); |
||||
|
- age = time(NULL);
|
||||
|
+ age = monotonic_time(NULL);
|
||||
|
master_read_master(master_list, age, 1); |
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
autofs-5.1.4 - fix amd parser opts option handling |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
The recent implementation of the amd map program mount feature |
||||
|
introduced a regression in the amd parser where only the first |
||||
|
option of a comma separated list of is applied to a mount entry. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
modules/amd_parse.y | 4 ++-- |
||||
|
modules/parse_amd.c | 4 +++- |
||||
|
3 files changed, 6 insertions(+), 3 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index aa485e8f..0365a161 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -38,6 +38,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- add master map pseudo options for mount propagation. |
||||
|
- fix use after free in parse_ldap_config(). |
||||
|
- fix incorrect locking in sss lookup. |
||||
|
+- fix amd parser opts option handling.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/modules/amd_parse.y b/modules/amd_parse.y
|
||||
|
index 5bd688d9..be923c2f 100644
|
||||
|
--- a/modules/amd_parse.y
|
||||
|
+++ b/modules/amd_parse.y
|
||||
|
@@ -401,7 +401,7 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE
|
||||
|
} |
||||
|
| MNT_OPTION OPTION_ASSIGN options |
||||
|
{ |
||||
|
- if (!match_mnt_option_options($1, $3)) {
|
||||
|
+ if (!match_mnt_option_options($1, opts)) {
|
||||
|
amd_notify($1); |
||||
|
YYABORT; |
||||
|
} |
||||
|
@@ -409,7 +409,7 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE
|
||||
|
} |
||||
|
| MNT_OPTION OPTION_ASSIGN QUOTE options QUOTE |
||||
|
{ |
||||
|
- if (!match_mnt_option_options($1, $4)) {
|
||||
|
+ if (!match_mnt_option_options($1, opts)) {
|
||||
|
amd_notify($1); |
||||
|
YYABORT; |
||||
|
} |
||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||
|
index ea57270a..627c3c00 100644
|
||||
|
--- a/modules/parse_amd.c
|
||||
|
+++ b/modules/parse_amd.c
|
||||
|
@@ -2136,6 +2136,7 @@ int parse_mount(struct autofs_point *ap, const char *name,
|
||||
|
list_del_init(&this->list); |
||||
|
cur_defaults = this; |
||||
|
update_with_defaults(defaults_entry, cur_defaults, sv); |
||||
|
+ debug(ap->logopt, "merged /defaults entry with defaults");
|
||||
|
continue; |
||||
|
} else if (this->flags & AMD_DEFAULTS_RESET) { |
||||
|
struct amd_entry *nd, *new; |
||||
|
@@ -2174,8 +2175,9 @@ int parse_mount(struct autofs_point *ap, const char *name,
|
||||
|
|
||||
|
at_least_one = 1; |
||||
|
|
||||
|
- debug(ap->logopt, "expand mount entry");
|
||||
|
+ debug(ap->logopt, "update mount entry with defaults");
|
||||
|
update_with_defaults(cur_defaults, this, sv); |
||||
|
+ debug(ap->logopt, "expand mount entry");
|
||||
|
sv = expand_entry(ap, this, flags, sv); |
||||
|
sv = merge_entry_options(ap, this, sv); |
||||
|
normalize_sublink(ap->logopt, this, sv); |
@ -0,0 +1,44 @@ |
|||||
|
autofs-5.1.4 - fix incorrect locking in sss lookup |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Commit 766e0f6c4, autofs-5.0.7 - fix fix wildcard multi map regression, |
||||
|
introduced a deadlock during restart when the sss modules is used. |
||||
|
|
||||
|
Looking at the comment above the code which takes the lock it clearly |
||||
|
does this incorrectly. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
modules/lookup_sss.c | 4 ++-- |
||||
|
2 files changed, 3 insertions(+), 2 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 3bf86e84..aa485e8f 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -37,6 +37,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- set bind mount as propagation slave. |
||||
|
- add master map pseudo options for mount propagation. |
||||
|
- fix use after free in parse_ldap_config(). |
||||
|
+- fix incorrect locking in sss lookup.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
|
||||
|
index 88ec1693..78598300 100644
|
||||
|
--- a/modules/lookup_sss.c
|
||||
|
+++ b/modules/lookup_sss.c
|
||||
|
@@ -786,9 +786,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
* when we're starting up so just take the readlock in that |
||||
|
*/ |
||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||
|
- cache_writelock(mc);
|
||||
|
- else
|
||||
|
cache_readlock(mc); |
||||
|
+ else
|
||||
|
+ cache_writelock(mc);
|
||||
|
me = cache_lookup(mc, key); |
||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||
|
if (me && !me->mapent) { |
@ -0,0 +1,39 @@ |
|||||
|
autofs-5.1.4 - fix indent in automount(8) man page |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
The .P paragraph directive resets paragraph indentation but |
||||
|
the following sentence belongs to the comand line option |
||||
|
above. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
man/automount.8 | 2 +- |
||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 8e9bd665..1a9296f5 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -41,6 +41,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix amd parser opts option handling. |
||||
|
- fix possible NULL pointer dereference in get_defaults_entry(). |
||||
|
- better handle hesiod support not built in. |
||||
|
+- fix indent in automount(8) man page.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/man/automount.8 b/man/automount.8
|
||||
|
index 1e15ecd2..68d2aaa3 100644
|
||||
|
--- a/man/automount.8
|
||||
|
+++ b/man/automount.8
|
||||
|
@@ -106,7 +106,7 @@ will lead to everything (debug logging) being logged witch can then also
|
||||
|
be disabled, returning the daemon to verbose logging. This option can be |
||||
|
specified to change the logging priority of an already running automount |
||||
|
process. |
||||
|
-.P
|
||||
|
+
|
||||
|
The \fIpath\fP argument corresponds to the automounted |
||||
|
path name as specified in the master map. |
||||
|
.TP |
@ -0,0 +1,38 @@ |
|||||
|
autofs-5.1.4 - fix possible NULL pointer dereference in get_defaults_entry() |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Function select_default_entry() can call make_default_entry() so a NULL |
||||
|
return is possible. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
modules/parse_amd.c | 2 +- |
||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 0365a161..5a317f12 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -39,6 +39,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix use after free in parse_ldap_config(). |
||||
|
- fix incorrect locking in sss lookup. |
||||
|
- fix amd parser opts option handling. |
||||
|
+- fix possible NULL pointer dereference in get_defaults_entry().
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||
|
index 627c3c00..7399d19e 100644
|
||||
|
--- a/modules/parse_amd.c
|
||||
|
+++ b/modules/parse_amd.c
|
||||
|
@@ -1998,7 +1998,7 @@ static struct amd_entry *get_defaults_entry(struct autofs_point *ap,
|
||||
|
goto out; |
||||
|
} |
||||
|
entry = select_default_entry(ap, &dflts, sv); |
||||
|
- if (!entry->map_type) {
|
||||
|
+ if (entry && !entry->map_type) {
|
||||
|
/* |
||||
|
* If map type isn't given try to inherit from |
||||
|
* parent. A NULL map type is valid and means |
@ -0,0 +1,44 @@ |
|||||
|
autofs-5.1.4 - fix program usage message |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
There is a discrepancy between the list of options in the usage |
||||
|
message of automount(8) and the options listed in the man page. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/automount.c | 6 +++++- |
||||
|
2 files changed, 6 insertions(+), 1 deletion(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 70e043ee..f126de66 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -32,6 +32,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- enable SIGUSR2 handling in rpm spec file. |
||||
|
- fix age setting at startup. |
||||
|
- fix update_negative_cache() map source usage. |
||||
|
+- fix program usage message.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||
|
index 99534295..05ec8a62 100644
|
||||
|
--- a/daemon/automount.c
|
||||
|
+++ b/daemon/automount.c
|
||||
|
@@ -1893,9 +1893,13 @@ static void usage(void)
|
||||
|
" -h --help this text\n" |
||||
|
" -p --pid-file f write process id to file f\n" |
||||
|
" -t --timeout n auto-unmount in n seconds (0-disable)\n" |
||||
|
+ " -M --master-wait n\n"
|
||||
|
+ " maximum wait time (seconds) for master\n"
|
||||
|
+ " map to become available\n"
|
||||
|
" -v --verbose be verbose\n" |
||||
|
" -d --debug log debuging info\n" |
||||
|
- " -D --define define global macro variable\n"
|
||||
|
+ " -Dvariable=value, --define variable=value\n"
|
||||
|
+ " define global macro variable\n"
|
||||
|
" -f --foreground do not fork into background\n" |
||||
|
" -r --random-multimount-selection\n" |
||||
|
" use ramdom replicated server selection\n" |
@ -0,0 +1,102 @@ |
|||||
|
autofs-5.1.4 - fix update_negative_cache() map source usage |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
File map sources can be either plain text or executable. |
||||
|
|
||||
|
When the map path is specified without a type (eg. when a |
||||
|
full path is used) an instance map source is used and the |
||||
|
original map is left unchanged. |
||||
|
|
||||
|
But update_negative_cache() fails to take this into account |
||||
|
causing it to update the wrong map cache. |
||||
|
|
||||
|
When a map reload is done the map entry appears to not exist |
||||
|
so the new map entry is added. |
||||
|
|
||||
|
This could go unnoticed except that, after a map read, the |
||||
|
map entry cache cleans stale map entries and the existence |
||||
|
of this negative entry causes the new map entry to be deleted |
||||
|
and map lookups continue to fail. |
||||
|
|
||||
|
In hindsite the use of an instance map source for this is |
||||
|
probably uneccessary but changing it will be risky so, for |
||||
|
now, just make update_negative_cache() use the correct map. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/lookup.c | 38 ++++++++++++++++++++++++++++++++++++-- |
||||
|
2 files changed, 37 insertions(+), 2 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index c39aa0e5..70e043ee 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -31,6 +31,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- use defines for expire type. |
||||
|
- enable SIGUSR2 handling in rpm spec file. |
||||
|
- fix age setting at startup. |
||||
|
+- fix update_negative_cache() map source usage.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
||||
|
index 6a722b3b..418f01cb 100644
|
||||
|
--- a/daemon/lookup.c
|
||||
|
+++ b/daemon/lookup.c
|
||||
|
@@ -1100,6 +1100,37 @@ static enum nsswitch_status lookup_map_name(struct nss_source *this,
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
+static struct map_source *lookup_get_map_source(struct master_mapent *entry)
|
||||
|
+{
|
||||
|
+ struct map_source *map = entry->maps;
|
||||
|
+ struct stat st;
|
||||
|
+ char *type;
|
||||
|
+
|
||||
|
+ if (map->type || *map->argv[0] != '/')
|
||||
|
+ return map;
|
||||
|
+
|
||||
|
+ if (*(map->argv[0] + 1) == '/')
|
||||
|
+ return map;
|
||||
|
+
|
||||
|
+ if (stat(map->argv[0], &st) == -1)
|
||||
|
+ return NULL;
|
||||
|
+
|
||||
|
+ if (!S_ISREG(st.st_mode))
|
||||
|
+ return NULL;
|
||||
|
+
|
||||
|
+ if (st.st_mode & __S_IEXEC)
|
||||
|
+ type = "program";
|
||||
|
+ else
|
||||
|
+ type = "file";
|
||||
|
+
|
||||
|
+ /* This is a file source with a path starting with "/".
|
||||
|
+ * But file maps can be either plain text or executable
|
||||
|
+ * so they use a map instance and the actual map source
|
||||
|
+ * remains untouched.
|
||||
|
+ */
|
||||
|
+ return master_find_source_instance(map, type, map->format, 0, NULL);
|
||||
|
+}
|
||||
|
+
|
||||
|
static void update_negative_cache(struct autofs_point *ap, struct map_source *source, const char *name) |
||||
|
{ |
||||
|
struct master_mapent *entry = ap->entry; |
||||
|
@@ -1133,11 +1164,14 @@ static void update_negative_cache(struct autofs_point *ap, struct map_source *so
|
||||
|
logmsg("key \"%s\" not found in map source(s).", name); |
||||
|
} |
||||
|
|
||||
|
- /* Doesn't exist in any source, just add it somewhere */
|
||||
|
+ /* Doesn't exist in any source, just add it somewhere.
|
||||
|
+ * Also take care to use the same map source used by
|
||||
|
+ * map reads and key lookups for the update.
|
||||
|
+ */
|
||||
|
if (source) |
||||
|
map = source; |
||||
|
else |
||||
|
- map = entry->maps;
|
||||
|
+ map = lookup_get_map_source(entry);
|
||||
|
if (map) { |
||||
|
time_t now = monotonic_time(NULL); |
||||
|
int rv = CHE_FAIL; |
@ -0,0 +1,38 @@ |
|||||
|
autofs-5.1.4 - fix use after free in parse_ldap_config() |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Commit a4a2af5f30 (covarity fixes) incorrecly frees local variable |
||||
|
authtype after assigning it to a lookup context structure member. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
modules/lookup_ldap.c | 2 -- |
||||
|
2 files changed, 1 insertion(+), 2 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 4765a66e..3bf86e84 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -36,6 +36,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- mark removed cache entry negative. |
||||
|
- set bind mount as propagation slave. |
||||
|
- add master map pseudo options for mount propagation. |
||||
|
+- fix use after free in parse_ldap_config().
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
|
||||
|
index 06c96973..911a34a5 100644
|
||||
|
--- a/modules/lookup_ldap.c
|
||||
|
+++ b/modules/lookup_ldap.c
|
||||
|
@@ -1383,8 +1383,6 @@ auth_fail:
|
||||
|
user, secret ? "specified" : "unspecified", |
||||
|
client_princ, client_cc); |
||||
|
} |
||||
|
- if (authtype)
|
||||
|
- free(authtype);
|
||||
|
out: |
||||
|
xmlFreeDoc(doc); |
||||
|
if (auth_conf) |
@ -0,0 +1,68 @@ |
|||||
|
autofs-5.1.4 - mark removed cache entry negative |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
When re-reading a map, entries that have been removed are detected |
||||
|
and deleted from the map entry cache by lookup_prune_cache(). |
||||
|
|
||||
|
If a removed map entry is mounted at the time lookup_prune_cache() |
||||
|
is called the map entry is skipped. This is done becuase the next |
||||
|
lookup (following the mount expire, which needs the cache entry to |
||||
|
remain) will detect the stale cache entry and a map update done |
||||
|
resulting in the stale entry being removed. |
||||
|
|
||||
|
But if a map re-read is performed while the cache entry is mounted |
||||
|
the cache will appear to up to date so the removed entry will remain |
||||
|
valid even after it has expired. |
||||
|
|
||||
|
To cover this case it's sufficient to mark the mounted cache entry |
||||
|
negative during the cache prune which prevents further lookups from |
||||
|
using the stale entry. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/lookup.c | 12 +++++++++--- |
||||
|
2 files changed, 10 insertions(+), 3 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index f126de66..42950d51 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -33,6 +33,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix age setting at startup. |
||||
|
- fix update_negative_cache() map source usage. |
||||
|
- fix program usage message. |
||||
|
+- mark removed cache entry negative.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
||||
|
index 418f01cb..18df9352 100644
|
||||
|
--- a/daemon/lookup.c
|
||||
|
+++ b/daemon/lookup.c
|
||||
|
@@ -1417,15 +1417,21 @@ void lookup_prune_one_cache(struct autofs_point *ap, struct mapent_cache *mc, ti
|
||||
|
if (valid && valid->mc == mc) { |
||||
|
/* |
||||
|
* We've found a map entry that has been removed from |
||||
|
- * the current cache so it isn't really valid.
|
||||
|
+ * the current cache so it isn't really valid. Set the
|
||||
|
+ * mapent negative to prevent further mount requests
|
||||
|
+ * using the cache entry.
|
||||
|
*/ |
||||
|
+ debug(ap->logopt, "removed map entry detected, mark negative");
|
||||
|
+ if (valid->mapent) {
|
||||
|
+ free(valid->mapent);
|
||||
|
+ valid->mapent = NULL;
|
||||
|
+ }
|
||||
|
cache_unlock(valid->mc); |
||||
|
valid = NULL; |
||||
|
} |
||||
|
if (!valid && |
||||
|
is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) { |
||||
|
- debug(ap->logopt,
|
||||
|
- "prune check posponed, %s mounted", path);
|
||||
|
+ debug(ap->logopt, "prune posponed, %s mounted", path);
|
||||
|
free(key); |
||||
|
free(path); |
||||
|
continue; |
@ -0,0 +1,125 @@ |
|||||
|
autofs-5.1.4 - move close stdio descriptors to become_daemon() |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Move the stdio file descriptor close to the become_daemon() function |
||||
|
as closing these file descriptors, ie. detaching from ttys, is part |
||||
|
of the preperation for becoming a system daemon. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/automount.c | 27 ++++++++++++++++++++++++++- |
||||
|
include/log.h | 1 - |
||||
|
lib/log.c | 29 ----------------------------- |
||||
|
4 files changed, 27 insertions(+), 31 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 4c5f276e..4e1d9c98 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -46,6 +46,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- add NULL check in prepare_attempt_prefix(). |
||||
|
- update build info with systemd. |
||||
|
- use flags for startup boolean options. |
||||
|
+- move close stdio descriptors to become_daemon().
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||
|
index d891562a..c1360ed6 100644
|
||||
|
--- a/daemon/automount.c
|
||||
|
+++ b/daemon/automount.c
|
||||
|
@@ -1218,6 +1218,8 @@ static void become_daemon(unsigned int flags)
|
||||
|
} |
||||
|
log_to_stderr(); |
||||
|
} else { |
||||
|
+ int nullfd;
|
||||
|
+
|
||||
|
if (open_pipe(start_pipefd) < 0) { |
||||
|
fprintf(stderr, "%s: failed to create start_pipefd.\n", |
||||
|
program); |
||||
|
@@ -1261,7 +1263,30 @@ static void become_daemon(unsigned int flags)
|
||||
|
close(start_pipefd[1]); |
||||
|
exit(*pst_stat); |
||||
|
} |
||||
|
- log_to_syslog();
|
||||
|
+
|
||||
|
+ /* Redirect all our file descriptors to /dev/null */
|
||||
|
+ nullfd = open("/dev/null", O_RDWR);
|
||||
|
+ if (nullfd < 0) {
|
||||
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||
|
+ fprintf(stderr, "cannot open /dev/null: %s", estr);
|
||||
|
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
||||
|
+ close(start_pipefd[1]);
|
||||
|
+ exit(*pst_stat);
|
||||
|
+ }
|
||||
|
+
|
||||
|
+ if (dup2(nullfd, STDIN_FILENO) < 0 ||
|
||||
|
+ dup2(nullfd, STDOUT_FILENO) < 0 ||
|
||||
|
+ dup2(nullfd, STDERR_FILENO) < 0) {
|
||||
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||
|
+ fprintf(stderr,
|
||||
|
+ "redirecting file descriptors failed: %s", estr);
|
||||
|
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
||||
|
+ close(start_pipefd[1]);
|
||||
|
+ exit(*pst_stat);
|
||||
|
+ }
|
||||
|
+
|
||||
|
+ open_log();
|
||||
|
+ close(nullfd);
|
||||
|
} |
||||
|
|
||||
|
/* Write pid file if requested */ |
||||
|
diff --git a/include/log.h b/include/log.h
|
||||
|
index 7a394cbe..c9b17b3c 100644
|
||||
|
--- a/include/log.h
|
||||
|
+++ b/include/log.h
|
||||
|
@@ -36,7 +36,6 @@ extern void set_log_debug_ap(struct autofs_point *ap);
|
||||
|
extern void set_mnt_logging(unsigned global_logopt); |
||||
|
|
||||
|
extern void open_log(void); |
||||
|
-extern void log_to_syslog(void);
|
||||
|
extern void log_to_stderr(void); |
||||
|
|
||||
|
extern void log_info(unsigned int, const char* msg, ...); |
||||
|
diff --git a/lib/log.c b/lib/log.c
|
||||
|
index 41f95fe8..ca771d72 100644
|
||||
|
--- a/lib/log.c
|
||||
|
+++ b/lib/log.c
|
||||
|
@@ -314,35 +314,6 @@ void open_log(void)
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
-void log_to_syslog(void)
|
||||
|
-{
|
||||
|
- char buf[MAX_ERR_BUF];
|
||||
|
- int nullfd;
|
||||
|
-
|
||||
|
- open_log();
|
||||
|
-
|
||||
|
- /* Redirect all our file descriptors to /dev/null */
|
||||
|
- nullfd = open("/dev/null", O_RDWR);
|
||||
|
- if (nullfd < 0) {
|
||||
|
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||
|
- fprintf(stderr, "cannot open /dev/null: %s", estr);
|
||||
|
- exit(1);
|
||||
|
- }
|
||||
|
-
|
||||
|
- if (dup2(nullfd, STDIN_FILENO) < 0 ||
|
||||
|
- dup2(nullfd, STDOUT_FILENO) < 0 ||
|
||||
|
- dup2(nullfd, STDERR_FILENO) < 0) {
|
||||
|
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||
|
- fprintf(stderr,
|
||||
|
- "redirecting file descriptors failed: %s", estr);
|
||||
|
- exit(1);
|
||||
|
- }
|
||||
|
-
|
||||
|
- close(nullfd);
|
||||
|
-
|
||||
|
- return;
|
||||
|
-}
|
||||
|
-
|
||||
|
void log_to_stderr(void) |
||||
|
{ |
||||
|
if (syslog_open) { |
@ -0,0 +1,359 @@ |
|||||
|
autofs-5.1.4 - refactor negative map entry check |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Create a function to check for a negative map entry on lookup and use |
||||
|
it in each of the relevant modules. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
include/automount.h | 1 + |
||||
|
lib/cache.c | 30 ++++++++++++++++++++++++++++++ |
||||
|
modules/lookup_file.c | 22 ++-------------------- |
||||
|
modules/lookup_hesiod.c | 22 ++-------------------- |
||||
|
modules/lookup_hosts.c | 22 ++-------------------- |
||||
|
modules/lookup_ldap.c | 22 ++-------------------- |
||||
|
modules/lookup_nisplus.c | 22 ++-------------------- |
||||
|
modules/lookup_program.c | 22 ++-------------------- |
||||
|
modules/lookup_sss.c | 22 ++-------------------- |
||||
|
modules/lookup_yp.c | 22 ++-------------------- |
||||
|
11 files changed, 48 insertions(+), 160 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 21fc9ca7..0de3f31b 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -48,6 +48,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- use flags for startup boolean options. |
||||
|
- move close stdio descriptors to become_daemon(). |
||||
|
- add systemd service command line option. |
||||
|
+- refactor negative map entry check.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/include/automount.h b/include/automount.h
|
||||
|
index 45fde53e..947daa10 100644
|
||||
|
--- a/include/automount.h
|
||||
|
+++ b/include/automount.h
|
||||
|
@@ -223,6 +223,7 @@ struct mapent *cache_partial_match(struct mapent_cache *mc, const char *prefix);
|
||||
|
struct mapent *cache_partial_match_wild(struct mapent_cache *mc, const char *prefix); |
||||
|
int cache_add(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); |
||||
|
int cache_update_offset(struct mapent_cache *mc, const char *mkey, const char *key, const char *mapent, time_t age); |
||||
|
+int cache_lookup_negative(struct mapent *me, const char *key);
|
||||
|
void cache_update_negative(struct mapent_cache *mc, struct map_source *ms, const char *key, time_t timeout); |
||||
|
int cache_set_parents(struct mapent *mm); |
||||
|
int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); |
||||
|
diff --git a/lib/cache.c b/lib/cache.c
|
||||
|
index 44e323dd..d3b6642b 100644
|
||||
|
--- a/lib/cache.c
|
||||
|
+++ b/lib/cache.c
|
||||
|
@@ -771,6 +771,36 @@ done:
|
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
+/* Called with cache_lock held for map entry me and is released
|
||||
|
+ * on return.
|
||||
|
+ */
|
||||
|
+int cache_lookup_negative(struct mapent *me, const char *key)
|
||||
|
+{
|
||||
|
+ if (me->status >= monotonic_time(NULL)) {
|
||||
|
+ cache_unlock(me->mc);
|
||||
|
+ return CHE_UNAVAIL;
|
||||
|
+ } else {
|
||||
|
+ struct mapent_cache *smc = me->mc;
|
||||
|
+ struct mapent *sme;
|
||||
|
+
|
||||
|
+ if (me->mapent)
|
||||
|
+ cache_unlock(smc);
|
||||
|
+ else {
|
||||
|
+ cache_unlock(smc);
|
||||
|
+ cache_writelock(smc);
|
||||
|
+ sme = cache_lookup_distinct(smc, key);
|
||||
|
+ /* Negative timeout expired for non-existent entry. */
|
||||
|
+ if (sme && !sme->mapent) {
|
||||
|
+ if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
+ cache_delete(smc, key);
|
||||
|
+ }
|
||||
|
+ cache_unlock(smc);
|
||||
|
+ }
|
||||
|
+ }
|
||||
|
+
|
||||
|
+ return CHE_OK;
|
||||
|
+}
|
||||
|
+
|
||||
|
void cache_update_negative(struct mapent_cache *mc, |
||||
|
struct map_source *ms, const char *key, |
||||
|
time_t timeout) |
||||
|
diff --git a/modules/lookup_file.c b/modules/lookup_file.c
|
||||
|
index ed5caa47..6986830b 100644
|
||||
|
--- a/modules/lookup_file.c
|
||||
|
+++ b/modules/lookup_file.c
|
||||
|
@@ -1177,27 +1177,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, key);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, key);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
diff --git a/modules/lookup_hesiod.c b/modules/lookup_hesiod.c
|
||||
|
index b3278d20..54cf278c 100644
|
||||
|
--- a/modules/lookup_hesiod.c
|
||||
|
+++ b/modules/lookup_hesiod.c
|
||||
|
@@ -397,27 +397,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, name, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, name);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, name);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
/* If this is not here the filesystem stays busy, for some reason... */ |
||||
|
diff --git a/modules/lookup_hosts.c b/modules/lookup_hosts.c
|
||||
|
index 163b02d5..744062e2 100644
|
||||
|
--- a/modules/lookup_hosts.c
|
||||
|
+++ b/modules/lookup_hosts.c
|
||||
|
@@ -314,27 +314,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, name, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, name);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, name);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
cache_readlock(mc); |
||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
|
||||
|
index 911a34a5..f7432a2a 100644
|
||||
|
--- a/modules/lookup_ldap.c
|
||||
|
+++ b/modules/lookup_ldap.c
|
||||
|
@@ -3687,27 +3687,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, key);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, key);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
diff --git a/modules/lookup_nisplus.c b/modules/lookup_nisplus.c
|
||||
|
index 8dee4630..cbd03cdb 100644
|
||||
|
--- a/modules/lookup_nisplus.c
|
||||
|
+++ b/modules/lookup_nisplus.c
|
||||
|
@@ -709,27 +709,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, key);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, key);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
diff --git a/modules/lookup_program.c b/modules/lookup_program.c
|
||||
|
index 56e19394..fcb1af74 100644
|
||||
|
--- a/modules/lookup_program.c
|
||||
|
+++ b/modules/lookup_program.c
|
||||
|
@@ -601,27 +601,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, name, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, name);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, name);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
/* Catch installed direct offset triggers */ |
||||
|
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
|
||||
|
index 78598300..ce60acd3 100644
|
||||
|
--- a/modules/lookup_sss.c
|
||||
|
+++ b/modules/lookup_sss.c
|
||||
|
@@ -726,27 +726,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, key);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, key);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
diff --git a/modules/lookup_yp.c b/modules/lookup_yp.c
|
||||
|
index d1ffcae4..38f75497 100644
|
||||
|
--- a/modules/lookup_yp.c
|
||||
|
+++ b/modules/lookup_yp.c
|
||||
|
@@ -813,27 +813,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
||||
|
/* Check if we recorded a mount fail for this key anywhere */ |
||||
|
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
||||
|
if (me) { |
||||
|
- if (me->status >= monotonic_time(NULL)) {
|
||||
|
- cache_unlock(me->mc);
|
||||
|
+ /* negative timeout has not passed, return fail */
|
||||
|
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
||||
|
return NSS_STATUS_NOTFOUND; |
||||
|
- } else {
|
||||
|
- struct mapent_cache *smc = me->mc;
|
||||
|
- struct mapent *sme;
|
||||
|
-
|
||||
|
- if (me->mapent)
|
||||
|
- cache_unlock(smc);
|
||||
|
- else {
|
||||
|
- cache_unlock(smc);
|
||||
|
- cache_writelock(smc);
|
||||
|
- sme = cache_lookup_distinct(smc, key);
|
||||
|
- /* Negative timeout expired for non-existent entry. */
|
||||
|
- if (sme && !sme->mapent) {
|
||||
|
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
||||
|
- cache_delete(smc, key);
|
||||
|
- }
|
||||
|
- cache_unlock(smc);
|
||||
|
- }
|
||||
|
- }
|
||||
|
} |
||||
|
|
||||
|
/* |
@ -0,0 +1,236 @@ |
|||||
|
autofs-5.1.4 - remove autofs4 module load code |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
The autofs kernel module has finally been renamed from autofs4 to |
||||
|
autofs so autoloading works so there is no need for manual loading. |
||||
|
|
||||
|
The module load function has been commented out in the source for |
||||
|
a long time so there should not be any adverse affects from removing |
||||
|
it. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
configure | 61 --------------------------------------------------- |
||||
|
configure.in | 1 - |
||||
|
daemon/automount.c | 8 ------- |
||||
|
daemon/module.c | 35 ----------------------------- |
||||
|
include/automount.h | 7 ------ |
||||
|
include/config.h.in | 6 ----- |
||||
|
7 files changed, 1 insertion(+), 118 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 1a9296f5..0a56df5a 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -42,6 +42,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix possible NULL pointer dereference in get_defaults_entry(). |
||||
|
- better handle hesiod support not built in. |
||||
|
- fix indent in automount(8) man page. |
||||
|
+- remove autofs4 module load code.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/configure b/configure
|
||||
|
index 827921ba..2116668a 100755
|
||||
|
--- a/configure
|
||||
|
+++ b/configure
|
||||
|
@@ -659,8 +659,6 @@ PATH_YACC
|
||||
|
YACC |
||||
|
PATH_LEX |
||||
|
LEX |
||||
|
-HAVE_MODPROBE
|
||||
|
-MODPROBE
|
||||
|
HAVE_E4FSCK |
||||
|
E4FSCK |
||||
|
HAVE_E3FSCK |
||||
|
@@ -4155,65 +4153,6 @@ else
|
||||
|
HAVE_E4FSCK=0 |
||||
|
fi |
||||
|
|
||||
|
-for ac_prog in modprobe
|
||||
|
-do
|
||||
|
- # Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
|
-set dummy $ac_prog; ac_word=$2
|
||||
|
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
|
-$as_echo_n "checking for $ac_word... " >&6; }
|
||||
|
-if ${ac_cv_path_MODPROBE+:} false; then :
|
||||
|
- $as_echo_n "(cached) " >&6
|
||||
|
-else
|
||||
|
- case $MODPROBE in
|
||||
|
- [\\/]* | ?:[\\/]*)
|
||||
|
- ac_cv_path_MODPROBE="$MODPROBE" # Let the user override the test with a path.
|
||||
|
- ;;
|
||||
|
- *)
|
||||
|
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
|
-for as_dir in $searchpath
|
||||
|
-do
|
||||
|
- IFS=$as_save_IFS
|
||||
|
- test -z "$as_dir" && as_dir=.
|
||||
|
- for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
|
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
|
- ac_cv_path_MODPROBE="$as_dir/$ac_word$ac_exec_ext"
|
||||
|
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
|
- break 2
|
||||
|
- fi
|
||||
|
-done
|
||||
|
- done
|
||||
|
-IFS=$as_save_IFS
|
||||
|
-
|
||||
|
- ;;
|
||||
|
-esac
|
||||
|
-fi
|
||||
|
-MODPROBE=$ac_cv_path_MODPROBE
|
||||
|
-if test -n "$MODPROBE"; then
|
||||
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MODPROBE" >&5
|
||||
|
-$as_echo "$MODPROBE" >&6; }
|
||||
|
-else
|
||||
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
|
-$as_echo "no" >&6; }
|
||||
|
-fi
|
||||
|
-
|
||||
|
-
|
||||
|
- test -n "$MODPROBE" && break
|
||||
|
-done
|
||||
|
-
|
||||
|
-if test -n "$MODPROBE"; then
|
||||
|
-
|
||||
|
-$as_echo "#define HAVE_MODPROBE 1" >>confdefs.h
|
||||
|
-
|
||||
|
-
|
||||
|
-cat >>confdefs.h <<_ACEOF
|
||||
|
-#define PATH_MODPROBE "$MODPROBE"
|
||||
|
-_ACEOF
|
||||
|
-
|
||||
|
- HAVE_MODPROBE=1
|
||||
|
-else
|
||||
|
- HAVE_MODPROBE=0
|
||||
|
-fi
|
||||
|
-
|
||||
|
|
||||
|
for ac_prog in flex lex |
||||
|
do |
||||
|
diff --git a/configure.in b/configure.in
|
||||
|
index 4b0a81f2..dbee99f4 100644
|
||||
|
--- a/configure.in
|
||||
|
+++ b/configure.in
|
||||
|
@@ -161,7 +161,6 @@ AF_PATH_INCLUDE(UMOUNT, umount, /bin/umount, $searchpath)
|
||||
|
AF_PATH_INCLUDE(E2FSCK, fsck.ext2 e2fsck, , $searchpath) |
||||
|
AF_PATH_INCLUDE(E3FSCK, fsck.ext3 e3fsck, , $searchpath) |
||||
|
AF_PATH_INCLUDE(E4FSCK, fsck.ext4 e4fsck, , $searchpath) |
||||
|
-AF_PATH_INCLUDE(MODPROBE, modprobe, , $searchpath)
|
||||
|
|
||||
|
AF_CHECK_PROG(LEX, flex lex, , $searchpath) |
||||
|
AF_CHECK_PROG(YACC, bison, , $searchpath) |
||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||
|
index 05ec8a62..2c0def54 100644
|
||||
|
--- a/daemon/automount.c
|
||||
|
+++ b/daemon/automount.c
|
||||
|
@@ -2336,14 +2336,6 @@ int main(int argc, char *argv[])
|
||||
|
exit(exit_code); |
||||
|
} |
||||
|
|
||||
|
-#if 0
|
||||
|
- if (!load_autofs4_module()) {
|
||||
|
- fprintf(stderr, "%s: can't load %s filesystem module.\n",
|
||||
|
- program, FS_MODULE_NAME);
|
||||
|
- exit(1);
|
||||
|
- }
|
||||
|
-#endif
|
||||
|
-
|
||||
|
/* Don't need the kernel module just to look at the configured maps */ |
||||
|
if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) { |
||||
|
fprintf(stderr, |
||||
|
diff --git a/daemon/module.c b/daemon/module.c
|
||||
|
index b1a94f56..be96a82b 100644
|
||||
|
--- a/daemon/module.c
|
||||
|
+++ b/daemon/module.c
|
||||
|
@@ -19,41 +19,6 @@
|
||||
|
#include "automount.h" |
||||
|
#include "nsswitch.h" |
||||
|
|
||||
|
-int load_autofs4_module(void)
|
||||
|
-{
|
||||
|
- FILE *fp;
|
||||
|
- char buf[PATH_MAX];
|
||||
|
- int ret;
|
||||
|
-
|
||||
|
- /*
|
||||
|
- * Check if module already loaded or compiled in.
|
||||
|
- * If both autofs v3 and v4 are coplied in and
|
||||
|
- * the v3 module registers first or the v4 module
|
||||
|
- * is an older version we will catch it at mount
|
||||
|
- * time.
|
||||
|
- */
|
||||
|
- fp = open_fopen_r("/proc/filesystems");
|
||||
|
- if (!fp) {
|
||||
|
- logerr("cannot open /proc/filesystems");
|
||||
|
- return 0;
|
||||
|
- }
|
||||
|
-
|
||||
|
- while (fgets(buf, sizeof(buf), fp)) {
|
||||
|
- if (strstr(buf, "autofs")) {
|
||||
|
- fclose(fp);
|
||||
|
- return 1;
|
||||
|
- }
|
||||
|
- }
|
||||
|
- fclose(fp);
|
||||
|
-
|
||||
|
- ret = spawnl(LOGOPT_NONE, PATH_MODPROBE, PATH_MODPROBE,
|
||||
|
- "-q", FS_MODULE_NAME, NULL);
|
||||
|
- if (ret)
|
||||
|
- return 0;
|
||||
|
-
|
||||
|
- return 1;
|
||||
|
-}
|
||||
|
-
|
||||
|
int open_lookup(const char *name, const char *err_prefix, const char *mapfmt, |
||||
|
int argc, const char *const *argv, struct lookup_mod **lookup) |
||||
|
{ |
||||
|
diff --git a/include/automount.h b/include/automount.h
|
||||
|
index 417dacbb..eccd16aa 100644
|
||||
|
--- a/include/automount.h
|
||||
|
+++ b/include/automount.h
|
||||
|
@@ -52,17 +52,10 @@
|
||||
|
#error Failed to locate umount(8)! |
||||
|
#endif |
||||
|
|
||||
|
-#ifndef HAVE_MODPROBE
|
||||
|
-#error Failed to locate modprobe(8)!
|
||||
|
-#endif
|
||||
|
-
|
||||
|
#ifndef HAVE_LINUX_PROCFS |
||||
|
#error Failed to verify existence of procfs filesystem! |
||||
|
#endif |
||||
|
|
||||
|
-#define FS_MODULE_NAME "autofs4"
|
||||
|
-int load_autofs4_module(void);
|
||||
|
-
|
||||
|
/* The -s (sloppy) option to mount is good, if we have it... */ |
||||
|
|
||||
|
#ifdef HAVE_SLOPPY_MOUNT |
||||
|
diff --git a/include/config.h.in b/include/config.h.in
|
||||
|
index 991a2bda..a4879494 100644
|
||||
|
--- a/include/config.h.in
|
||||
|
+++ b/include/config.h.in
|
||||
|
@@ -48,9 +48,6 @@
|
||||
|
/* Define to 1 if you have the <memory.h> header file. */ |
||||
|
#undef HAVE_MEMORY_H |
||||
|
|
||||
|
-/* define if you have MODPROBE */
|
||||
|
-#undef HAVE_MODPROBE
|
||||
|
-
|
||||
|
/* define if you have MOUNT */ |
||||
|
#undef HAVE_MOUNT |
||||
|
|
||||
|
@@ -129,9 +126,6 @@
|
||||
|
/* define if you have LEX */ |
||||
|
#undef PATH_LEX |
||||
|
|
||||
|
-/* define if you have MODPROBE */
|
||||
|
-#undef PATH_MODPROBE
|
||||
|
-
|
||||
|
/* define if you have MOUNT */ |
||||
|
#undef PATH_MOUNT |
||||
|
|
@ -0,0 +1,38 @@ |
|||||
|
autofs-5.1.4 - remove couple of undeeded requires |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Remove a couple of apparently undeeded Requires entries from the tar |
||||
|
spec file. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
autofs.spec | 2 +- |
||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 2a551426..5e1bdf42 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -51,6 +51,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- refactor negative map entry check. |
||||
|
- remove unused function dump_master(). |
||||
|
- remove unused function dump_state_queue(). |
||||
|
+- remove couple of undeeded requires.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/autofs.spec b/autofs.spec
|
||||
|
index 6419e3e3..53654437 100644
|
||||
|
--- a/autofs.spec
|
||||
|
+++ b/autofs.spec
|
||||
|
@@ -39,7 +39,7 @@ BuildRequires: libtirpc-devel
|
||||
|
%endif |
||||
|
BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, cyrus-sasl-devel |
||||
|
Requires: chkconfig |
||||
|
-Requires: /bin/bash mktemp sed textutils sh-utils grep /bin/ps
|
||||
|
+Requires: /bin/bash sed grep /bin/ps
|
||||
|
%if %{with_systemd} |
||||
|
Requires(post): systemd-sysv |
||||
|
Requires(post): systemd-units |
@ -0,0 +1,41 @@ |
|||||
|
autofs-5.1.4 - remove unused function dump_master() |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
lib/master.c | 11 ----------- |
||||
|
2 files changed, 1 insertion(+), 11 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 0de3f31b..32e34e35 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -49,6 +49,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- move close stdio descriptors to become_daemon(). |
||||
|
- add systemd service command line option. |
||||
|
- refactor negative map entry check. |
||||
|
+- remove unused function dump_master().
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/lib/master.c b/lib/master.c
|
||||
|
index ba5272f0..5f3a3d99 100644
|
||||
|
--- a/lib/master.c
|
||||
|
+++ b/lib/master.c
|
||||
|
@@ -1965,14 +1965,3 @@ int master_kill(struct master *master)
|
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
-
|
||||
|
-void dump_master(struct master *master)
|
||||
|
-{
|
||||
|
- struct list_head *p, *head;
|
||||
|
-
|
||||
|
- head = &master->mounts;
|
||||
|
- list_for_each(p, head) {
|
||||
|
- struct master_mapent *this = list_entry(p, struct master_mapent, list);
|
||||
|
- logmsg("path %s", this->path);
|
||||
|
- }
|
||||
|
-}
|
@ -0,0 +1,57 @@ |
|||||
|
autofs-5.1.4 - remove unused function dump_state_queue() |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/state.c | 24 ------------------------ |
||||
|
2 files changed, 1 insertion(+), 24 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 32e34e35..2a551426 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -50,6 +50,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- add systemd service command line option. |
||||
|
- refactor negative map entry check. |
||||
|
- remove unused function dump_master(). |
||||
|
+- remove unused function dump_state_queue().
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/state.c b/daemon/state.c
|
||||
|
index 3d91f5b1..ca9534c4 100644
|
||||
|
--- a/daemon/state.c
|
||||
|
+++ b/daemon/state.c
|
||||
|
@@ -52,30 +52,6 @@ void st_mutex_unlock(void)
|
||||
|
fatal(status); |
||||
|
} |
||||
|
|
||||
|
-void dump_state_queue(void)
|
||||
|
-{
|
||||
|
- struct list_head *head = &state_queue;
|
||||
|
- struct list_head *p, *q;
|
||||
|
-
|
||||
|
- logmsg("dumping queue");
|
||||
|
-
|
||||
|
- list_for_each(p, head) {
|
||||
|
- struct state_queue *entry;
|
||||
|
-
|
||||
|
- entry = list_entry(p, struct state_queue, list);
|
||||
|
- logmsg("queue list head path %s state %d busy %d",
|
||||
|
- entry->ap->path, entry->state, entry->busy);
|
||||
|
-
|
||||
|
- list_for_each(q, &entry->pending) {
|
||||
|
- struct state_queue *this;
|
||||
|
-
|
||||
|
- this = list_entry(q, struct state_queue, pending);
|
||||
|
- logmsg("queue list entry path %s state %d busy %d",
|
||||
|
- this->ap->path, this->state, this->busy);
|
||||
|
- }
|
||||
|
- }
|
||||
|
-}
|
||||
|
-
|
||||
|
void nextstate(int statefd, enum states next) |
||||
|
{ |
||||
|
char buf[MAX_ERR_BUF]; |
@ -0,0 +1,73 @@ |
|||||
|
autofs-5.1.4 - set bind mount as propagation slave |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
When using a multi-mount with mount targets that are on the |
||||
|
local machine and resulting bind mounts are made to a file |
||||
|
system that is mount propagation shared (such as the root |
||||
|
file system on systemd managed systems) the autofs offset |
||||
|
mount triggers made within the bind mount will be propagated |
||||
|
back to the target file system. |
||||
|
|
||||
|
When this happens the target of the offset (the unwanted |
||||
|
propagated mount) is itself an autofs trigger mount and |
||||
|
accessing the path results in a deadlock. |
||||
|
|
||||
|
In order for these multi-mounts to function properly in this |
||||
|
case bind mounts that contain mount triggers must be set to |
||||
|
propagation slave or private so the backward propagation |
||||
|
doesn't occur. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
modules/mount_bind.c | 16 +++++++++++++++- |
||||
|
2 files changed, 16 insertions(+), 1 deletion(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index 42950d51..88829564 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -34,6 +34,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix update_negative_cache() map source usage. |
||||
|
- fix program usage message. |
||||
|
- mark removed cache entry negative. |
||||
|
+- set bind mount as propagation slave.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
|
||||
|
index 5effa880..fe1ad9b6 100644
|
||||
|
--- a/modules/mount_bind.c
|
||||
|
+++ b/modules/mount_bind.c
|
||||
|
@@ -20,6 +20,7 @@
|
||||
|
#include <sys/param.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <sys/stat.h> |
||||
|
+#include <sys/mount.h>
|
||||
|
|
||||
|
#define MODULE_MOUNT |
||||
|
#include "automount.h" |
||||
|
@@ -183,8 +184,21 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||
|
debug(ap->logopt, |
||||
|
MODPREFIX "mounted %s type %s on %s", |
||||
|
what, fstype, fullpath); |
||||
|
- return 0;
|
||||
|
} |
||||
|
+
|
||||
|
+ /* The bind mount has succeeded but if the target
|
||||
|
+ * mount is propagation shared propagation of child
|
||||
|
+ * mounts (autofs offset mounts for example) back to
|
||||
|
+ * the target of the bind mount must be avoided or
|
||||
|
+ * autofs trigger mounts will deadlock.
|
||||
|
+ */
|
||||
|
+ err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
|
||||
|
+ if (err)
|
||||
|
+ warn(ap->logopt,
|
||||
|
+ "failed to set propagation type for %s",
|
||||
|
+ fullpath);
|
||||
|
+
|
||||
|
+ return 0;
|
||||
|
} else { |
||||
|
char *cp; |
||||
|
char basepath[PATH_MAX]; |
@ -0,0 +1,45 @@ |
|||||
|
autofs-5.1.4 - update build info with systemd |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
Update the show_build_info() function to include systemd |
||||
|
build info. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/automount.c | 9 +++++++++ |
||||
|
2 files changed, 10 insertions(+) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index ad9932a2..b30e52c6 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -44,6 +44,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- fix indent in automount(8) man page. |
||||
|
- remove autofs4 module load code. |
||||
|
- add NULL check in prepare_attempt_prefix(). |
||||
|
+- update build info with systemd.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||
|
index 2c0def54..a99d6b33 100644
|
||||
|
--- a/daemon/automount.c
|
||||
|
+++ b/daemon/automount.c
|
||||
|
@@ -1951,6 +1951,15 @@ static void show_build_info(void)
|
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
+#ifdef WITH_SYSTEMD
|
||||
|
+ printf("WITH_SYSTEMD ");
|
||||
|
+ count = count + 13;
|
||||
|
+
|
||||
|
+ if (count > 60) {
|
||||
|
+ printf("\n ");
|
||||
|
+ count = 0;
|
||||
|
+ }
|
||||
|
+#endif
|
||||
|
|
||||
|
#ifdef WITH_HESIOD |
||||
|
printf("WITH_HESIOD "); |
@ -0,0 +1,225 @@ |
|||||
|
autofs-5.1.4 - use flags for startup boolean options |
||||
|
|
||||
|
From: Ian Kent <raven@themaw.net> |
||||
|
|
||||
|
The daemon uses a number of boolean flags each stored in unsigned int |
||||
|
variables. But a single bit flag is sufficient storage for most of |
||||
|
these flags. |
||||
|
|
||||
|
So use bit flags for these where possible. |
||||
|
|
||||
|
Signed-off-by: Ian Kent <raven@themaw.net> |
||||
|
---
|
||||
|
CHANGELOG | 1 + |
||||
|
daemon/automount.c | 45 ++++++++++++++++++++++----------------------- |
||||
|
include/automount.h | 6 ++++++ |
||||
|
lib/master.c | 4 ++-- |
||||
|
4 files changed, 31 insertions(+), 25 deletions(-) |
||||
|
|
||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||
|
index b30e52c6..4c5f276e 100644
|
||||
|
--- a/CHANGELOG
|
||||
|
+++ b/CHANGELOG
|
||||
|
@@ -45,6 +45,7 @@ xx/xx/2018 autofs-5.1.5
|
||||
|
- remove autofs4 module load code. |
||||
|
- add NULL check in prepare_attempt_prefix(). |
||||
|
- update build info with systemd. |
||||
|
+- use flags for startup boolean options.
|
||||
|
|
||||
|
19/12/2017 autofs-5.1.4 |
||||
|
- fix spec file url. |
||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||
|
index a99d6b33..d891562a 100644
|
||||
|
--- a/daemon/automount.c
|
||||
|
+++ b/daemon/automount.c
|
||||
|
@@ -1195,7 +1195,7 @@ static int handle_packet(struct autofs_point *ap)
|
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
-static void become_daemon(unsigned foreground, unsigned daemon_check)
|
||||
|
+static void become_daemon(unsigned int flags)
|
||||
|
{ |
||||
|
FILE *pidfp; |
||||
|
char buf[MAX_ERR_BUF]; |
||||
|
@@ -1210,8 +1210,8 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
|
||||
|
} |
||||
|
|
||||
|
/* Detach from foreground process */ |
||||
|
- if (foreground) {
|
||||
|
- if (daemon_check && !aquire_flag_file()) {
|
||||
|
+ if (flags & DAEMON_FLAGS_FOREGROUND) {
|
||||
|
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
||||
|
fprintf(stderr, "%s: program is already running.\n", |
||||
|
program); |
||||
|
exit(1); |
||||
|
@@ -1238,7 +1238,7 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
|
||||
|
} |
||||
|
close(start_pipefd[0]); |
||||
|
|
||||
|
- if (daemon_check && !aquire_flag_file()) {
|
||||
|
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
||||
|
fprintf(stderr, "%s: program is already running.\n", |
||||
|
program); |
||||
|
/* Return success if already running */ |
||||
|
@@ -2158,8 +2158,8 @@ int main(int argc, char *argv[])
|
||||
|
{ |
||||
|
int res, opt, status; |
||||
|
int logpri = -1; |
||||
|
- unsigned ghost, logging, daemon_check;
|
||||
|
- unsigned dumpmaps, foreground, have_global_options;
|
||||
|
+ unsigned int flags;
|
||||
|
+ unsigned int logging;
|
||||
|
unsigned master_read; |
||||
|
int master_wait; |
||||
|
time_t timeout; |
||||
|
@@ -2202,17 +2202,15 @@ int main(int argc, char *argv[])
|
||||
|
|
||||
|
nfs_mount_uses_string_options = check_nfs_mount_version(&vers, &check); |
||||
|
|
||||
|
+ flags = defaults_get_browse_mode() ? DAEMON_FLAGS_GHOST : 0;
|
||||
|
+ flags |= DAEMON_FLAGS_CHECK_DAEMON;
|
||||
|
+
|
||||
|
kpkt_len = get_kpkt_len(); |
||||
|
master_wait = defaults_get_master_wait(); |
||||
|
timeout = defaults_get_timeout(); |
||||
|
- ghost = defaults_get_browse_mode();
|
||||
|
logging = defaults_get_logging(); |
||||
|
global_selection_options = 0; |
||||
|
global_options = NULL; |
||||
|
- have_global_options = 0;
|
||||
|
- foreground = 0;
|
||||
|
- dumpmaps = 0;
|
||||
|
- daemon_check = 1;
|
||||
|
|
||||
|
remove_empty_args(argv, &argc); |
||||
|
|
||||
|
@@ -2244,7 +2242,7 @@ int main(int argc, char *argv[])
|
||||
|
break; |
||||
|
|
||||
|
case 'f': |
||||
|
- foreground = 1;
|
||||
|
+ flags |= DAEMON_FLAGS_FOREGROUND;
|
||||
|
break; |
||||
|
|
||||
|
case 'V': |
||||
|
@@ -2260,7 +2258,7 @@ int main(int argc, char *argv[])
|
||||
|
break; |
||||
|
|
||||
|
case 'm': |
||||
|
- dumpmaps = 1;
|
||||
|
+ flags |= DAEMON_FLAGS_DUMP_MAPS;
|
||||
|
break; |
||||
|
|
||||
|
case 'M': |
||||
|
@@ -2268,9 +2266,9 @@ int main(int argc, char *argv[])
|
||||
|
break; |
||||
|
|
||||
|
case 'O': |
||||
|
- if (!have_global_options) {
|
||||
|
+ if (!(flags & DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS)) {
|
||||
|
global_options = strdup(optarg); |
||||
|
- have_global_options = 1;
|
||||
|
+ flags |= DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS;
|
||||
|
break; |
||||
|
} |
||||
|
printf("%s: global options already specified.\n", |
||||
|
@@ -2295,7 +2293,7 @@ int main(int argc, char *argv[])
|
||||
|
break; |
||||
|
|
||||
|
case 'C': |
||||
|
- daemon_check = 0;
|
||||
|
+ flags &= ~DAEMON_FLAGS_CHECK_DAEMON;
|
||||
|
break; |
||||
|
|
||||
|
case 'F': |
||||
|
@@ -2346,7 +2344,8 @@ int main(int argc, char *argv[])
|
||||
|
} |
||||
|
|
||||
|
/* Don't need the kernel module just to look at the configured maps */ |
||||
|
- if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) {
|
||||
|
+ if (!(flags & DAEMON_FLAGS_DUMP_MAPS) &&
|
||||
|
+ (!query_kproto_ver() || get_kver_major() < 5)) {
|
||||
|
fprintf(stderr, |
||||
|
"%s: test mount forbidden or " |
||||
|
"incorrect kernel protocol version, " |
||||
|
@@ -2377,7 +2376,7 @@ int main(int argc, char *argv[])
|
||||
|
/* Get processor information for predefined escapes */ |
||||
|
macro_init(); |
||||
|
|
||||
|
- if (dumpmaps) {
|
||||
|
+ if (flags & DAEMON_FLAGS_DUMP_MAPS) {
|
||||
|
struct master_mapent *entry; |
||||
|
struct list_head *head, *p; |
||||
|
struct mapent_cache *nc; |
||||
|
@@ -2395,9 +2394,9 @@ int main(int argc, char *argv[])
|
||||
|
} |
||||
|
|
||||
|
if (master) |
||||
|
- master_list = master_new(NULL, timeout, ghost);
|
||||
|
+ master_list = master_new(NULL, timeout, flags);
|
||||
|
else |
||||
|
- master_list = master_new(master, timeout, ghost);
|
||||
|
+ master_list = master_new(master, timeout, flags);
|
||||
|
if (!master_list) { |
||||
|
printf("%s: can't create master map", program); |
||||
|
macro_free_global_table(); |
||||
|
@@ -2443,9 +2442,9 @@ int main(int argc, char *argv[])
|
||||
|
} |
||||
|
|
||||
|
if (argc == 0) |
||||
|
- master_list = master_new(NULL, timeout, ghost);
|
||||
|
+ master_list = master_new(NULL, timeout, flags);
|
||||
|
else |
||||
|
- master_list = master_new(argv[0], timeout, ghost);
|
||||
|
+ master_list = master_new(argv[0], timeout, flags);
|
||||
|
|
||||
|
if (!master_list) { |
||||
|
printf("%s: can't create master map %s", program, argv[0]); |
||||
|
@@ -2453,7 +2452,7 @@ int main(int argc, char *argv[])
|
||||
|
exit(1); |
||||
|
} |
||||
|
|
||||
|
- become_daemon(foreground, daemon_check);
|
||||
|
+ become_daemon(flags);
|
||||
|
|
||||
|
if (pthread_attr_init(&th_attr)) { |
||||
|
logerr("%s: failed to init thread attribute struct!", |
||||
|
diff --git a/include/automount.h b/include/automount.h
|
||||
|
index eccd16aa..848fd0be 100644
|
||||
|
--- a/include/automount.h
|
||||
|
+++ b/include/automount.h
|
||||
|
@@ -66,6 +66,12 @@
|
||||
|
#define SLOPPY |
||||
|
#endif |
||||
|
|
||||
|
+#define DAEMON_FLAGS_FOREGROUND 0x0001
|
||||
|
+#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004
|
||||
|
+#define DAEMON_FLAGS_GHOST 0x0008
|
||||
|
+#define DAEMON_FLAGS_CHECK_DAEMON 0x0010
|
||||
|
+#define DAEMON_FLAGS_DUMP_MAPS 0x0020
|
||||
|
+
|
||||
|
#define AUTOFS_SUPER_MAGIC 0x00000187L |
||||
|
#define SMB_SUPER_MAGIC 0x0000517BL |
||||
|
#define CIFS_MAGIC_NUMBER 0xFF534D42L |
||||
|
diff --git a/lib/master.c b/lib/master.c
|
||||
|
index 76717d57..ba5272f0 100644
|
||||
|
--- a/lib/master.c
|
||||
|
+++ b/lib/master.c
|
||||
|
@@ -922,7 +922,7 @@ void master_free_mapent(struct master_mapent *entry)
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
-struct master *master_new(const char *name, unsigned int timeout, unsigned int ghost)
|
||||
|
+struct master *master_new(const char *name, unsigned int timeout, unsigned int flags)
|
||||
|
{ |
||||
|
struct master *master; |
||||
|
char *tmp; |
||||
|
@@ -948,7 +948,7 @@ struct master *master_new(const char *name, unsigned int timeout, unsigned int g
|
||||
|
master->depth = 0; |
||||
|
master->reading = 0; |
||||
|
master->read_fail = 0; |
||||
|
- master->default_ghost = ghost;
|
||||
|
+ master->default_ghost = flags & DAEMON_FLAGS_GHOST;
|
||||
|
master->default_timeout = timeout; |
||||
|
master->default_logging = defaults_get_logging(); |
||||
|
master->logopt = master->default_logging; |
Loading…
Reference in new issue