Fix Red Hat bugzilla bug : https://bugzilla.redhat.com/show_bug.cgi?id=516165
[metze/samba/wip.git] / source3 / libsmb / clireadwrite.c
index 4e256ede57d2fe16b33bb3621e6648ccea11b6df..0d1f9e515ef778f5dd9670ffc3a5ee5f3b8ddfa5 100644 (file)
@@ -139,13 +139,19 @@ struct tevent_req *cli_read_andx_send(TALLOC_CTX *mem_ctx,
                                      off_t offset, size_t size)
 {
        struct tevent_req *req, *subreq;
+       NTSTATUS status;
 
        req = cli_read_andx_create(mem_ctx, ev, cli, fnum, offset, size,
                                   &subreq);
-       if ((req == NULL) || !cli_smb_req_send(subreq)) {
-               TALLOC_FREE(req);
+       if (req == NULL) {
                return NULL;
        }
+
+       status = cli_smb_req_send(subreq);
+       if (!NT_STATUS_IS_OK(status)) {
+               tevent_req_nterror(req, status);
+               return tevent_req_post(req, ev);
+       }
        return req;
 }
 
@@ -194,7 +200,7 @@ static void cli_read_andx_done(struct tevent_req *subreq)
        state->buf = (uint8_t *)smb_base(inbuf) + SVAL(vwv+6, 0);
 
        if (trans_oob(smb_len(inbuf), SVAL(vwv+6, 0), state->received)
-           || (state->buf < bytes)) {
+           || (state->received && (state->buf < bytes))) {
                DEBUG(5, ("server returned invalid read&x data offset\n"));
                tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
                return;
@@ -870,13 +876,19 @@ struct tevent_req *cli_write_andx_send(TALLOC_CTX *mem_ctx,
                                       off_t offset, size_t size)
 {
        struct tevent_req *req, *subreq;
+       NTSTATUS status;
 
        req = cli_write_andx_create(mem_ctx, ev, cli, fnum, mode, buf, offset,
                                    size, NULL, 0, &subreq);
-       if ((req == NULL) || !cli_smb_req_send(subreq)) {
-               TALLOC_FREE(req);
+       if (req == NULL) {
                return NULL;
        }
+
+       status = cli_smb_req_send(subreq);
+       if (!NT_STATUS_IS_OK(status)) {
+               tevent_req_nterror(req, status);
+               return tevent_req_post(req, ev);
+       }
        return req;
 }