diff -Nur autofs-4.1.3.orig/daemon/automount.c autofs-4.1.3/daemon/automount.c --- autofs-4.1.3.orig/daemon/automount.c 2004-04-05 21:14:10.000000000 +0800 +++ autofs-4.1.3/daemon/automount.c 2004-06-05 21:13:28.000000000 +0800 @@ -99,8 +99,11 @@ if (stat(buf, &st) == 0 && !S_ISDIR(st.st_mode)) errno = ENOTDIR; - else - continue; + else { + /* last component, return -1 */ + if (*cp != '\0') + continue; + } } return -1; } @@ -1088,9 +1091,11 @@ close(ap.state_pipe[0]); close(ap.state_pipe[1]); + chdir(ap.path); err = ap.lookup->lookup_mount(ap.path, pkt->name, pkt->len, ap.lookup->context); + chdir("/"); /* * If at first you don't succeed, hide all @@ -1163,8 +1168,11 @@ it. */ + chdir(ap.path); ret = ap.lookup->lookup_mount(ap.path, name, namelen, ap.lookup->context); + chdir("/"); + if (ret) error("failed to recover from partial expiry of %s\n", buf); diff -Nur autofs-4.1.3.orig/modules/mount_bind.c autofs-4.1.3/modules/mount_bind.c --- autofs-4.1.3.orig/modules/mount_bind.c 2004-05-10 20:44:30.000000000 +0800 +++ autofs-4.1.3/modules/mount_bind.c 2004-06-05 18:12:38.000000000 +0800 @@ -107,15 +107,19 @@ fullpath[i] = '\0'; if (bind_works) { - int status; + int status, existed = 1; debug(MODPREFIX "calling mkdir_path %s", fullpath); - if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) { + status = mkdir_path(fullpath, 0555); + if (status && errno != EEXIST) { error(MODPREFIX "mkdir_path %s failed: %m", fullpath); return 1; } + if (!status) + existed = 0; + if (is_mounted(fullpath)) { warn("BUG: %s already mounted", fullpath); return 0; @@ -130,7 +134,7 @@ unlink(AUTOFS_LOCK); if (err) { - if (!ap.ghost && name_len) + if ((!ap.ghost && name_len) || !existed) rmdir_path(name); return 1; } else { diff -Nur autofs-4.1.3.orig/modules/mount_changer.c autofs-4.1.3/modules/mount_changer.c --- autofs-4.1.3.orig/modules/mount_changer.c 2004-05-10 20:44:30.000000000 +0800 +++ autofs-4.1.3/modules/mount_changer.c 2004-06-05 18:18:04.000000000 +0800 @@ -52,7 +52,7 @@ { char *fullpath; int err; - int status; + int status, existed = 1; fstype = "iso9660"; @@ -80,11 +80,15 @@ debug(MODPREFIX "calling mkdir_path %s", fullpath); - if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) { + status = mkdir_path(fullpath, 0555); + if (status && errno != EEXIST) { error(MODPREFIX "mkdir_path %s failed: %m", fullpath); return 1; } + if (!status) + existed = 0; + debug(MODPREFIX "Swapping CD to slot %s", name); err = swapCD(what, name); @@ -111,7 +115,7 @@ unlink(AUTOFS_LOCK); if (err) { - if (!ap.ghost && name_len) + if ((!ap.ghost && name_len) || !existed) rmdir_path(name); error(MODPREFIX "failed to mount %s (type %s) on %s", diff -Nur autofs-4.1.3.orig/modules/mount_ext2.c autofs-4.1.3/modules/mount_ext2.c --- autofs-4.1.3.orig/modules/mount_ext2.c 2004-05-10 20:44:30.000000000 +0800 +++ autofs-4.1.3/modules/mount_ext2.c 2004-06-05 18:23:09.000000000 +0800 @@ -40,7 +40,6 @@ return 0; } - int mount_mount(const char *root, const char *name, int name_len, const char *what, const char *fstype, const char *options, void *context) { @@ -48,7 +47,7 @@ const char *p, *p1; int err, ro = 0; const char *fsck_prog; - int status; + int status, existed = 1; fullpath = alloca(strlen(root) + name_len + 2); if (!fullpath) { @@ -63,11 +62,15 @@ debug(MODPREFIX "calling mkdir_path %s", fullpath); - if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) { + status = mkdir_path(fullpath, 0555); + if (status && errno != EEXIST) { error(MODPREFIX "mkdir_path %s failed: %m", fullpath); return 1; } + if (!status) + existed = 0; + if (is_mounted(fullpath)) { error("BUG: %s already mounted", fullpath); return 0; @@ -120,7 +123,7 @@ unlink(AUTOFS_LOCK); if (err) { - if (!ap.ghost && name_len) + if ((!ap.ghost && name_len) || !existed) rmdir_path(name); error(MODPREFIX "failed to mount %s (type %s) on %s", what, fstype, fullpath); diff -Nur autofs-4.1.3.orig/modules/mount_generic.c autofs-4.1.3/modules/mount_generic.c --- autofs-4.1.3.orig/modules/mount_generic.c 2004-05-10 20:44:30.000000000 +0800 +++ autofs-4.1.3/modules/mount_generic.c 2004-06-05 18:22:10.000000000 +0800 @@ -46,7 +46,7 @@ { char *fullpath; int err; - int status; + int status, existed = 1; fullpath = alloca(strlen(root) + name_len + 2); if (!fullpath) { @@ -61,11 +61,15 @@ debug(MODPREFIX "calling mkdir_path %s", fullpath); - if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) { + status = mkdir_path(fullpath, 0555); + if (status && errno != EEXIST) { error(MODPREFIX "mkdir_path %s failed: %m", fullpath); return 1; } + if (!status) + existed = 0; + if (is_mounted(fullpath)) { error("BUG: %s already mounted", fullpath); return 0; @@ -89,7 +93,7 @@ unlink(AUTOFS_LOCK); if (err) { - if (!ap.ghost && name_len) + if ((!ap.ghost && name_len) || !existed) rmdir_path(name); error(MODPREFIX "failed to mount %s (type %s) on %s", diff -Nur autofs-4.1.3.orig/modules/mount_nfs.c autofs-4.1.3/modules/mount_nfs.c --- autofs-4.1.3.orig/modules/mount_nfs.c 2004-06-05 14:24:58.000000000 +0800 +++ autofs-4.1.3/modules/mount_nfs.c 2004-06-05 21:10:17.000000000 +0800 @@ -445,14 +445,19 @@ whatstr, "bind", NULL, mount_bind->context); } else { /* Not a local host - do an NFS mount */ - int status; + int status, existed = 1; debug(MODPREFIX "calling mkdir_path %s", fullpath); - if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) { + + status = mkdir_path(fullpath, 0555); + if (status && errno != EEXIST) { error(MODPREFIX "mkdir_path %s failed: %m", fullpath); return 1; } + if (!status) + existed = 0; + if (is_mounted(fullpath)) { error("BUG: %s already mounted", fullpath); return 0; @@ -477,8 +482,9 @@ unlink(AUTOFS_LOCK); if (err) { - if (!ap.ghost && name_len) + if ((!ap.ghost && name_len) || !existed) rmdir_path(name); + error(MODPREFIX "nfs: mount failure %s on %s", whatstr, fullpath); return 1;