diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/reply.c | 13 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 8 |
2 files changed, 14 insertions, 7 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 6bda8fb7ee..9184a1a696 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -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, ×); + outsize = set_message(outbuf,1,0,True); SSVAL(outbuf,smb_vwv0,fsp->fnum); diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 78630efd44..33596f19da 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -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); |