s3:smb2cli: SMB2_WRITE needs one dyn byte to that the structure size check works.
authorStefan Metzmacher <metze@samba.org>
Mon, 5 Sep 2011 16:22:57 +0000 (18:22 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 7 Sep 2011 06:33:15 +0000 (08:33 +0200)
Windows generates NT_STATUS_INVALID_PARAMETER otherwise.

metze

source3/libsmb/smb2cli_write.c

index 98d754a9b0c729cbec0c6ac775573d5944ad4747..d512f0092b8923b0055cc33e93061b2d96189a0e 100644 (file)
@@ -27,6 +27,7 @@
 
 struct smb2cli_write_state {
        uint8_t fixed[48];
+       uint8_t dyn_pad[1];
 };
 
 static void smb2cli_write_done(struct tevent_req *subreq);
@@ -45,6 +46,8 @@ struct tevent_req *smb2cli_write_send(TALLOC_CTX *mem_ctx,
        struct tevent_req *req, *subreq;
        struct smb2cli_write_state *state;
        uint8_t *fixed;
+       const uint8_t *dyn;
+       size_t dyn_len;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct smb2cli_write_state);
@@ -63,13 +66,21 @@ struct tevent_req *smb2cli_write_send(TALLOC_CTX *mem_ctx,
        SIVAL(fixed, 36, remaining_bytes);
        SIVAL(fixed, 44, flags);
 
+       if (length > 0) {
+               dyn = data;
+               dyn_len = length;
+       } else {
+               dyn = state->dyn_pad;;
+               dyn_len = sizeof(state->dyn_pad);
+       }
+
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_WRITE,
                                  0, 0, /* flags */
                                  cli->smb2.pid,
                                  cli->smb2.tid,
                                  cli->smb2.uid,
                                  state->fixed, sizeof(state->fixed),
-                                 data, length);
+                                 dyn, dyn_len);
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }