]> err.no Git - linux-2.6/commitdiff
[CIFS] Fix endian conversion problem in posix mkdir
authorCyril Gorcunov <gorcunov@gmail.com>
Sun, 14 Oct 2007 17:58:43 +0000 (17:58 +0000)
committerSteve French <sfrench@us.ibm.com>
Sun, 14 Oct 2007 17:58:43 +0000 (17:58 +0000)
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/CHANGES
fs/cifs/cifsacl.h
fs/cifs/cifsencrypt.c
fs/cifs/cifssmb.c
fs/cifs/inode.c

index 13071faf8af72ed300091cbb921f45f16ff5595c..70c90c07edf105285843a61690bb57853448ce3a 100644 (file)
@@ -9,7 +9,8 @@ ability to mount to IPC$ share (which allows CIFS named pipes to be
 opened, read and written as if they were files).  When 1st tree
 connect fails (e.g. due to signing negotiation failure) fix
 leak that causes cifsd not to stop and rmmod to fail to cleanup
-cifs_request_buffers pool.
+cifs_request_buffers pool. Fix problem with POSIX Open/Mkdir on
+bigendian architectures.
 
 Version 1.50
 ------------
index 1b115641b7222c3d2d0f363eea5e2eaff492c150..0362cd11f03e113af61a61d5340ac1be68bc951e 100644 (file)
@@ -51,8 +51,8 @@ struct cifs_acl {
 struct cifs_ntace { /* first part of ACE which contains perms */
        __u8 type;
        __u8 flags;
-       __u16 size;
-       __u32 access_req;
+       __le16 size;
+       __le32 access_req;
 } __attribute__((packed));
 
 struct cifs_ace { /* last part of ACE which includes user info */
index 36272293027d41902231b0725aba64ba680e49dc..632070b4275d91ba46baa1d735b578aeca555462 100644 (file)
@@ -345,7 +345,7 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
        user = kmalloc(2 + (len * 2), GFP_KERNEL);
        if (user == NULL)
                goto calc_exit_2;
-       len = cifs_strtoUCS(user, ses->userName, len, nls_cp);
+       len = cifs_strtoUCS((__le16 *)user, ses->userName, len, nls_cp);
        UniStrupr(user);
        hmac_md5_update((char *)user, 2*len, pctxt);
 
@@ -356,7 +356,8 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
                domain = kmalloc(2 + (len * 2), GFP_KERNEL);
                if (domain == NULL)
                        goto calc_exit_1;
-               len = cifs_strtoUCS(domain, ses->domainName, len, nls_cp);
+               len = cifs_strtoUCS((__le16 *)domain, ses->domainName, len,
+                                       nls_cp);
                /* the following line was removed since it didn't work well
                   with lower cased domain name that passed as an option.
                   Maybe converting the domain name earlier makes sense */
index eff3226b210498965432b149da88c40d7447bb63..b17983633a1ce85b7cd57a0b1c77c2b86dc46187 100644 (file)
@@ -1069,7 +1069,7 @@ PsxCreat:
                                InformationLevel) - 4;
        offset = param_offset + params;
        pdata = (OPEN_PSX_REQ *)(((char *)&pSMB->hdr.Protocol) + offset);
-       pdata->Level = SMB_QUERY_FILE_UNIX_BASIC;
+       pdata->Level = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC);
        pdata->Permissions = cpu_to_le64(mode);
        pdata->PosixOpenFlags = cpu_to_le32(posix_flags);
        pdata->OpenFlags =  cpu_to_le32(*pOplock);
@@ -1115,8 +1115,8 @@ PsxCreat:
        if (cpu_to_le32(FILE_CREATE) == psx_rsp->CreateAction)
                *pOplock |= CIFS_CREATE_ACTION;
        /* check to make sure response data is there */
-       if (psx_rsp->ReturnedLevel != SMB_QUERY_FILE_UNIX_BASIC) {
-               pRetData->Type = -1; /* unknown */
+       if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) {
+               pRetData->Type = cpu_to_le32(-1); /* unknown */
 #ifdef CONFIG_CIFS_DEBUG2
                cFYI(1, ("unknown type"));
 #endif
@@ -1124,7 +1124,7 @@ PsxCreat:
                if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP)
                                        + sizeof(FILE_UNIX_BASIC_INFO)) {
                        cERROR(1, ("Open response data too small"));
-                       pRetData->Type = -1;
+                       pRetData->Type = cpu_to_le32(-1);
                        goto psx_create_err;
                }
                memcpy((char *) pRetData,
index ece17ca00d0847270bdf3af2e87f1a72c3b96c41..cc119b278e5be201e555d02c03f577b845762bc7 100644 (file)
@@ -947,7 +947,8 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
                        d_drop(direntry);
                } else {
                        int obj_type;
-                       if (pInfo->Type == -1) /* no return info - go query */ {
+                       if (pInfo->Type == cpu_to_le32(-1)) {
+                               /* no return info, go query for it */
                                kfree(pInfo);
                                goto mkdir_get_info;
                        }