]> git.pld-linux.org Git - packages/autofs.git/commitdiff
- patches from http://www.kernel.org/pub/linux/daemons/autofs/v4/ auto/ac/autofs-4_1_3-1
authorundefine <undefine@pld-linux.org>
Thu, 23 Sep 2004 17:16:27 +0000 (17:16 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    autofs-4.1.3-bad_chdir.patch -> 1.1
    autofs-4.1.3-mtab_lock.patch -> 1.1
    autofs-4.1.3-non_block_ping.patch -> 1.1
    autofs-4.1.3-signal-race-fix.patch -> 1.1
    autofs-4.1.3-sock-leak-fix.patch -> 1.1
    autofs-4.1.3-strict.patch -> 1.1

autofs-4.1.3-bad_chdir.patch [new file with mode: 0644]
autofs-4.1.3-mtab_lock.patch [new file with mode: 0644]
autofs-4.1.3-non_block_ping.patch [new file with mode: 0644]
autofs-4.1.3-signal-race-fix.patch [new file with mode: 0644]
autofs-4.1.3-sock-leak-fix.patch [new file with mode: 0644]
autofs-4.1.3-strict.patch [new file with mode: 0644]

diff --git a/autofs-4.1.3-bad_chdir.patch b/autofs-4.1.3-bad_chdir.patch
new file mode 100644 (file)
index 0000000..79c38d9
--- /dev/null
@@ -0,0 +1,233 @@
+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;
diff --git a/autofs-4.1.3-mtab_lock.patch b/autofs-4.1.3-mtab_lock.patch
new file mode 100644 (file)
index 0000000..46c9fac
--- /dev/null
@@ -0,0 +1,11 @@
+--- autofs-4.1.3.orig/include/automount.h      2004-05-18 20:20:08.000000000 +0800
++++ autofs-4.1.3/include/automount.h   2004-06-05 16:26:39.000000000 +0800
+@@ -36,7 +36,7 @@
+ #define DEFAULT_TIMEOUT (5*60)                        /* 5 minutes */
+ #define AUTOFS_LOCK   "/var/lock/autofs"      /* To serialize access to mount */
+-#define MOUNTED_LOCK  "_PATH_MOUNTED~"        /* mounts' lock file */
++#define MOUNTED_LOCK  _PATH_MOUNTED "~"       /* mounts' lock file */
+ #define MTAB_NOTUPDATED 0x1000                        /* mtab succeded but not updated */
+ #define NOT_MOUNTED     0x0100                        /* path notmounted */
diff --git a/autofs-4.1.3-non_block_ping.patch b/autofs-4.1.3-non_block_ping.patch
new file mode 100644 (file)
index 0000000..f365084
--- /dev/null
@@ -0,0 +1,343 @@
+diff -Nur autofs-4.1.3.orig/lib/rpc_subs.c autofs-4.1.3/lib/rpc_subs.c
+--- autofs-4.1.3.orig/lib/rpc_subs.c   2004-06-14 21:55:29.000000000 +0800
++++ autofs-4.1.3/lib/rpc_subs.c        2004-06-14 21:54:35.000000000 +0800
+@@ -1,38 +1,284 @@
++/* ----------------------------------------------------------------------- *
++ *   
++ *  rpc_subs.c - routines for rpc discovery
++ *
++ *   Copyright 2004 Ian Kent <raven@themaw.net> - All Rights Reserved
++ *   Copyright 2004 Jeff Moyer <jmoyer@redaht.com> - All Rights Reserved
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
++ *   USA; either version 2 of the License, or (at your option) any later
++ *   version; incorporated herein by reference.
++ *
++ * ----------------------------------------------------------------------- */
++
+ #include <rpc/rpc.h>
++#include <rpc/pmap_prot.h>
+ #include <nfs/nfs.h>
+ #include <linux/nfs2.h>
+ #include <linux/nfs3.h>
+ #include <rpc/xdr.h>
+- 
++
++#include <unistd.h>
++#include <sys/socket.h>
++#include <netdb.h>
++#include <netinet/in.h>
++#include <sys/fcntl.h>
++#include <errno.h>
++
+ #include "automount.h"
++#define PMAP_TOUT_UDP 2
++#define PMAP_TOUT_TCP 3
++
++struct conn_info {
++      const char *host;
++      unsigned short port;
++      unsigned long program;
++      unsigned long version;
++      struct protoent *proto;
++      unsigned int send_sz;
++      unsigned int recv_sz;
++      struct timeval timeout;
++};
++
++/*
++ * Create a UDP RPC client
++ */
++static CLIENT* create_udp_client(struct conn_info *info)
++{
++      int fd = -1;
++      CLIENT *client;
++      struct sockaddr_in addr;
++      struct hostent *hp;
++
++      if (info->proto->p_proto != IPPROTO_UDP)
++              return NULL;
++
++      memset(&addr, 0, sizeof(addr));
++
++      hp = gethostbyname(info->host);
++      if (!hp)
++              return NULL;
++
++      addr.sin_family = AF_INET;
++      addr.sin_port = htons(info->port);
++      memcpy(&addr.sin_addr.s_addr, hp->h_addr, hp->h_length);
++
++      client = clntudp_bufcreate(&addr,
++                                 info->program, info->version,
++                                 info->timeout, &fd,
++                                 info->send_sz, info->recv_sz);
++
++      return client;
++}
++
++/*
++ *  Perform a non-blocking connect on the socket fd.
++ *
++ *  tout contains the timeout.  It will be modified to contain the time
++ *  remaining (i.e. time provided - time elasped).
++ */
++static int connect_nb(int fd, struct sockaddr_in *addr, struct timeval *tout)
++{
++      int flags, ret, len;
++      fd_set wset, rset;
++
++      flags = fcntl(fd, F_GETFL, 0);
++      if (flags < 0)
++              return -1;
++
++      ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
++      if (ret < 0)
++              return -1;
++
++      /* 
++       * From here on subsequent sys calls could change errno so
++       * we set ret = -errno to capture it in case we decide to
++       * use it later.
++       */
++      ret = connect(fd, (struct sockaddr *)addr, sizeof(struct sockaddr));
++      if (ret < 0 && errno != EINPROGRESS) {
++              ret = -errno;
++              goto done;
++      }
++
++      if (ret == 0)
++              goto done;
++
++      /* now wait */
++      FD_ZERO(&rset);
++      FD_SET(fd, &rset);
++      wset = rset;
++
++      ret = select(fd + 1, &rset, &wset, NULL, tout);
++      if (ret <= 0) {
++              if (ret == 0)
++                      ret = -ETIMEDOUT;
++              else
++                      ret = -errno;
++              goto done;
++      }
++
++      if (FD_ISSET(fd, &rset) || FD_ISSET(fd, &wset)) {
++              int stat;
++
++              len = sizeof(ret);
++              stat = getsockopt(fd, SOL_SOCKET, SO_ERROR, &ret, &len);
++              if (stat < 0) {
++                      ret = -errno;
++                      goto done;
++              }
++
++              /* Oops - something wrong with connect */
++              if (ret)
++                      ret = -ret;
++      }
++
++done:
++      fcntl(fd, F_SETFL, flags);
++      return ret;
++}
++
++/*
++ * Create a TCP RPC client using non-blocking connect
++ */
++static CLIENT* create_tcp_client(struct conn_info *info)
++{
++      int fd;
++      CLIENT *client;
++      struct sockaddr_in addr;
++      struct hostent *hp;
++      int ret;
++
++      if (info->proto->p_proto != IPPROTO_TCP)
++              return NULL;
++
++      memset(&addr, 0, sizeof(addr));
++
++      hp = gethostbyname(info->host);
++      if (!hp)
++              return NULL;
++
++      addr.sin_family = AF_INET;
++      addr.sin_port = htons(info->port);
++      memcpy(&addr.sin_addr.s_addr, hp->h_addr, hp->h_length);
++
++      fd = socket(PF_INET, SOCK_STREAM, info->proto->p_proto);
++      if (fd < 0)
++              return NULL;
++
++      ret = connect_nb(fd, &addr, &info->timeout);
++      if (ret < 0)
++              goto out_close;
++
++      client = clnttcp_create(&addr,
++                              info->program, info->version, &fd,
++                              info->send_sz, info->recv_sz);
++      if (!client)
++              goto out_close;
++
++      return client;
++
++out_close:
++      close(fd);
++      return NULL;
++}
++
++static unsigned short portmap_getport(struct conn_info *info)
++{
++      struct conn_info pmap_info;
++      unsigned short port = 0;
++      CLIENT *client;
++      enum clnt_stat stat;
++      struct pmap parms;
++
++      pmap_info.host = info->host;
++      pmap_info.port = PMAPPORT;
++      pmap_info.program = PMAPPROG;
++      pmap_info.version = PMAPVERS;
++      pmap_info.proto = info->proto;
++      pmap_info.send_sz = RPCSMALLMSGSIZE;
++      pmap_info.recv_sz = RPCSMALLMSGSIZE;
++      pmap_info.timeout.tv_sec = PMAP_TOUT_UDP;
++      pmap_info.timeout.tv_usec = 0;
++
++      if (info->proto->p_proto == IPPROTO_TCP) {
++              pmap_info.timeout.tv_sec = PMAP_TOUT_TCP;
++              client = create_tcp_client(&pmap_info);
++      } else
++              client = create_udp_client(&pmap_info);
++
++      if (!client)
++              return 0;
++      
++      parms.pm_prog = info->program;
++      parms.pm_vers = info->version;
++      parms.pm_prot = info->proto->p_proto;
++      parms.pm_port = 0;
++
++      stat = clnt_call(client, PMAPPROC_GETPORT,
++                       (xdrproc_t) xdr_pmap, (caddr_t) &parms,
++                       (xdrproc_t) xdr_u_short, (caddr_t) &port,
++                       pmap_info.timeout);
++
++      clnt_destroy(client);
++
++      if (stat != RPC_SUCCESS)
++              return 0;
++
++      return port;
++}
++
+ static int rpc_ping_proto(const char *host,
+-                        unsigned long nfs_version, const char *proto,
++                        unsigned long nfs_version,
++                        const char *proto,
+                         long seconds, long micros)
+ {
++      struct conn_info info;
+       CLIENT *client;
+-      struct timeval tout;
+       enum clnt_stat stat;
++      struct protoent *prot;
++
++      prot = getprotobyname(proto);
++      if (!prot)
++              return 1;
++
++      info.host = host;
++      info.program = NFS_PROGRAM;
++      info.version = nfs_version;
++      info.proto = prot;
++      info.send_sz = 0;
++      info.recv_sz = 0;
++      info.timeout.tv_sec = seconds;
++      info.timeout.tv_usec = micros;
+-      client = clnt_create(host, NFS_PROGRAM, nfs_version, proto);
+-      if (client == NULL) {
++      info.port = portmap_getport(&info);
++      if (!info.port)
+               return 0;
+-      }
+-      tout.tv_sec = seconds;
+-      tout.tv_usec = micros;
++      if (prot->p_proto == IPPROTO_UDP) {
++              info.send_sz = UDPMSGSIZE;
++              info.recv_sz = UDPMSGSIZE;
++              client = create_udp_client(&info);
++      } else
++              client = create_tcp_client(&info);
++
++      if (!client)
++              return 0;
+-      clnt_control(client, CLSET_TIMEOUT, (char *)&tout);
+-      clnt_control(client, CLSET_RETRY_TIMEOUT, (char *)&tout);
++      clnt_control(client, CLSET_TIMEOUT, (char *) &info.timeout);
++      clnt_control(client, CLSET_RETRY_TIMEOUT, (char *) &info.timeout);
+       stat = clnt_call(client, NFSPROC_NULL,
+-                       (xdrproc_t)xdr_void, 0, (xdrproc_t)xdr_void, 0, tout);
++                       (xdrproc_t) xdr_void, 0, (xdrproc_t) xdr_void, 0,
++                       info.timeout);
+       clnt_destroy(client);
+-      if (stat != RPC_SUCCESS) {
++      if (stat != RPC_SUCCESS)
+               return 0;
+-      }
+       return 1;
+ }
+@@ -108,10 +354,39 @@
+       taken = elapsed(start, end);
+-      if (result != NULL) {
++      if (result != NULL)
+               *result = taken;
+-      }
+       return status;
+ }
++#if 0
++#include <stdio.h>
++
++int main(int argc, char **argv)
++{
++      int ret;
++      double res = 0.0;
++
++      ret = rpc_ping("budgie", 10, 0);
++      printf("ret = %d\n", ret);
++
++      res = 0.0;
++      ret = rpc_time("raven", NFS2_VERSION, RPC_PING_TCP, 10, 0, &res);
++      printf("v2 tcp ret = %d, res = %f\n", ret, res);
++
++      res = 0.0;
++      ret = rpc_time("raven", NFS3_VERSION, RPC_PING_TCP, 10, 0, &res);
++      printf("v3 tcp ret = %d, res = %f\n", ret, res);
++
++      res = 0.0;
++      ret = rpc_time("raven", NFS2_VERSION, RPC_PING_UDP, 10, 0, &res);
++      printf("v2 udp ret = %d, res = %f\n", ret, res);
++
++      res = 0.0;
++      ret = rpc_time("raven", NFS3_VERSION, RPC_PING_UDP, 10, 0, &res);
++      printf("v3 udp ret = %d, res = %f\n", ret, res);
++
++      exit(0);
++}
++#endif
diff --git a/autofs-4.1.3-signal-race-fix.patch b/autofs-4.1.3-signal-race-fix.patch
new file mode 100644 (file)
index 0000000..1906e46
--- /dev/null
@@ -0,0 +1,25 @@
+--- autofs-4.1.3/daemon/automount.c.orig       2004-08-18 11:23:49.430470256 -0400
++++ autofs-4.1.3/daemon/automount.c    2004-08-18 11:24:45.047015256 -0400
+@@ -848,10 +848,10 @@ static int st_prepare_shutdown(void)
+       alarm(0);
+       /* Prevent any new mounts */
+-      ap.state = ST_SHUTDOWN_PENDING;
+-
+       sigprocmask(SIG_SETMASK, &lock_sigs, NULL);
++      ap.state = ST_SHUTDOWN_PENDING;
++
+       /* Unmount everything */
+       exp = expire_proc(1);
+@@ -919,8 +919,8 @@ static int st_expire(void)
+               return 1;
+       case EXP_STARTED:
+-              ap.state = ST_EXPIRE;
+               sigprocmask(SIG_SETMASK, &ready_sigs, NULL);
++              ap.state = ST_EXPIRE;
+               return 0;
+       }
+       return 1;
diff --git a/autofs-4.1.3-sock-leak-fix.patch b/autofs-4.1.3-sock-leak-fix.patch
new file mode 100644 (file)
index 0000000..df7d9bc
--- /dev/null
@@ -0,0 +1,50 @@
+--- autofs-4.1.3-devel/lib/rpc_subs.c~ 2004-08-04 13:20:30.000000000 -0400
++++ autofs-4.1.3-devel/lib/rpc_subs.c  2004-08-18 13:37:14.123571936 -0400
+@@ -34,6 +34,7 @@
+ struct conn_info {
+       const char *host;
++      int fd;
+       unsigned short port;
+       unsigned long program;
+       unsigned long version;
+@@ -48,7 +49,6 @@ struct conn_info {
+  */
+ static CLIENT* create_udp_client(struct conn_info *info)
+ {
+-      int fd = -1;
+       CLIENT *client;
+       struct sockaddr_in addr;
+       struct hostent *hp;
+@@ -62,13 +62,14 @@ static CLIENT* create_udp_client(struct 
+       if (!hp)
+               return NULL;
++      info->fd = RPC_ANYSOCK;
+       addr.sin_family = AF_INET;
+       addr.sin_port = htons(info->port);
+       memcpy(&addr.sin_addr.s_addr, hp->h_addr, hp->h_length);
+       client = clntudp_bufcreate(&addr,
+                                  info->program, info->version,
+-                                 info->timeout, &fd,
++                                 info->timeout, &info->fd,
+                                  info->send_sz, info->recv_sz);
+       return client;
+@@ -169,6 +170,7 @@ static CLIENT* create_tcp_client(struct 
+       if (!client)
+               goto out_close;
++      info->fd = fd;
+       return client;
+ out_close:
+@@ -214,6 +216,7 @@ static unsigned short portmap_getport(st
+                        pmap_info.timeout);
+       clnt_destroy(client);
++      close(pmap_info.fd);
+       if (stat != RPC_SUCCESS)
+               return 0;
diff --git a/autofs-4.1.3-strict.patch b/autofs-4.1.3-strict.patch
new file mode 100644 (file)
index 0000000..8ff11a4
--- /dev/null
@@ -0,0 +1,56 @@
+
+Problem: infinite error loop occurs when trying to access non-exitent
+         directory.
+
+This patch, for 4.1.3, fixes the problem caused when the default for
+multi-mounts was changed from strict to non-strict. This change tickled
+a bug in the old autofs4 kernel module found in 2.4 kernels and 2.6
+kernels to date (ie. < 2.6.7).
+
+This change in default caused a small change in mount logic which went
+unnoticed and lead to this problem. So the kernel interaction problem
+remains but is much less likely to occur. If this problem persists
+after applying this patch then update your kernel autofs4.
+
+The patch restores the previous logic but leaves the new default.
+
+diff -Nur autofs-4.1.3.orig/modules/parse_sun.c autofs-4.1.3/modules/parse_sun.c
+--- autofs-4.1.3.orig/modules/parse_sun.c      2004-05-18 20:22:40.000000000 +0800
++++ autofs-4.1.3/modules/parse_sun.c   2004-05-29 15:38:42.000000000 +0800
+@@ -602,10 +602,8 @@
+                             options);
+       }
+-      if (nonstrict && rv) {
+-              debug("ignoring failure of non-strict mount");
+-              return 0;
+-      }
++      if (nonstrict && rv)
++              return -rv;
+       return rv;
+ }
+@@ -746,7 +744,11 @@
+                       free(loc);
+                       free(myoptions);
+-                      if (rv)
++                      /* Convert non-strict failure into success */
++                      if (rv < 0) {
++                              rv = 0;
++                              debug("parse_mount: ignoring failure of non-strict mount");
++                      } else if (rv > 0)
+                               break;
+               } while (*p == '/');
+@@ -789,6 +791,10 @@
+                     options, loclen, loc);
+               rv = sun_mount(root, name, name_len, loc, loclen, options);
++              /* non-strict failure to normal failure for ordinary mount */
++              if (rv < 0)
++                      rv = -rv;
++                      
+               free(loc);
+               free(options);
+       }
This page took 0.07928 seconds and 4 git commands to generate.