Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1fb64bfc45b9ee5092b72474a5df216b8a0c7ff9
Commit:     1fb64bfc45b9ee5092b72474a5df216b8a0c7ff9
Parent:     953f868138dbf4300196780379476ab9f07f263a
Author:     Steve French <[EMAIL PROTECTED]>
AuthorDate: Thu Nov 1 02:12:10 2007 +0000
Committer:  Steve French <[EMAIL PROTECTED]>
CommitDate: Thu Nov 1 02:12:10 2007 +0000

    [CIFS] when mount helper missing fix slash wrong direction in share
    
    Kernel bugzilla bug #9228
    
    If mount helper (mount.cifs) missing, mounts with form like
    //10.11.12.13/c$ would not work (only mounts with slash e.g.
    //10.11.12.13\\c$ would work) due to problem with slash supposed
    to be converted to backslash by the mount helper (which is not
    there).
    
    If we fail on converting an IPv4 address in in4_pton then
    try to canonicalize the first slash (ie between sharename
    and host ip address) if necessary.  If we have to retry
    to check for IPv6 address the slash is already converted
    if necessary.
    
    Signed-off-by: Steve French <[EMAIL PROTECTED]>
---
 fs/cifs/CHANGES   |    5 ++++-
 fs/cifs/netmisc.c |   40 +++++++++++++++++++++++++++++++++++-----
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
index c65c9da..6d3e736 100644
--- a/fs/cifs/CHANGES
+++ b/fs/cifs/CHANGES
@@ -14,7 +14,10 @@ bigendian architectures. Fix possible memory corruption when
 EAGAIN returned on kern_recvmsg. Return better error if server
 requires packet signing but client has disabled it. When mounted
 with cifsacl mount option - mode bits are approximated based
-on the contents of the files ACL.
+on the contents of the ACL of the file or directory. When cifs
+mount helper is missing convert make sure that UNC name 
+has backslash (not forward slash) between ip address of server
+and the share name.
 
 Version 1.50
 ------------
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c
index 4d35c03..e1704da 100644
--- a/fs/cifs/netmisc.c
+++ b/fs/cifs/netmisc.c
@@ -132,6 +132,34 @@ static const struct smb_to_posix_error 
mapping_table_ERRHRD[] = {
        {0, 0}
 };
 
+
+/* if the mount helper is missing we need to reverse the 1st slash
+   from '/' to backslash in order to format the UNC properly for
+   ip address parsing and for tree connect (unless the user
+   remembered to put the UNC name in properly). Fortunately we do
+   not have to call this twice (we check for IPv4 addresses
+   first, so it is already converted by the time we
+   try IPv6 addresses */
+static int canonicalize_unc(char *cp)
+{
+       int i;
+
+       for (i = 0; i <= 46 /* INET6_ADDRSTRLEN */ ; i++) {
+               if (cp[i] == 0)
+                       break;
+               if (cp[i] == '\\')
+                       break;
+               if (cp[i] == '/') {
+#ifdef CONFIG_CIFS_DEBUG2
+                       cFYI(1, ("change slash to backslash in malformed UNC"));
+#endif
+                       cp[i] = '\\';
+                       return 1;
+               }
+       }
+       return 0;
+}
+
 /* Convert string containing dotted ip address to binary form */
 /* returns 0 if invalid address */
 
@@ -141,11 +169,13 @@ cifs_inet_pton(int address_family, char *cp, void *dst)
        int ret = 0;
 
        /* calculate length by finding first slash or NULL */
-       /* BB Should we convert '/' slash to '\' here since it seems already
-        * done before this */
-       if ( address_family == AF_INET ) {
-               ret = in4_pton(cp, -1 /* len */, dst , '\\', NULL);
-       } else if ( address_family == AF_INET6 ) {
+       if (address_family == AF_INET) {
+               ret = in4_pton(cp, -1 /* len */, dst, '\\', NULL);
+               if (ret == 0) {
+                       if (canonicalize_unc(cp))
+                               ret = in4_pton(cp, -1, dst, '\\', NULL);
+               }
+       } else if (address_family == AF_INET6) {
                ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);
        }
 #ifdef CONFIG_CIFS_DEBUG2
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to