r20496: Some changes to make Samba3 the RAW-OPEN test. Checking in to both 3_0 and
authorVolker Lendecke <vlendec@samba.org>
Wed, 3 Jan 2007 06:19:11 +0000 (06:19 +0000)
committerVolker Lendecke <vlendec@samba.org>
Wed, 3 Jan 2007 06:19:11 +0000 (06:19 +0000)
3_0_24 because I was explicitly asked to, although this needs close
review. Jeremy, I'm sure you will check this thoroughly :-)

In reply_open_and_X the separate "size" variable kills the calculation of the
SPARSE flag returned to the client in the attrib field. In getpathinfo we do
it correctly, and RAW-OPEN (correctly) complains about the difference.

Add the "set the write time" to mknew and create.

For trans2open we were missing the "ofun == 0" ->
NT_STATUS_OBJECT_NAME_COLLISION case, and we dropped the status returned in
favor of ACCESS_DENIED once too many.

Last change is a fix to trans2open: We were returning the attributes given by
the client, not the attributes of the new file.

Volker

source/smbd/reply.c
source/smbd/trans2.c

index bcc254fc98f7972aa106e4162740d309cc4d1b93..cee731a258b5cc1eb5dd35df5273702c1faa9d25 100644 (file)
@@ -1475,7 +1475,6 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
        uint32 smb_time = make_unix_date3(inbuf+smb_vwv6);
 #endif
        int smb_ofun = SVAL(inbuf,smb_vwv8);
-       SMB_OFF_T size=0;
        uint32 fattr=0;
        int mtime=0;
        SMB_STRUCT_STAT sbuf;
@@ -1545,8 +1544,6 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
                return ERROR_NT(status);
        }
 
-       size = sbuf.st_size;
-
        /* Setting the "size" field in vwv9 and vwv10 causes the file to be set to this size,
           if the file is truncated or created. */
        if (((smb_action == FILE_WAS_CREATED) || (smb_action == FILE_WAS_OVERWRITTEN)) && allocation_size) {
@@ -1562,7 +1559,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
                        END_PROFILE(SMBopenX);
                        return ERROR_NT(NT_STATUS_DISK_FULL);
                }
-               size = get_allocation_size(conn,fsp,&sbuf);
+               sbuf.st_size = get_allocation_size(conn,fsp,&sbuf);
        }
 
        fattr = dos_mode(conn,fname,&sbuf);
@@ -1611,7 +1608,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
        } else {
                srv_put_dos_date3(outbuf,smb_vwv4,mtime);
        }
-       SIVAL(outbuf,smb_vwv6,(uint32)size);
+       SIVAL(outbuf,smb_vwv6,(uint32)sbuf.st_size);
        SSVAL(outbuf,smb_vwv8,GET_OPENX_MODE(deny_mode));
        SSVAL(outbuf,smb_vwv11,smb_action);
 
@@ -1662,6 +1659,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        int com;
        int outsize = 0;
        uint32 fattr = SVAL(inbuf,smb_vwv0);
+       struct utimbuf times;
        BOOL bad_path = False;
        files_struct *fsp;
        int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
@@ -1676,6 +1674,8 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
  
        com = SVAL(inbuf,smb_com);
 
+       times.modtime = srv_make_unix_date3(inbuf + smb_vwv1);
+
        srvstr_get_path(inbuf, fname, smb_buf(inbuf) + 1, sizeof(fname), 0, STR_TERMINATE, &status);
        if (!NT_STATUS_IS_OK(status)) {
                END_PROFILE(SMBcreate);
@@ -1721,6 +1721,9 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_NT(status);
        }
  
+       times.actime = sbuf.st_atime;
+       file_utime(conn, fname, &times);
+
        outsize = set_message(outbuf,1,0,True);
        SSVAL(outbuf,smb_vwv0,fsp->fnum);
 
index 78630efd449dae9fe6cae8cc5f11fce12e163408..33596f19daca78f1cca205820a75233b74c288ff 100644 (file)
@@ -810,6 +810,10 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
                return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRnoaccess);
        }
 
+       if (open_ofun == 0) {
+               return ERROR_NT(NT_STATUS_OBJECT_NAME_COLLISION);
+       }
+
        if (!map_open_params_to_ntcreate(fname, deny_mode, open_ofun,
                                &access_mask,
                                &share_mode,
@@ -857,7 +861,7 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
                        /* We have re-scheduled this call. */
                        return -1;
                }
-               return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRnoaccess);
+               return ERROR_NT(status);
        }
 
        size = get_file_size(sbuf);
@@ -909,7 +913,7 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
        params = *pparams;
 
        SSVAL(params,0,fsp->fnum);
-       SSVAL(params,2,open_attr);
+       SSVAL(params,2,fattr);
        srv_put_dos_date2(params,4, mtime);
        SIVAL(params,8, (uint32)size);
        SSVAL(params,12,deny_mode);