mirror of
https://github.com/samba-team/samba.git
synced 2025-12-17 04:23:50 +03:00
r20496: Some changes to make Samba3 the RAW-OPEN test. Checking in to both 3_0 and
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
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
25c4ebb55f
commit
84e6889632
@@ -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);
|
uint32 smb_time = make_unix_date3(inbuf+smb_vwv6);
|
||||||
#endif
|
#endif
|
||||||
int smb_ofun = SVAL(inbuf,smb_vwv8);
|
int smb_ofun = SVAL(inbuf,smb_vwv8);
|
||||||
SMB_OFF_T size=0;
|
|
||||||
uint32 fattr=0;
|
uint32 fattr=0;
|
||||||
int mtime=0;
|
int mtime=0;
|
||||||
SMB_STRUCT_STAT sbuf;
|
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);
|
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,
|
/* 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 the file is truncated or created. */
|
||||||
if (((smb_action == FILE_WAS_CREATED) || (smb_action == FILE_WAS_OVERWRITTEN)) && allocation_size) {
|
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);
|
END_PROFILE(SMBopenX);
|
||||||
return ERROR_NT(NT_STATUS_DISK_FULL);
|
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);
|
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 {
|
} else {
|
||||||
srv_put_dos_date3(outbuf,smb_vwv4,mtime);
|
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_vwv8,GET_OPENX_MODE(deny_mode));
|
||||||
SSVAL(outbuf,smb_vwv11,smb_action);
|
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 com;
|
||||||
int outsize = 0;
|
int outsize = 0;
|
||||||
uint32 fattr = SVAL(inbuf,smb_vwv0);
|
uint32 fattr = SVAL(inbuf,smb_vwv0);
|
||||||
|
struct utimbuf times;
|
||||||
BOOL bad_path = False;
|
BOOL bad_path = False;
|
||||||
files_struct *fsp;
|
files_struct *fsp;
|
||||||
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
|
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);
|
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);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf) + 1, sizeof(fname), 0, STR_TERMINATE, &status);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
END_PROFILE(SMBcreate);
|
END_PROFILE(SMBcreate);
|
||||||
@@ -1721,6 +1721,9 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
return ERROR_NT(status);
|
return ERROR_NT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
times.actime = sbuf.st_atime;
|
||||||
|
file_utime(conn, fname, ×);
|
||||||
|
|
||||||
outsize = set_message(outbuf,1,0,True);
|
outsize = set_message(outbuf,1,0,True);
|
||||||
SSVAL(outbuf,smb_vwv0,fsp->fnum);
|
SSVAL(outbuf,smb_vwv0,fsp->fnum);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
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,
|
if (!map_open_params_to_ntcreate(fname, deny_mode, open_ofun,
|
||||||
&access_mask,
|
&access_mask,
|
||||||
&share_mode,
|
&share_mode,
|
||||||
@@ -857,7 +861,7 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
|
|||||||
/* We have re-scheduled this call. */
|
/* We have re-scheduled this call. */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRnoaccess);
|
return ERROR_NT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
size = get_file_size(sbuf);
|
size = get_file_size(sbuf);
|
||||||
@@ -909,7 +913,7 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
|
|||||||
params = *pparams;
|
params = *pparams;
|
||||||
|
|
||||||
SSVAL(params,0,fsp->fnum);
|
SSVAL(params,0,fsp->fnum);
|
||||||
SSVAL(params,2,open_attr);
|
SSVAL(params,2,fattr);
|
||||||
srv_put_dos_date2(params,4, mtime);
|
srv_put_dos_date2(params,4, mtime);
|
||||||
SIVAL(params,8, (uint32)size);
|
SIVAL(params,8, (uint32)size);
|
||||||
SSVAL(params,12,deny_mode);
|
SSVAL(params,12,deny_mode);
|
||||||
|
|||||||
Reference in New Issue
Block a user