Coverage Report

Created: 2025-06-10 07:24

/src/ghostpdl/base/szlibc.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2001-2024 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
17
/* Code common to zlib encoding and decoding streams */
18
#include "std.h"
19
#include "gserrors.h"
20
#include "gstypes.h"
21
#include "gsmemory.h"
22
#include "gsstruct.h"
23
#include "strimpl.h"
24
#include "szlibxx.h"
25
#include "zconf.h"
26
27
private_st_zlib_block();
28
private_st_zlib_dynamic_state();
29
public_st_zlib_state();
30
31
/* Set defaults for stream parameters. */
32
void
33
s_zlib_set_defaults(stream_state * st)
34
223k
{
35
223k
    stream_zlib_state *const ss = (stream_zlib_state *)st;
36
37
223k
    ss->windowBits = MAX_WBITS;
38
223k
    ss->no_wrapper = false;
39
223k
    ss->level = Z_DEFAULT_COMPRESSION;
40
223k
    ss->method = Z_DEFLATED;
41
    /* DEF_MEM_LEVEL should be in zlib.h or zconf.h, but it isn't. */
42
223k
    ss->memLevel = min(MAX_MEM_LEVEL, 8);
43
223k
    ss->strategy = Z_DEFAULT_STRATEGY;
44
    /* Clear pointers */
45
223k
    ss->dynamic = 0;
46
223k
}
47
48
/* Allocate the dynamic state. */
49
int
50
s_zlib_alloc_dynamic_state(stream_zlib_state *ss)
51
198k
{
52
198k
    gs_memory_t *mem = ss->memory;
53
198k
    zlib_dynamic_state_t *zds =
54
198k
        gs_alloc_struct_immovable(mem, zlib_dynamic_state_t,
55
198k
                                  &st_zlib_dynamic_state,
56
198k
                                  "s_zlib_alloc_dynamic_state");
57
58
198k
    ss->dynamic = zds;
59
198k
    if (zds == 0)
60
0
        return_error(gs_error_VMerror);
61
198k
    zds->blocks = 0;
62
198k
    zds->memory = mem;
63
198k
    zds->zstate.zalloc = (alloc_func)s_zlib_alloc;
64
198k
    zds->zstate.zfree = (free_func)s_zlib_free;
65
198k
    zds->zstate.opaque = (voidpf)zds;
66
198k
    return 0;
67
198k
}
68
69
/* Free the dynamic state. */
70
void
71
s_zlib_free_dynamic_state(stream_zlib_state *ss)
72
198k
{
73
198k
    if (ss->dynamic)
74
198k
        gs_free_object(ss->dynamic->memory, ss->dynamic,
75
198k
                       "s_zlib_free_dynamic_state");
76
198k
}
77
78
/* Provide zlib-compatible allocation and freeing functions. */
79
void *
80
s_zlib_alloc(void *zmem, uint items, uint size)
81
351k
{
82
351k
    zlib_dynamic_state_t *const zds = zmem;
83
351k
    gs_memory_t *mem = zds->memory->stable_memory;
84
351k
    zlib_block_t *block =
85
351k
        gs_alloc_struct(mem, zlib_block_t, &st_zlib_block,
86
351k
                        "s_zlib_alloc(block)");
87
351k
    void *data =
88
351k
        gs_alloc_byte_array_immovable(mem, items, size, "s_zlib_alloc(data)");
89
90
351k
    if (block == 0 || data == 0) {
91
0
        gs_free_object(mem, data, "s_zlib_alloc(data)");
92
0
        gs_free_object(mem, block, "s_zlib_alloc(block)");
93
0
        return Z_NULL;
94
0
    }
95
351k
    block->data = data;
96
351k
    block->next = zds->blocks;
97
351k
    block->prev = 0;
98
351k
    if (zds->blocks)
99
152k
        zds->blocks->prev = block;
100
351k
    zds->blocks = block;
101
351k
    return data;
102
351k
}
103
void
104
s_zlib_free(void *zmem, void *data)
105
351k
{
106
351k
    zlib_dynamic_state_t *const zds = zmem;
107
351k
    gs_memory_t *mem = zds->memory->stable_memory;
108
351k
    zlib_block_t *block = zds->blocks;
109
110
351k
    gs_free_object(mem, data, "s_zlib_free(data)");
111
351k
    for (; ; block = block->next) {
112
351k
        if (block == 0) {
113
#ifdef DEBUG
114
            lprintf1("Freeing unrecorded data "PRI_INTPTR"!\n", (intptr_t)data);
115
#endif
116
0
            return;
117
0
        }
118
351k
        if (block->data == data)
119
351k
            break;
120
351k
    }
121
351k
    if (block->next)
122
152k
        block->next->prev = block->prev;
123
351k
    if (block->prev)
124
0
        block->prev->next = block->next;
125
351k
    else
126
351k
        zds->blocks = block->next;
127
351k
    gs_free_object(mem, block, "s_zlib_free(block)");
128
351k
}