[PATCH] new cifs endianness bugs
authorAl Viro <viro@ftp.linux.org.uk>
Sat, 14 Oct 2006 15:48:26 +0000 (16:48 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 15 Oct 2006 18:00:58 +0000 (11:00 -0700)
* missing cpu_to_le64() for ChangeTime (introduced by
    [CIFS] Legacy time handling for Win9x and OS/2 part 1)
* missing le16_to_cpu() for DialectIndex (introduced by
    [CIFS] Do not send newer QFSInfo to legacy servers which can not support it)

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/cifs/cifssmb.c

index 5dc5a966bd5ff1b191838346bc19f465402aea9f..098790eb2aa161967538c91b734c3fe45fa5d8b7 100644 (file)
@@ -399,6 +399,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
        struct TCP_Server_Info * server;
        u16 count;
        unsigned int secFlags;
+       u16 dialect;
 
        if(ses->server)
                server = ses->server;
@@ -438,9 +439,10 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
        if (rc != 0) 
                goto neg_err_exit;
 
-       cFYI(1,("Dialect: %d", pSMBr->DialectIndex));
+       dialect = le16_to_cpu(pSMBr->DialectIndex);
+       cFYI(1,("Dialect: %d", dialect));
        /* Check wct = 1 error case */
-       if((pSMBr->hdr.WordCount < 13) || (pSMBr->DialectIndex == BAD_PROT)) {
+       if((pSMBr->hdr.WordCount < 13) || (dialect == BAD_PROT)) {
                /* core returns wct = 1, but we do not ask for core - otherwise
                small wct just comes when dialect index is -1 indicating we 
                could not negotiate a common dialect */
@@ -448,8 +450,8 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
                goto neg_err_exit;
 #ifdef CONFIG_CIFS_WEAK_PW_HASH 
        } else if((pSMBr->hdr.WordCount == 13)
-                       && ((pSMBr->DialectIndex == LANMAN_PROT)
-                               || (pSMBr->DialectIndex == LANMAN2_PROT))) {
+                       && ((dialect == LANMAN_PROT)
+                               || (dialect == LANMAN2_PROT))) {
                __s16 tmp;
                struct lanman_neg_rsp * rsp = (struct lanman_neg_rsp *)pSMBr;
 
@@ -2943,7 +2945,7 @@ QInfRetry:
                ts.tv_nsec = 0;
                ts.tv_sec = time;
                /* decode time fields */
-               pFinfo->ChangeTime = cifs_UnixTimeToNT(ts);
+               pFinfo->ChangeTime = cpu_to_le64(cifs_UnixTimeToNT(ts));
                pFinfo->LastWriteTime = pFinfo->ChangeTime;
                pFinfo->LastAccessTime = 0;
                pFinfo->AllocationSize =