Coverage Report

Created: 2023-03-26 06:28

/src/httpd/srclib/apr/buckets/apr_buckets_heap.c
Line
Count
Source (jump to first uncovered line)
1
/* Licensed to the Apache Software Foundation (ASF) under one or more
2
 * contributor license agreements.  See the NOTICE file distributed with
3
 * this work for additional information regarding copyright ownership.
4
 * The ASF licenses this file to You under the Apache License, Version 2.0
5
 * (the "License"); you may not use this file except in compliance with
6
 * the License.  You may obtain a copy of the License at
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
17
#include "apr_buckets.h"
18
#define APR_WANT_MEMFUNC
19
#include "apr_want.h"
20
21
static apr_status_t heap_bucket_read(apr_bucket *b, const char **str,
22
                                     apr_size_t *len, apr_read_type_e block)
23
12.1k
{
24
12.1k
    apr_bucket_heap *h = b->data;
25
26
12.1k
    *str = h->base + b->start;
27
12.1k
    *len = b->length;
28
12.1k
    return APR_SUCCESS;
29
12.1k
}
30
31
static void heap_bucket_destroy(void *data)
32
10.2k
{
33
10.2k
    apr_bucket_heap *h = data;
34
35
10.2k
    if (apr_bucket_shared_destroy(h)) {
36
1.06k
        (*h->free_func)(h->base);
37
1.06k
        apr_bucket_free(h);
38
1.06k
    }
39
10.2k
}
40
41
/* Warning: if you change this function, be sure to
42
 * change apr_bucket_pool_make() too! */
43
APR_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
44
                                               apr_size_t length,
45
                                               void (*free_func)(void *data))
46
1.06k
{
47
1.06k
    apr_bucket_heap *h;
48
49
1.06k
    h = apr_bucket_alloc(sizeof(*h), b->list);
50
51
1.06k
    if (!free_func) {
52
0
        h->alloc_len = length;
53
0
        h->base = apr_bucket_alloc(h->alloc_len, b->list);
54
0
        if (h->base == NULL) {
55
0
            apr_bucket_free(h);
56
0
            return NULL;
57
0
        }
58
0
        h->free_func = apr_bucket_free;
59
0
        memcpy(h->base, buf, length);
60
0
    }
61
1.06k
    else {
62
        /* XXX: we lose the const qualifier here which indicates
63
         * there's something screwy with the API...
64
         */
65
1.06k
        h->base = (char *) buf;
66
1.06k
        h->alloc_len = length;
67
1.06k
        h->free_func = free_func;
68
1.06k
    }
69
70
1.06k
    b = apr_bucket_shared_make(b, h, 0, length);
71
1.06k
    b->type = &apr_bucket_type_heap;
72
73
1.06k
    return b;
74
1.06k
}
75
76
APR_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf,
77
                                                 apr_size_t length,
78
                                                 void (*free_func)(void *data),
79
                                                 apr_bucket_alloc_t *list)
80
1.06k
{
81
1.06k
    apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
82
83
1.06k
    APR_BUCKET_INIT(b);
84
1.06k
    b->free = apr_bucket_free;
85
1.06k
    b->list = list;
86
1.06k
    return apr_bucket_heap_make(b, buf, length, free_func);
87
1.06k
}
88
89
APR_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_heap = {
90
    "HEAP", 5, APR_BUCKET_DATA,
91
    heap_bucket_destroy,
92
    heap_bucket_read,
93
    apr_bucket_setaside_noop,
94
    apr_bucket_shared_split,
95
    apr_bucket_shared_copy
96
};