s3:smb2_server: avoid talloc_zero_array() in smbd_smb2_request_setup_out()
authorStefan Metzmacher <metze@samba.org>
Wed, 4 Dec 2013 14:32:45 +0000 (15:32 +0100)
committerJeremy Allison <jra@samba.org>
Wed, 5 Mar 2014 23:59:29 +0000 (00:59 +0100)
In the common case with just one request, we can use a preallocated
req->out.vector.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Thu Mar  6 00:59:29 CET 2014 on sn-devel-104

source3/smbd/globals.h
source3/smbd/smb2_server.c

index f5962717f1b91c952ba1092178a6003e5c90bc49..3baa048c0de57f88ca63a79e2394727fffb0c6f8 100644 (file)
@@ -613,6 +613,7 @@ struct smbd_smb2_request {
                 */
                struct iovec *vector;
                int vector_count;
+               struct iovec _vector[1 + SMBD_SMB2_NUM_IOV_PER_REQ];
 #define OUTVEC_ALLOC_SIZE (SMB2_HDR_BODY + 9)
                uint8_t _hdr[OUTVEC_ALLOC_SIZE];
                uint8_t _body[0x58];
index ceee35d05a235f14c9e3995ce01a657b5645f32a..3c46efd7e60c2ef8b4c40d9d42b0f7b6fa8af11e 100644 (file)
@@ -933,14 +933,21 @@ DATA_BLOB smbd_smb2_generate_outbody(struct smbd_smb2_request *req, size_t size)
 
 static NTSTATUS smbd_smb2_request_setup_out(struct smbd_smb2_request *req)
 {
+       TALLOC_CTX *mem_ctx;
        struct iovec *vector;
        int count;
        int idx;
 
        count = req->in.vector_count;
-       vector = talloc_zero_array(req, struct iovec, count);
-       if (vector == NULL) {
-               return NT_STATUS_NO_MEMORY;
+       if (count <= ARRAY_SIZE(req->out._vector)) {
+               mem_ctx = req;
+               vector = req->out._vector;
+       } else {
+               vector = talloc_zero_array(req, struct iovec, count);
+               if (vector == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+               mem_ctx = vector;
        }
 
        vector[0].iov_base      = req->out.nbt_hdr;
@@ -964,7 +971,7 @@ static NTSTATUS smbd_smb2_request_setup_out(struct smbd_smb2_request *req)
                if (idx == 1) {
                        outhdr = req->out._hdr;
                } else {
-                       outhdr = talloc_zero_array(vector, uint8_t,
+                       outhdr = talloc_zero_array(mem_ctx, uint8_t,
                                                   OUTVEC_ALLOC_SIZE);
                        if (outhdr == NULL) {
                                return NT_STATUS_NO_MEMORY;