On Sun, Apr 26, 2009 at 10:36:28AM -0600, Thomas Connell wrote:
>
> I gave it a shot; I am largely a complete C novice, but:
Right, and I find working with the Debian packaging system a bit of a
nightmare. That's why I was hoping you would do this for me.
>
> Following the debugging from the nfs module, the log shows:
> Apr 26 09:49:30 web6 automount[3920]: mount_mount: mount(bind):
> root=/domains/f/federalhousingtaxcredit.com name=/
> what=/www/vhosts/f/federalhousingtaxcredit.com, fstype=bind, options=
>
> Which all looks right to me.
Me too, but it isn't, as we now see from your effort.
>
> Since I could see in the logs that fullpath was garbled, I was wondering
> if maybe alloca wasn't getting the right length. I did a bit of trial
> and error, and it seems consistent that fullpaths of 33 or over become
> garbled.
>
> So, in mount_bind.c, I added:
>
> debug(ap->logopt, MODPREFIX "name_len=%d", name_len);
>
> right after
>
> int i, rlen;
>
> and
>
> debug(ap->logopt, MODPREFIX "name_len=%d rlen=%d", name_len, rlen);
>
> right after
>
> rlen = strlen(root);
>
>
> The logs show:
>
> Apr 26 10:05:46 web6 automount[7353]: mount_mount: mount(bind): name_len=0
> Apr 26 10:05:46 web6 automount[7353]: mount_mount: mount(bind): name_len=0
> rlen=0
That is wrong.
It's due to improper use of name_len in modules/mount_nfs.c:mount_mount()
as, in 5.0.3, name_len is set to 0 prior to the call to perform the bind
mount.
The problem now is that this has been fixed in 5.0.4 as part of a much
larger patch.
The hunk in that patch, which should stand alone anyway, is:
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index d7f42a7..0b253d8 100644
--- a/modules/mount_nfs.c
+++ b/modules/mount_nfs.c
@@ -64,7 +64,7 @@ int mount_mount(struct autofs_point *ap, const char *root,
const char *name, int
struct host *this, *hosts = NULL;
unsigned int vers;
char *nfsoptions = NULL;
- int len, rlen, status, err, existed = 1;
+ int len, status, err, existed = 1;
int nosymlink = 0;
int ro = 0; /* Set if mount bind should be read-only */
@@ -146,30 +146,18 @@ int mount_mount(struct autofs_point *ap, const char
*root, const char *name, int
/* Construct and perhaps create mount point directory */
/* Root offset of multi-mount */
- if (*name == '/' && name_len == 1) {
- rlen = strlen(root);
- name_len = 0;
+ len = strlen(root);
+ if (root[len - 1] == '/') {
+ fullpath = alloca(len);
+ len = snprintf(fullpath, len, "%s", root);
/* Direct mount name is absolute path so don't use root */
- } else if (*name == '/')
- rlen = 0;
- else
- rlen = strlen(root);
-
- fullpath = alloca(rlen + name_len + 2);
- if (!fullpath) {
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
- logerr(MODPREFIX "alloca: %s", estr);
- free_host_list(&hosts);
- return 1;
- }
-
- if (name_len) {
- if (rlen)
- len = sprintf(fullpath, "%s/%s", root, name);
- else
- len = sprintf(fullpath, "%s", name);
- } else
+ } else if (*name == '/') {
+ fullpath = alloca(len + 1);
len = sprintf(fullpath, "%s", root);
+ } else {
+ fullpath = alloca(len + name_len + 2);
+ len = sprintf(fullpath, "%s/%s", root, name);
+ }
fullpath[len] = '\0';
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs