s3: Add a talloc_move for the inbuf to cli_smb_recv
authorVolker Lendecke <vl@samba.org>
Sat, 20 Feb 2010 08:53:58 +0000 (09:53 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 22 Feb 2010 22:23:18 +0000 (23:23 +0100)
source3/include/async_smb.h
source3/libsmb/async_smb.c
source3/libsmb/cliconnect.c
source3/libsmb/clientgen.c
source3/libsmb/clifile.c
source3/libsmb/climessage.c
source3/libsmb/clioplock.c
source3/libsmb/clireadwrite.c
source3/libsmb/clitrans.c

index 47fed9273932b931bc363c7637022631f465d5a9..b73aed00046a0eec5db1767f6dc781cb2b81d9fd 100644 (file)
@@ -57,8 +57,9 @@ struct tevent_req *cli_smb_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
                                uint8_t wct, uint16_t *vwv,
                                uint32_t num_bytes,
                                const uint8_t *bytes);
-NTSTATUS cli_smb_recv(struct tevent_req *req, uint8_t min_wct,
-                     uint8_t *pwct, uint16_t **pvwv,
+NTSTATUS cli_smb_recv(struct tevent_req *req,
+                     TALLOC_CTX *mem_ctx, uint8_t **pinbuf,
+                     uint8_t min_wct, uint8_t *pwct, uint16_t **pvwv,
                      uint32_t *pnum_bytes, uint8_t **pbytes);
 
 struct tevent_req *cli_smb_oplock_break_waiter_send(TALLOC_CTX *mem_ctx,
index 59226e1ecb43ef759dd2d457a716c70e60ef86ab..9f92ae70121eee76e16b99c9b7b86f772d10df4f 100644 (file)
@@ -755,8 +755,9 @@ static void cli_smb_received(struct tevent_req *subreq)
        }
 }
 
-NTSTATUS cli_smb_recv(struct tevent_req *req, uint8_t min_wct,
-                     uint8_t *pwct, uint16_t **pvwv,
+NTSTATUS cli_smb_recv(struct tevent_req *req,
+                     TALLOC_CTX *mem_ctx, uint8_t **pinbuf,
+                     uint8_t min_wct, uint8_t *pwct, uint16_t **pvwv,
                      uint32_t *pnum_bytes, uint8_t **pbytes)
 {
        struct cli_smb_state *state = tevent_req_data(
@@ -868,6 +869,9 @@ no_err:
        if (pbytes != NULL) {
                *pbytes = (uint8_t *)state->inbuf + bytes_offset + 2;
        }
+       if ((mem_ctx != NULL) && (pinbuf != NULL)) {
+               *pinbuf = talloc_move(mem_ctx, &state->inbuf);
+       }
 
        return status;
 }
@@ -1055,7 +1059,8 @@ static void cli_smb_oplock_break_waiter_done(struct tevent_req *subreq)
        uint8_t *bytes;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 8, &wct, &vwv, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 8, &wct, &vwv,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
index a81cb0683979a7565b72dfacfe0c55af6c00ba5a..f5e763c1f2988c4010746f891af42a2c924f938f 100644 (file)
@@ -269,7 +269,8 @@ static void cli_session_setup_guest_done(struct tevent_req *subreq)
        uint8_t *p;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
@@ -731,7 +732,8 @@ static void cli_sesssetup_blob_done(struct tevent_req *subreq)
        uint8_t *p;
        uint16_t blob_length;
 
-       status = cli_smb_recv(subreq, 1, &wct, &vwv, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 1, &wct, &vwv,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)
            && !NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
                TALLOC_FREE(subreq);
@@ -1527,7 +1529,7 @@ static void cli_ulogoff_done(struct tevent_req *subreq)
                req, struct cli_ulogoff_state);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
                return;
@@ -1758,7 +1760,8 @@ static void cli_tcon_andx_done(struct tevent_req *subreq)
        uint8_t *bytes;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, &wct, &vwv, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, &wct, &vwv,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
@@ -1874,7 +1877,7 @@ static void cli_tdis_done(struct tevent_req *subreq)
                req, struct cli_tdis_state);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -2030,7 +2033,8 @@ static void cli_negprot_done(struct tevent_req *subreq)
        NTSTATUS status;
        uint16_t protnum;
 
