Author: metze
Date: 2006-05-16 16:50:50 +0000 (Tue, 16 May 2006)
New Revision: 15640

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15640

Log:
- NT IOCTL calls also have an 'in' data_blob
- fix the receive code of NT IOCTL's we only need the NTTRANS data payload
  not the SMB payload here

metze
Modified:
   branches/SAMBA_4_0/source/libcli/raw/interfaces.h
   branches/SAMBA_4_0/source/libcli/raw/rawioctl.c
   branches/SAMBA_4_0/source/smb_server/smb/nttrans.c
   branches/SAMBA_4_0/source/torture/raw/ioctl.c


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/raw/interfaces.h
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/interfaces.h   2006-05-16 16:43:34 UTC 
(rev 15639)
+++ branches/SAMBA_4_0/source/libcli/raw/interfaces.h   2006-05-16 16:50:50 UTC 
(rev 15640)
@@ -1716,6 +1716,7 @@
                        uint32_t function;
                        BOOL fsctl;
                        uint8_t filter;
+                       DATA_BLOB blob;
                } in;
                struct {
                        DATA_BLOB blob;

Modified: branches/SAMBA_4_0/source/libcli/raw/rawioctl.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/rawioctl.c     2006-05-16 16:43:34 UTC 
(rev 15639)
+++ branches/SAMBA_4_0/source/libcli/raw/rawioctl.c     2006-05-16 16:50:50 UTC 
(rev 15640)
@@ -86,7 +86,7 @@
        SCVAL(setup, 7, parms->ntioctl.in.filter);
        nt.in.function = NT_TRANSACT_IOCTL;
        nt.in.params = data_blob(NULL, 0);
-       nt.in.data = data_blob(NULL, 0);
+       nt.in.data = parms->ntioctl.in.blob;
 
        return smb_raw_nttrans_send(tree, &nt);
 }
@@ -98,13 +98,22 @@
                                     TALLOC_CTX *mem_ctx,
                                     union smb_ioctl *parms)
 {
-       if (!smbcli_request_receive(req) ||
-           smbcli_request_is_error(req)) {
-               return smbcli_request_destroy(req);
-       }
+       NTSTATUS status;
+       struct smb_nttrans nt;
+       TALLOC_CTX *tmp_mem;
 
-       parms->ntioctl.out.blob = smbcli_req_pull_blob(req, mem_ctx, 
req->in.data, -1);
-       return smbcli_request_destroy(req);
+       tmp_mem = talloc_new(mem_ctx);
+       NT_STATUS_HAVE_NO_MEMORY(tmp_mem);
+
+       status = smb_raw_nttrans_recv(req, tmp_mem, &nt);
+       if (!NT_STATUS_IS_OK(status)) goto fail;
+
+       parms->ntioctl.out.blob = nt.out.data;
+       talloc_steal(mem_ctx, parms->ntioctl.out.blob.data);
+
+fail:
+       talloc_free(tmp_mem);
+       return status;
 }
 
 

Modified: branches/SAMBA_4_0/source/smb_server/smb/nttrans.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/smb/nttrans.c  2006-05-16 16:43:34 UTC 
(rev 15639)
+++ branches/SAMBA_4_0/source/smb_server/smb/nttrans.c  2006-05-16 16:50:50 UTC 
(rev 15640)
@@ -304,7 +304,6 @@
        uint16_t fnum;
        uint8_t filter;
        BOOL fsctl;
-       DATA_BLOB *blob;
        NTSTATUS status;
 
        /* should have at least 4 setup words */
@@ -320,13 +319,12 @@
        fsctl = CVAL(trans->in.setup, 6);
        filter = CVAL(trans->in.setup, 7);
 
-       blob = &trans->in.data;
-
        nt->ntioctl.level = RAW_IOCTL_NTIOCTL;
        nt->ntioctl.in.file.fnum = fnum;
        nt->ntioctl.in.function = function;
        nt->ntioctl.in.fsctl = fsctl;
        nt->ntioctl.in.filter = filter;
+       nt->ntioctl.in.blob = trans->in.data;
 
        status = nttrans_setup_reply(op, trans, 0, 0, 1);
        NT_STATUS_NOT_OK_RETURN(status);

Modified: branches/SAMBA_4_0/source/torture/raw/ioctl.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/ioctl.c       2006-05-16 16:43:34 UTC 
(rev 15639)
+++ branches/SAMBA_4_0/source/torture/raw/ioctl.c       2006-05-16 16:50:50 UTC 
(rev 15640)
@@ -105,6 +105,7 @@
        nt.ntioctl.in.file.fnum = fnum;
        nt.ntioctl.in.fsctl = True;
        nt.ntioctl.in.filter = 0;
+       nt.ntioctl.in.blob = data_blob(NULL, 0);
 
        status = smb_raw_ioctl(cli->tree, mem_ctx, &nt);
        CHECK_STATUS(status, NT_STATUS_OK);
@@ -115,6 +116,7 @@
        nt.ntioctl.in.file.fnum = fnum;
        nt.ntioctl.in.fsctl = True;
        nt.ntioctl.in.filter = 0;
+       nt.ntioctl.in.blob = data_blob(NULL, 0);
 
        status = smb_raw_ioctl(cli->tree, mem_ctx, &nt);
        if (NT_STATUS_IS_OK(status)) {

Reply via email to