r15640: - NT IOCTL calls also have an 'in' data_blob
authorStefan Metzmacher <metze@samba.org>
Tue, 16 May 2006 16:50:50 +0000 (16:50 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:07:25 +0000 (14:07 -0500)
- fix the receive code of NT IOCTL's we only need the NTTRANS data payload
  not the SMB payload here

metze

source/libcli/raw/interfaces.h
source/libcli/raw/rawioctl.c
source/smb_server/smb/nttrans.c
source/torture/raw/ioctl.c

index d9387cc6e2afd75d8322a4c20c82a514cbe175f5..e0696b45ec738f9951432edcbaff8e7df53da3d8 100644 (file)
@@ -1716,6 +1716,7 @@ union smb_ioctl {
                        uint32_t function;
                        BOOL fsctl;
                        uint8_t filter;
+                       DATA_BLOB blob;
                } in;
                struct {
                        DATA_BLOB blob;
index 49237fe9dab46e8d2d31ad5c8c9e66393cdf50da..77c8c801588b2e4da5b4fe538bc6c0aa0aff499f 100644 (file)
@@ -86,7 +86,7 @@ static struct smbcli_request *smb_raw_ntioctl_send(struct smbcli_tree *tree,
        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 @@ static NTSTATUS smb_raw_ntioctl_recv(struct smbcli_request *req,
                                     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;
 }
 
 
index e2fc962196417e73ac5278b902ac14d9e031340e..9154546693996912100723530036dde7bc54103d 100644 (file)
@@ -304,7 +304,6 @@ static NTSTATUS nttrans_ioctl(struct smbsrv_request *req,
        uint16_t fnum;
        uint8_t filter;
        BOOL fsctl;
-       DATA_BLOB *blob;
        NTSTATUS status;
 
        /* should have at least 4 setup words */
@@ -320,13 +319,12 @@ static NTSTATUS nttrans_ioctl(struct smbsrv_request *req,
        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);
index 22e90bed8a687dcacc32916eeb9793015ca8c211..cd93047576114a216585d610e38e47d9a2fd55fe 100644 (file)
@@ -105,6 +105,7 @@ static BOOL test_fsctl(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        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 @@ static BOOL test_fsctl(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        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)) {