-       status = cli_smb_recv(subreq, 1, &wct, &vwv, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 1, &wct, &vwv,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
index 0afa9e6be7790bd50e69ca2fd7b4d1c61210615d..92b898146e528d921547b9c39bd415d12fa23015 100644 (file)
@@ -852,7 +852,8 @@ static void cli_echo_done(struct tevent_req *subreq)
        uint32_t num_bytes;
        uint8_t *bytes;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
                return;
@@ -989,7 +990,8 @@ NTSTATUS cli_smb(TALLOC_CTX *mem_ctx, struct cli_state *cli,
         if (!tevent_req_poll_ntstatus(req, ev, &status)) {
                 goto fail;
         }
-        status = cli_smb_recv(req, min_wct, pwct, pvwv, pnum_bytes, pbytes);
+        status = cli_smb_recv(req, NULL, NULL, min_wct, pwct, pvwv,
+                             pnum_bytes, pbytes);
 fail:
         TALLOC_FREE(ev);
        if (NT_STATUS_IS_OK(status)) {
index 6c4ae1ad49e7aa871056795be64a609c9e2ee5ef..80e91a7efdd961a6d0373174ed54d6200473aae3 100644 (file)
@@ -1238,7 +1238,7 @@ static void cli_rename_done(struct tevent_req *subreq)
                                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -1364,7 +1364,7 @@ static void cli_ntrename_internal_done(struct tevent_req *subreq)
                                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -1559,7 +1559,7 @@ static void cli_unlink_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -1667,7 +1667,7 @@ static void cli_mkdir_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -1775,7 +1775,7 @@ static void cli_rmdir_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -2040,7 +2040,8 @@ static void cli_ntcreate_done(struct tevent_req *subreq)
        uint8_t *bytes;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 3, &wct, &vwv, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 3, &wct, &vwv,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
@@ -2252,7 +2253,7 @@ static void cli_open_done(struct tevent_req *subreq)
        uint16_t *vwv;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 3, &wct, &vwv, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 3, &wct, &vwv, NULL, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
@@ -2382,7 +2383,7 @@ static void cli_close_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -2723,7 +2724,7 @@ static void cli_unlock_done(struct tevent_req *subreq)
                                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -2898,7 +2899,7 @@ static void cli_unlock64_done(struct tevent_req *subreq)
                                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -3265,7 +3266,7 @@ static void cli_getattrE_done(struct tevent_req *subreq)
        uint16_t *vwv = NULL;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 11, &wct, &vwv, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 11, &wct, &vwv, NULL, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
                return;
@@ -3427,7 +3428,7 @@ static void cli_getatr_done(struct tevent_req *subreq)
        uint16_t *vwv = NULL;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 4, &wct, &vwv, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 4, &wct, &vwv, NULL, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
                return;
@@ -3561,7 +3562,7 @@ static void cli_setattrE_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -3695,7 +3696,7 @@ static void cli_setatr_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -3806,7 +3807,7 @@ static void cli_chkpath_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -3921,7 +3922,7 @@ static void cli_dskattr_done(struct tevent_req *subreq)
        uint16_t *vwv = NULL;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 4, &wct, &vwv, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 4, &wct, &vwv, NULL, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
                return;
@@ -4052,7 +4053,8 @@ static void cli_ctemp_done(struct tevent_req *subreq)
        uint32_t num_bytes = 0;
        uint8_t *bytes = NULL;
 
-       status = cli_smb_recv(subreq, 1, &wcnt, &vwv, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 1, &wcnt, &vwv,
+                             &num_bytes, &bytes);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
index 2c8ef58b512e82f65b24433d83ea2aff948c7fda..170447b2539fa53dfbba734ed83288000dba0f11 100644 (file)
@@ -92,7 +92,7 @@ static void cli_message_start_done(struct tevent_req *subreq)
        uint8_t wct;
        uint16_t *vwv;
 
-       status = cli_smb_recv(subreq, 0, &wct, &vwv, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, &wct, &vwv, NULL, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
@@ -183,7 +183,7 @@ static void cli_message_text_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -234,7 +234,7 @@ static void cli_message_end_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
index 7350c4aaa3644d741d22bcfa0b1acc5bbbb301b2..8904ac973fdfcb75236f85dfdd8ce61422f4b83f 100644 (file)
@@ -66,7 +66,7 @@ static void cli_oplock_ack_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL);
        TALLOC_FREE(subreq);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
index 65678740de66d8d60b166b0f04c4372c55912ac1..47693e3117fd6d1f3a89af4277cc385cce667993 100644 (file)
@@ -165,8 +165,8 @@ static void cli_read_andx_done(struct tevent_req *subreq)
        uint32_t num_bytes;
        uint8_t *bytes;
 
-       state->status = cli_smb_recv(subreq, 12, &wct, &vwv, &num_bytes,
-                                    &bytes);
+       state->status = cli_smb_recv(subreq, NULL, NULL, 12, &wct, &vwv,
+                                    &num_bytes, &bytes);
        if (NT_STATUS_IS_ERR(state->status)) {
                tevent_req_nterror(req, state->status);
                return;
@@ -1020,7 +1020,7 @@ static void cli_write_andx_done(struct tevent_req *subreq)
        uint16_t *vwv;
        NTSTATUS status;
 
-       status = cli_smb_recv(subreq, 6, &wct, &vwv, NULL, NULL);
+       status = cli_smb_recv(subreq, NULL, NULL, 6, &wct, &vwv, NULL, NULL);
        if (NT_STATUS_IS_ERR(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
index ec63bc3b9daefac9bc1ca0e1dfdbd88cf7417fd9..48993f01c0fd70f1acec11b2af0dfd1060ead02f 100644 (file)
@@ -1117,7 +1117,8 @@ static void cli_trans_done(struct tevent_req *subreq)
        uint8_t *param          = NULL;
        uint8_t *data           = NULL;
 
-       status = cli_smb_recv(subreq, 0, &wct, &vwv, &num_bytes, &bytes);
+       status = cli_smb_recv(subreq, NULL, NULL, 0, &wct, &vwv,
+                             &num_bytes, &bytes);
 
        /*
         * We can receive something like STATUS_MORE_ENTRIES, so don't use