svn commit: samba r24271 - in branches/SAMBA_3_2/source/smbd: .
vlendec at samba.org
vlendec at samba.org
Tue Aug 7 13:43:04 GMT 2007
Author: vlendec
Date: 2007-08-07 13:43:02 +0000 (Tue, 07 Aug 2007)
New Revision: 24271
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24271
Log:
Push reply_prep_legacy into reply_write_and_X
Modified:
branches/SAMBA_3_2/source/smbd/process.c
branches/SAMBA_3_2/source/smbd/reply.c
Changeset:
Modified: branches/SAMBA_3_2/source/smbd/process.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/process.c 2007-08-07 13:14:49 UTC (rev 24270)
+++ branches/SAMBA_3_2/source/smbd/process.c 2007-08-07 13:43:02 UTC (rev 24271)
@@ -735,7 +735,7 @@
/* 0x2c */ { "SMBwriteclose",reply_writeclose,NULL,AS_USER},
/* 0x2d */ { "SMBopenX",NULL,reply_open_and_X,AS_USER | CAN_IPC },
/* 0x2e */ { "SMBreadX",reply_read_and_X,NULL,AS_USER | CAN_IPC },
-/* 0x2f */ { "SMBwriteX",reply_write_and_X,NULL,AS_USER | CAN_IPC },
+/* 0x2f */ { "SMBwriteX",NULL,reply_write_and_X,AS_USER | CAN_IPC },
/* 0x30 */ { NULL, NULL, NULL, 0 },
/* 0x31 */ { NULL, NULL, NULL, 0 },
/* 0x32 */ { "SMBtrans2", NULL,reply_trans2, AS_USER | CAN_IPC },
Modified: branches/SAMBA_3_2/source/smbd/reply.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/reply.c 2007-08-07 13:14:49 UTC (rev 24270)
+++ branches/SAMBA_3_2/source/smbd/reply.c 2007-08-07 13:43:02 UTC (rev 24271)
@@ -3271,7 +3271,7 @@
Reply to a write and X.
****************************************************************************/
-int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize)
+void reply_write_and_X(connection_struct *conn, struct smb_request *req)
{
files_struct *fsp;
SMB_OFF_T startpos;
@@ -3284,11 +3284,21 @@
BOOL large_writeX;
NTSTATUS status;
+ char *inbuf, *outbuf;
+ int length, bufsize;
+
START_PROFILE(SMBwriteX);
+ if (!reply_prep_legacy(req, &inbuf, &outbuf, &length, &bufsize)) {
+ reply_nterror(req, NT_STATUS_NO_MEMORY);
+ END_PROFILE(SMBwriteX);
+ return;
+ }
+
if ((CVAL(inbuf, smb_wct) != 12) && (CVAL(inbuf, smb_wct) != 14)) {
+ reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
END_PROFILE(SMBwriteX);
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return;
}
fsp = file_fsp(SVAL(inbuf,smb_vwv2));
@@ -3301,17 +3311,25 @@
/* If it's an IPC, pass off the pipe handler. */
if (IS_IPC(conn)) {
+ reply_post_legacy(
+ req,
+ reply_pipe_write_and_X(inbuf,outbuf,length,bufsize));
END_PROFILE(SMBwriteX);
- return reply_pipe_write_and_X(inbuf,outbuf,length,bufsize);
+ return;
}
- CHECK_FSP(fsp,conn);
+ if (!check_fsp(conn, req, fsp, ¤t_user)) {
+ END_PROFILE(SMBwriteX);
+ return;
+ }
+
if (!CHECK_WRITE(fsp)) {
+ reply_doserror(req, ERRDOS, ERRbadaccess);
END_PROFILE(SMBwriteX);
- return(ERROR_DOS(ERRDOS,ERRbadaccess));
+ return;
}
- set_message(inbuf,outbuf,6,0,True);
+ set_message(inbuf, outbuf, 6, 0, True);
/* Deal with possible LARGE_WRITEX */
if (large_writeX) {
@@ -3319,8 +3337,9 @@
}
if(smb_doff > smblen || (smb_doff + numtowrite > smblen)) {
+ reply_doserror(req, ERRDOS, ERRbadmem);
END_PROFILE(SMBwriteX);
- return ERROR_DOS(ERRDOS,ERRbadmem);
+ return;
}
data = smb_base(inbuf) + smb_doff;
@@ -3339,18 +3358,23 @@
*/
if(IVAL(inbuf,smb_vwv12) != 0) {
- DEBUG(0,("reply_write_and_X - large offset (%x << 32) used and we don't support \
-64 bit offsets.\n", (unsigned int)IVAL(inbuf,smb_vwv12) ));
+ DEBUG(0,("reply_write_and_X - large offset (%x << 32) "
+ "used and we don't support 64 bit offsets.\n",
+ (unsigned int)IVAL(inbuf,smb_vwv12) ));
+ reply_doserror(req, ERRDOS, ERRbadaccess);
END_PROFILE(SMBwriteX);
- return ERROR_DOS(ERRDOS,ERRbadaccess);
+ return;
}
#endif /* LARGE_SMB_OFF_T */
}
- if (is_locked(fsp,(uint32)SVAL(inbuf,smb_pid),(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+ if (is_locked(fsp,(uint32)SVAL(inbuf,smb_pid),
+ (SMB_BIG_UINT)numtowrite,
+ (SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+ reply_doserror(req, ERRDOS, ERRlock);
END_PROFILE(SMBwriteX);
- return ERROR_DOS(ERRDOS,ERRlock);
+ return;
}
/* X/Open SMB protocol says that, unlike SMBwrite
@@ -3364,16 +3388,18 @@
if (schedule_aio_write_and_X(conn, inbuf, outbuf, length, bufsize,
fsp,data,startpos,numtowrite)) {
+ reply_post_legacy(req, -1);
END_PROFILE(SMBwriteX);
- return -1;
+ return;
}
nwritten = write_file(fsp,data,startpos,numtowrite);
}
if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) {
+ reply_unixerror(req, ERRHRD, ERRdiskfull);
END_PROFILE(SMBwriteX);
- return(UNIXERROR(ERRHRD,ERRdiskfull));
+ return;
}
SSVAL(outbuf,smb_vwv2,nwritten);
@@ -3392,12 +3418,16 @@
if (!NT_STATUS_IS_OK(status)) {
DEBUG(5,("reply_write_and_X: sync_file for %s returned %s\n",
fsp->fsp_name, nt_errstr(status) ));
+ reply_nterror(req, status);
END_PROFILE(SMBwriteX);
- return ERROR_NT(status);
+ return;
}
+ reply_post_legacy(req, smb_len(req->outbuf));
+
END_PROFILE(SMBwriteX);
- return chain_reply(inbuf,&outbuf,length,bufsize);
+ chain_reply_new(req);
+ return;
}
/****************************************************************************
More information about the samba-cvs
mailing list