Coverage Report

Created: 2026-10-16 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/haproxy/include/import/slz.h
Line
Count
Source
1
/*
2
 * Copyright (C) 2013-2015 Willy Tarreau <w@1wt.eu>
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining
5
 * a copy of this software and associated documentation files (the
6
 * "Software"), to deal in the Software without restriction, including
7
 * without limitation the rights to use, copy, modify, merge, publish,
8
 * distribute, sublicense, and/or sell copies of the Software, and to
9
 * permit persons to whom the Software is furnished to do so, subject to
10
 * the following conditions:
11
 *
12
 * The above copyright notice and this permission notice shall be
13
 * included in all copies or substantial portions of the Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
 * OTHER DEALINGS IN THE SOFTWARE.
23
 */
24
25
#ifndef _SLZ_H
26
#define _SLZ_H
27
28
#include <inttypes.h>
29
#include <stddef.h>
30
31
/*
32
 * =============================================================================
33
 *                                Common API
34
 *                     shared by slz and uslz APIs
35
 * =============================================================================
36
 */
37
void slz_make_crc_table(void); /* obsolete, not needed anymore */
38
uint32_t slz_crc32_by1(uint32_t crc, const unsigned char *buf, int len);
39
uint32_t slz_crc32_by4(uint32_t crc, const unsigned char *buf, int len);
40
uint32_t slz_adler32_by1(uint32_t crc, const unsigned char *buf, int len);
41
uint32_t slz_adler32_block(uint32_t crc, const unsigned char *buf, long len);
42
43
/*
44
 * =============================================================================
45
 *                                slz API (compression)
46
 * =============================================================================
47
 */
48
49
enum slz_state {
50
  SLZ_ST_INIT,  /* stream initialized */
51
  SLZ_ST_EOB,   /* header or end of block already sent */
52
  SLZ_ST_FIXED, /* inside a fixed huffman sequence */
53
  SLZ_ST_LAST,  /* last block, BFINAL sent */
54
  SLZ_ST_DONE,  /* BFINAL+EOB sent BFINAL */
55
  SLZ_ST_END    /* end sent (BFINAL, EOB, CRC + len) */
56
};
57
58
enum {
59
  SLZ_FMT_NONE = 0,/* default value, this way this ensure library users storing the
60
        * the fmt value in a structure that is zero-initialized have no
61
                    * FMT by default, plus they have a way to know if a fmt was
62
                    * selected or not by comparing it with this value
63
        */
64
  SLZ_FMT_GZIP,    /* RFC1952: gzip envelope and crc32 for CRC */
65
  SLZ_FMT_ZLIB,    /* RFC1950: zlib envelope and adler-32 for CRC */
66
  SLZ_FMT_DEFLATE, /* RFC1951: raw deflate, and no crc */
67
};
68
69
struct slz_stream {
70
#if defined(__SIZEOF_LONG__) && (__SIZEOF_LONG__ - 0 > 4)
71
  /* Note below: the queue never contains more than 32 bits for the
72
   * 64-bit one, or 8 bits for the 32-bit one since contents are dumped
73
   * as soon as they're large enough (32b for the 64-bit one, 8b-24b for
74
   * the 32-bit one).
75
   */
76
  uint64_t queue; /* last pending bits, LSB first, faster on 64-bit archs */
77
#else
78
  uint32_t queue; /* last pending bits, LSB first, faster on 32-bit archs */
79
#endif
80
  uint32_t qbits; /* number of bits in queue, < 8 on 32-bit, < 32 on 64-bit */
81
  unsigned char *outbuf; /* set by encode() */
82
  uint16_t state; /* one of slz_state */
83
  uint8_t level:1; /* 0 = no compression, 1 = compression */
84
  uint8_t format:2; /* SLZ_FMT_* */
85
  uint8_t debt;    /* number of bits by which the fixed huffman encoding is
86
                    * currently behind the equivalent stored blocks, see
87
                    * SLZ_MAX_DEBT in slz.c
88
                    */
89
  uint32_t crc32;
90
  uint32_t ilen;
91
};
92
93
/* Functions specific to rfc1951 (deflate) */
94
void slz_prepare_dist_table(); /* obsolete, not needed anymore */
95
long slz_rfc1951_encode(struct slz_stream *strm, unsigned char *out, const unsigned char *in, long ilen, int more);
96
int slz_rfc1951_init(struct slz_stream *strm, int level);
97
int slz_rfc1951_flush(struct slz_stream *strm, unsigned char *buf);
98
int slz_rfc1951_finish(struct slz_stream *strm, unsigned char *buf);
99
100
/* Functions specific to rfc1952 (gzip) */
101
long slz_rfc1952_encode(struct slz_stream *strm, unsigned char *out, const unsigned char *in, long ilen, int more);
102
int slz_rfc1952_send_header(struct slz_stream *strm, unsigned char *buf);
103
int slz_rfc1952_init(struct slz_stream *strm, int level);
104
int slz_rfc1952_flush(struct slz_stream *strm, unsigned char *buf);
105
int slz_rfc1952_finish(struct slz_stream *strm, unsigned char *buf);
106
107
/* Functions specific to rfc1950 (zlib) */
108
long slz_rfc1950_encode(struct slz_stream *strm, unsigned char *out, const unsigned char *in, long ilen, int more);
109
int slz_rfc1950_send_header(struct slz_stream *strm, unsigned char *buf);
110
int slz_rfc1950_init(struct slz_stream *strm, int level);
111
int slz_rfc1950_flush(struct slz_stream *strm, unsigned char *buf);
112
int slz_rfc1950_finish(struct slz_stream *strm, unsigned char *buf);
113
114
/* generic functions */
115
116
/* Initializes stream <strm>. It will configure the stream to use format
117
 * <format> for the data, which must be one of SLZ_FMT_*. The compression level
118
 * passed in <level> is set. This value can only be 0 (no compression) or 1
119
 * (compression) and other values will lead to unpredictable behaviour. The
120
 * function should always return 0.
121
 */
122
static inline int slz_init(struct slz_stream *strm, int level, int format)
123
0
{
124
0
  int ret;
125
0
126
0
  if (format == SLZ_FMT_GZIP)
127
0
    ret = slz_rfc1952_init(strm, level);
128
0
  else if (format == SLZ_FMT_ZLIB)
129
0
    ret = slz_rfc1950_init(strm, level);
130
0
  else { /* deflate for anything else */
131
0
    ret = slz_rfc1951_init(strm, level);
132
0
    strm->format = format;
133
0
  }
134
0
  return ret;
135
0
}
Unexecuted instantiation: chunk.c:slz_init
Unexecuted instantiation: debug.c:slz_init
Unexecuted instantiation: fd.c:slz_init
Unexecuted instantiation: h1_htx.c:slz_init
Unexecuted instantiation: http.c:slz_init
Unexecuted instantiation: http_htx.c:slz_init
Unexecuted instantiation: htx.c:slz_init
Unexecuted instantiation: limits.c:slz_init
Unexecuted instantiation: listener.c:slz_init
Unexecuted instantiation: log.c:slz_init
Unexecuted instantiation: mworker.c:slz_init
Unexecuted instantiation: peers.c:slz_init
Unexecuted instantiation: pool.c:slz_init
Unexecuted instantiation: proto_sockpair.c:slz_init
Unexecuted instantiation: protocol.c:slz_init
Unexecuted instantiation: proxy.c:slz_init
Unexecuted instantiation: resolvers.c:slz_init
Unexecuted instantiation: ring.c:slz_init
Unexecuted instantiation: sample.c:slz_init
Unexecuted instantiation: server.c:slz_init
Unexecuted instantiation: session.c:slz_init
Unexecuted instantiation: signal.c:slz_init
Unexecuted instantiation: sink.c:slz_init
Unexecuted instantiation: sock.c:slz_init
Unexecuted instantiation: sock_inet.c:slz_init
Unexecuted instantiation: stats-proxy.c:slz_init
Unexecuted instantiation: stats.c:slz_init
Unexecuted instantiation: stconn.c:slz_init
Unexecuted instantiation: stick_table.c:slz_init
Unexecuted instantiation: stream.c:slz_init
Unexecuted instantiation: sym.c:slz_init
Unexecuted instantiation: systemd.c:slz_init
Unexecuted instantiation: task.c:slz_init
Unexecuted instantiation: tcp_rules.c:slz_init
Unexecuted instantiation: tcpcheck.c:slz_init
Unexecuted instantiation: thread.c:slz_init
Unexecuted instantiation: tools.c:slz_init
Unexecuted instantiation: trace.c:slz_init
Unexecuted instantiation: twork.c:slz_init
Unexecuted instantiation: uri_auth.c:slz_init
Unexecuted instantiation: vars.c:slz_init
Unexecuted instantiation: version.c:slz_init
Unexecuted instantiation: acl.c:slz_init
Unexecuted instantiation: action.c:slz_init
Unexecuted instantiation: activity.c:slz_init
Unexecuted instantiation: applet.c:slz_init
Unexecuted instantiation: arg.c:slz_init
Unexecuted instantiation: auth.c:slz_init
Unexecuted instantiation: backend.c:slz_init
Unexecuted instantiation: cfgparse-listen.c:slz_init
Unexecuted instantiation: cfgparse.c:slz_init
Unexecuted instantiation: channel.c:slz_init
Unexecuted instantiation: check.c:slz_init
Unexecuted instantiation: cli.c:slz_init
Unexecuted instantiation: clock.c:slz_init
Unexecuted instantiation: connection.c:slz_init
Unexecuted instantiation: counters.c:slz_init
Unexecuted instantiation: dgram.c:slz_init
Unexecuted instantiation: dns.c:slz_init
Unexecuted instantiation: dns_ring.c:slz_init
Unexecuted instantiation: dynbuf.c:slz_init
Unexecuted instantiation: errors.c:slz_init
Unexecuted instantiation: event_hdl.c:slz_init
Unexecuted instantiation: extcheck.c:slz_init
Unexecuted instantiation: filters.c:slz_init
Unexecuted instantiation: fix.c:slz_init
Unexecuted instantiation: flt_bwlim.c:slz_init
Unexecuted instantiation: flt_decomp.c:slz_init
Unexecuted instantiation: flt_http_comp.c:slz_init
Unexecuted instantiation: flt_spoe.c:slz_init
Unexecuted instantiation: flt_trace.c:slz_init
Unexecuted instantiation: freq_ctr.c:slz_init
Unexecuted instantiation: frontend.c:slz_init
Unexecuted instantiation: guid.c:slz_init
Unexecuted instantiation: h1.c:slz_init
Unexecuted instantiation: haterm.c:slz_init
Unexecuted instantiation: http_ana.c:slz_init
Unexecuted instantiation: http_ext.c:slz_init
Unexecuted instantiation: http_fetch.c:slz_init
Unexecuted instantiation: http_rules.c:slz_init
Unexecuted instantiation: lb_chash.c:slz_init
Unexecuted instantiation: lb_fas.c:slz_init
Unexecuted instantiation: lb_fwlc.c:slz_init
Unexecuted instantiation: lb_fwrr.c:slz_init
Unexecuted instantiation: lb_map.c:slz_init
Unexecuted instantiation: lb_ss.c:slz_init
Unexecuted instantiation: mailers.c:slz_init
Unexecuted instantiation: mqtt.c:slz_init
Unexecuted instantiation: mux_spop.c:slz_init
Unexecuted instantiation: pattern.c:slz_init
Unexecuted instantiation: payload.c:slz_init
Unexecuted instantiation: pipe.c:slz_init
Unexecuted instantiation: proto_rhttp.c:slz_init
Unexecuted instantiation: queue.c:slz_init
Unexecuted instantiation: regex.c:slz_init
Unexecuted instantiation: stats-file.c:slz_init
Unexecuted instantiation: stats-html.c:slz_init
Unexecuted instantiation: stats-json.c:slz_init
Unexecuted instantiation: cache.c:slz_init
Unexecuted instantiation: cfgcond.c:slz_init
Unexecuted instantiation: cfgparse-global.c:slz_init
Unexecuted instantiation: compression.c:slz_init
Unexecuted instantiation: fcgi-app.c:slz_init
Unexecuted instantiation: proto_tcp.c:slz_init
Unexecuted instantiation: shctx.c:slz_init
Unexecuted instantiation: slz.c:slz_init
Unexecuted instantiation: slz_common.c:slz_init
Unexecuted instantiation: uslz.c:slz_init
136
137
/* Encodes the block according to the format used by the stream. This means
138
 * that the CRC of the input block may be computed according to the CRC32 or
139
 * adler-32 algorithms. The number of output bytes is returned.
140
 */
141
static inline long slz_encode(struct slz_stream *strm, void *out,
142
                              const void *in, long ilen, int more)
143
0
{
144
0
  long ret;
145
146
0
  if (strm->format == SLZ_FMT_GZIP)
147
0
    ret = slz_rfc1952_encode(strm, (unsigned char *) out, (const unsigned char *) in, ilen, more);
148
0
  else if (strm->format == SLZ_FMT_ZLIB)
149
0
    ret = slz_rfc1950_encode(strm, (unsigned char *) out, (const unsigned char *) in, ilen, more);
150
0
  else /* deflate for other ones */
151
0
    ret = slz_rfc1951_encode(strm, (unsigned char *) out, (const unsigned char *) in, ilen, more);
152
153
0
  return ret;
154
0
}
Unexecuted instantiation: chunk.c:slz_encode
Unexecuted instantiation: debug.c:slz_encode
Unexecuted instantiation: fd.c:slz_encode
Unexecuted instantiation: h1_htx.c:slz_encode
Unexecuted instantiation: http.c:slz_encode
Unexecuted instantiation: http_htx.c:slz_encode
Unexecuted instantiation: htx.c:slz_encode
Unexecuted instantiation: limits.c:slz_encode
Unexecuted instantiation: listener.c:slz_encode
Unexecuted instantiation: log.c:slz_encode
Unexecuted instantiation: mworker.c:slz_encode
Unexecuted instantiation: peers.c:slz_encode
Unexecuted instantiation: pool.c:slz_encode
Unexecuted instantiation: proto_sockpair.c:slz_encode
Unexecuted instantiation: protocol.c:slz_encode
Unexecuted instantiation: proxy.c:slz_encode
Unexecuted instantiation: resolvers.c:slz_encode
Unexecuted instantiation: ring.c:slz_encode
Unexecuted instantiation: sample.c:slz_encode
Unexecuted instantiation: server.c:slz_encode
Unexecuted instantiation: session.c:slz_encode
Unexecuted instantiation: signal.c:slz_encode
Unexecuted instantiation: sink.c:slz_encode
Unexecuted instantiation: sock.c:slz_encode
Unexecuted instantiation: sock_inet.c:slz_encode
Unexecuted instantiation: stats-proxy.c:slz_encode
Unexecuted instantiation: stats.c:slz_encode
Unexecuted instantiation: stconn.c:slz_encode
Unexecuted instantiation: stick_table.c:slz_encode
Unexecuted instantiation: stream.c:slz_encode
Unexecuted instantiation: sym.c:slz_encode
Unexecuted instantiation: systemd.c:slz_encode
Unexecuted instantiation: task.c:slz_encode
Unexecuted instantiation: tcp_rules.c:slz_encode
Unexecuted instantiation: tcpcheck.c:slz_encode
Unexecuted instantiation: thread.c:slz_encode
Unexecuted instantiation: tools.c:slz_encode
Unexecuted instantiation: trace.c:slz_encode
Unexecuted instantiation: twork.c:slz_encode
Unexecuted instantiation: uri_auth.c:slz_encode
Unexecuted instantiation: vars.c:slz_encode
Unexecuted instantiation: version.c:slz_encode
Unexecuted instantiation: acl.c:slz_encode
Unexecuted instantiation: action.c:slz_encode
Unexecuted instantiation: activity.c:slz_encode
Unexecuted instantiation: applet.c:slz_encode
Unexecuted instantiation: arg.c:slz_encode
Unexecuted instantiation: auth.c:slz_encode
Unexecuted instantiation: backend.c:slz_encode
Unexecuted instantiation: cfgparse-listen.c:slz_encode
Unexecuted instantiation: cfgparse.c:slz_encode
Unexecuted instantiation: channel.c:slz_encode
Unexecuted instantiation: check.c:slz_encode
Unexecuted instantiation: cli.c:slz_encode
Unexecuted instantiation: clock.c:slz_encode
Unexecuted instantiation: connection.c:slz_encode
Unexecuted instantiation: counters.c:slz_encode
Unexecuted instantiation: dgram.c:slz_encode
Unexecuted instantiation: dns.c:slz_encode
Unexecuted instantiation: dns_ring.c:slz_encode
Unexecuted instantiation: dynbuf.c:slz_encode
Unexecuted instantiation: errors.c:slz_encode
Unexecuted instantiation: event_hdl.c:slz_encode
Unexecuted instantiation: extcheck.c:slz_encode
Unexecuted instantiation: filters.c:slz_encode
Unexecuted instantiation: fix.c:slz_encode
Unexecuted instantiation: flt_bwlim.c:slz_encode
Unexecuted instantiation: flt_decomp.c:slz_encode
Unexecuted instantiation: flt_http_comp.c:slz_encode
Unexecuted instantiation: flt_spoe.c:slz_encode
Unexecuted instantiation: flt_trace.c:slz_encode
Unexecuted instantiation: freq_ctr.c:slz_encode
Unexecuted instantiation: frontend.c:slz_encode
Unexecuted instantiation: guid.c:slz_encode
Unexecuted instantiation: h1.c:slz_encode
Unexecuted instantiation: haterm.c:slz_encode
Unexecuted instantiation: http_ana.c:slz_encode
Unexecuted instantiation: http_ext.c:slz_encode
Unexecuted instantiation: http_fetch.c:slz_encode
Unexecuted instantiation: http_rules.c:slz_encode
Unexecuted instantiation: lb_chash.c:slz_encode
Unexecuted instantiation: lb_fas.c:slz_encode
Unexecuted instantiation: lb_fwlc.c:slz_encode
Unexecuted instantiation: lb_fwrr.c:slz_encode
Unexecuted instantiation: lb_map.c:slz_encode
Unexecuted instantiation: lb_ss.c:slz_encode
Unexecuted instantiation: mailers.c:slz_encode
Unexecuted instantiation: mqtt.c:slz_encode
Unexecuted instantiation: mux_spop.c:slz_encode
Unexecuted instantiation: pattern.c:slz_encode
Unexecuted instantiation: payload.c:slz_encode
Unexecuted instantiation: pipe.c:slz_encode
Unexecuted instantiation: proto_rhttp.c:slz_encode
Unexecuted instantiation: queue.c:slz_encode
Unexecuted instantiation: regex.c:slz_encode
Unexecuted instantiation: stats-file.c:slz_encode
Unexecuted instantiation: stats-html.c:slz_encode
Unexecuted instantiation: stats-json.c:slz_encode
Unexecuted instantiation: cache.c:slz_encode
Unexecuted instantiation: cfgcond.c:slz_encode
Unexecuted instantiation: cfgparse-global.c:slz_encode
Unexecuted instantiation: compression.c:slz_encode
Unexecuted instantiation: fcgi-app.c:slz_encode
Unexecuted instantiation: proto_tcp.c:slz_encode
Unexecuted instantiation: shctx.c:slz_encode
Unexecuted instantiation: slz.c:slz_encode
Unexecuted instantiation: slz_common.c:slz_encode
Unexecuted instantiation: uslz.c:slz_encode
155
156
/* Flushes pending bits and sends the trailer for stream <strm> into buffer
157
 * <buf> if needed. When it's done, the stream state is updated to SLZ_ST_END.
158
 * It returns the number of bytes emitted. The trailer consists in flushing the
159
 * possibly pending bits from the queue, the possible EOB and the final empty
160
 * block, rounding to the next byte, then 4 bytes for the CRC when doing
161
 * zlib/gzip, then another 4 bytes for the input length for gzip. That may
162
 * amount to 6+4+4 = 14 bytes, that the caller must ensure are available before
163
 * calling the function. Note that if the initial header was never sent, it
164
 * will be sent first as well (up to 10 extra bytes).
165
 */
166
static inline int slz_finish(struct slz_stream *strm, void *buf)
167
0
{
168
0
  int ret;
169
170
0
  if (strm->format == SLZ_FMT_GZIP)
171
0
    ret = slz_rfc1952_finish(strm, (unsigned char *) buf);
172
0
  else if (strm->format == SLZ_FMT_ZLIB)
173
0
    ret = slz_rfc1950_finish(strm, (unsigned char *) buf);
174
0
  else /* deflate for other ones */
175
0
    ret = slz_rfc1951_finish(strm, (unsigned char *) buf);
176
177
0
  return ret;
178
0
}
Unexecuted instantiation: chunk.c:slz_finish
Unexecuted instantiation: debug.c:slz_finish
Unexecuted instantiation: fd.c:slz_finish
Unexecuted instantiation: h1_htx.c:slz_finish
Unexecuted instantiation: http.c:slz_finish
Unexecuted instantiation: http_htx.c:slz_finish
Unexecuted instantiation: htx.c:slz_finish
Unexecuted instantiation: limits.c:slz_finish
Unexecuted instantiation: listener.c:slz_finish
Unexecuted instantiation: log.c:slz_finish
Unexecuted instantiation: mworker.c:slz_finish
Unexecuted instantiation: peers.c:slz_finish
Unexecuted instantiation: pool.c:slz_finish
Unexecuted instantiation: proto_sockpair.c:slz_finish
Unexecuted instantiation: protocol.c:slz_finish
Unexecuted instantiation: proxy.c:slz_finish
Unexecuted instantiation: resolvers.c:slz_finish
Unexecuted instantiation: ring.c:slz_finish
Unexecuted instantiation: sample.c:slz_finish
Unexecuted instantiation: server.c:slz_finish
Unexecuted instantiation: session.c:slz_finish
Unexecuted instantiation: signal.c:slz_finish
Unexecuted instantiation: sink.c:slz_finish
Unexecuted instantiation: sock.c:slz_finish
Unexecuted instantiation: sock_inet.c:slz_finish
Unexecuted instantiation: stats-proxy.c:slz_finish
Unexecuted instantiation: stats.c:slz_finish
Unexecuted instantiation: stconn.c:slz_finish
Unexecuted instantiation: stick_table.c:slz_finish
Unexecuted instantiation: stream.c:slz_finish
Unexecuted instantiation: sym.c:slz_finish
Unexecuted instantiation: systemd.c:slz_finish
Unexecuted instantiation: task.c:slz_finish
Unexecuted instantiation: tcp_rules.c:slz_finish
Unexecuted instantiation: tcpcheck.c:slz_finish
Unexecuted instantiation: thread.c:slz_finish
Unexecuted instantiation: tools.c:slz_finish
Unexecuted instantiation: trace.c:slz_finish
Unexecuted instantiation: twork.c:slz_finish
Unexecuted instantiation: uri_auth.c:slz_finish
Unexecuted instantiation: vars.c:slz_finish
Unexecuted instantiation: version.c:slz_finish
Unexecuted instantiation: acl.c:slz_finish
Unexecuted instantiation: action.c:slz_finish
Unexecuted instantiation: activity.c:slz_finish
Unexecuted instantiation: applet.c:slz_finish
Unexecuted instantiation: arg.c:slz_finish
Unexecuted instantiation: auth.c:slz_finish
Unexecuted instantiation: backend.c:slz_finish
Unexecuted instantiation: cfgparse-listen.c:slz_finish
Unexecuted instantiation: cfgparse.c:slz_finish
Unexecuted instantiation: channel.c:slz_finish
Unexecuted instantiation: check.c:slz_finish
Unexecuted instantiation: cli.c:slz_finish
Unexecuted instantiation: clock.c:slz_finish
Unexecuted instantiation: connection.c:slz_finish
Unexecuted instantiation: counters.c:slz_finish
Unexecuted instantiation: dgram.c:slz_finish
Unexecuted instantiation: dns.c:slz_finish
Unexecuted instantiation: dns_ring.c:slz_finish
Unexecuted instantiation: dynbuf.c:slz_finish
Unexecuted instantiation: errors.c:slz_finish
Unexecuted instantiation: event_hdl.c:slz_finish
Unexecuted instantiation: extcheck.c:slz_finish
Unexecuted instantiation: filters.c:slz_finish
Unexecuted instantiation: fix.c:slz_finish
Unexecuted instantiation: flt_bwlim.c:slz_finish
Unexecuted instantiation: flt_decomp.c:slz_finish
Unexecuted instantiation: flt_http_comp.c:slz_finish
Unexecuted instantiation: flt_spoe.c:slz_finish
Unexecuted instantiation: flt_trace.c:slz_finish
Unexecuted instantiation: freq_ctr.c:slz_finish
Unexecuted instantiation: frontend.c:slz_finish
Unexecuted instantiation: guid.c:slz_finish
Unexecuted instantiation: h1.c:slz_finish
Unexecuted instantiation: haterm.c:slz_finish
Unexecuted instantiation: http_ana.c:slz_finish
Unexecuted instantiation: http_ext.c:slz_finish
Unexecuted instantiation: http_fetch.c:slz_finish
Unexecuted instantiation: http_rules.c:slz_finish
Unexecuted instantiation: lb_chash.c:slz_finish
Unexecuted instantiation: lb_fas.c:slz_finish
Unexecuted instantiation: lb_fwlc.c:slz_finish
Unexecuted instantiation: lb_fwrr.c:slz_finish
Unexecuted instantiation: lb_map.c:slz_finish
Unexecuted instantiation: lb_ss.c:slz_finish
Unexecuted instantiation: mailers.c:slz_finish
Unexecuted instantiation: mqtt.c:slz_finish
Unexecuted instantiation: mux_spop.c:slz_finish
Unexecuted instantiation: pattern.c:slz_finish
Unexecuted instantiation: payload.c:slz_finish
Unexecuted instantiation: pipe.c:slz_finish
Unexecuted instantiation: proto_rhttp.c:slz_finish
Unexecuted instantiation: queue.c:slz_finish
Unexecuted instantiation: regex.c:slz_finish
Unexecuted instantiation: stats-file.c:slz_finish
Unexecuted instantiation: stats-html.c:slz_finish
Unexecuted instantiation: stats-json.c:slz_finish
Unexecuted instantiation: cache.c:slz_finish
Unexecuted instantiation: cfgcond.c:slz_finish
Unexecuted instantiation: cfgparse-global.c:slz_finish
Unexecuted instantiation: compression.c:slz_finish
Unexecuted instantiation: fcgi-app.c:slz_finish
Unexecuted instantiation: proto_tcp.c:slz_finish
Unexecuted instantiation: shctx.c:slz_finish
Unexecuted instantiation: slz.c:slz_finish
Unexecuted instantiation: slz_common.c:slz_finish
Unexecuted instantiation: uslz.c:slz_finish
179
180
/* Flushes any pending data for stream <strm> into buffer <buf>, then emits an
181
 * empty literal block to byte-align the output, allowing to completely flush
182
 * the queue. Note that if the initial header was never sent, it will be sent
183
 * first as well (0, 2 or 10 extra bytes). This requires that the output buffer
184
 * still has this plus the 6 bytes needed to flush the queue, the possible EOB
185
 * and the (BFINAL,BTYPE) bits, plus 4 bytes for LEN+NLEN, or a total of 20
186
 * bytes in the worst case. The number of bytes emitted is returned. It is
187
 * guaranteed that the queue is empty on return. This may cause some overhead
188
 * by adding needless 5-byte blocks if called to often.
189
 */
190
static inline int slz_flush(struct slz_stream *strm, void *buf)
191
0
{
192
0
  int ret;
193
194
0
  if (strm->format == SLZ_FMT_GZIP)
195
0
    ret = slz_rfc1952_flush(strm, (unsigned char *) buf);
196
0
  else if (strm->format == SLZ_FMT_ZLIB)
197
0
    ret = slz_rfc1950_flush(strm, (unsigned char *) buf);
198
0
  else /* deflate for other ones */
199
0
    ret = slz_rfc1951_flush(strm, (unsigned char *) buf);
200
201
0
  return ret;
202
0
}
Unexecuted instantiation: chunk.c:slz_flush
Unexecuted instantiation: debug.c:slz_flush
Unexecuted instantiation: fd.c:slz_flush
Unexecuted instantiation: h1_htx.c:slz_flush
Unexecuted instantiation: http.c:slz_flush
Unexecuted instantiation: http_htx.c:slz_flush
Unexecuted instantiation: htx.c:slz_flush
Unexecuted instantiation: limits.c:slz_flush
Unexecuted instantiation: listener.c:slz_flush
Unexecuted instantiation: log.c:slz_flush
Unexecuted instantiation: mworker.c:slz_flush
Unexecuted instantiation: peers.c:slz_flush
Unexecuted instantiation: pool.c:slz_flush
Unexecuted instantiation: proto_sockpair.c:slz_flush
Unexecuted instantiation: protocol.c:slz_flush
Unexecuted instantiation: proxy.c:slz_flush
Unexecuted instantiation: resolvers.c:slz_flush
Unexecuted instantiation: ring.c:slz_flush
Unexecuted instantiation: sample.c:slz_flush
Unexecuted instantiation: server.c:slz_flush
Unexecuted instantiation: session.c:slz_flush
Unexecuted instantiation: signal.c:slz_flush
Unexecuted instantiation: sink.c:slz_flush
Unexecuted instantiation: sock.c:slz_flush
Unexecuted instantiation: sock_inet.c:slz_flush
Unexecuted instantiation: stats-proxy.c:slz_flush
Unexecuted instantiation: stats.c:slz_flush
Unexecuted instantiation: stconn.c:slz_flush
Unexecuted instantiation: stick_table.c:slz_flush
Unexecuted instantiation: stream.c:slz_flush
Unexecuted instantiation: sym.c:slz_flush
Unexecuted instantiation: systemd.c:slz_flush
Unexecuted instantiation: task.c:slz_flush
Unexecuted instantiation: tcp_rules.c:slz_flush
Unexecuted instantiation: tcpcheck.c:slz_flush
Unexecuted instantiation: thread.c:slz_flush
Unexecuted instantiation: tools.c:slz_flush
Unexecuted instantiation: trace.c:slz_flush
Unexecuted instantiation: twork.c:slz_flush
Unexecuted instantiation: uri_auth.c:slz_flush
Unexecuted instantiation: vars.c:slz_flush
Unexecuted instantiation: version.c:slz_flush
Unexecuted instantiation: acl.c:slz_flush
Unexecuted instantiation: action.c:slz_flush
Unexecuted instantiation: activity.c:slz_flush
Unexecuted instantiation: applet.c:slz_flush
Unexecuted instantiation: arg.c:slz_flush
Unexecuted instantiation: auth.c:slz_flush
Unexecuted instantiation: backend.c:slz_flush
Unexecuted instantiation: cfgparse-listen.c:slz_flush
Unexecuted instantiation: cfgparse.c:slz_flush
Unexecuted instantiation: channel.c:slz_flush
Unexecuted instantiation: check.c:slz_flush
Unexecuted instantiation: cli.c:slz_flush
Unexecuted instantiation: clock.c:slz_flush
Unexecuted instantiation: connection.c:slz_flush
Unexecuted instantiation: counters.c:slz_flush
Unexecuted instantiation: dgram.c:slz_flush
Unexecuted instantiation: dns.c:slz_flush
Unexecuted instantiation: dns_ring.c:slz_flush
Unexecuted instantiation: dynbuf.c:slz_flush
Unexecuted instantiation: errors.c:slz_flush
Unexecuted instantiation: event_hdl.c:slz_flush
Unexecuted instantiation: extcheck.c:slz_flush
Unexecuted instantiation: filters.c:slz_flush
Unexecuted instantiation: fix.c:slz_flush
Unexecuted instantiation: flt_bwlim.c:slz_flush
Unexecuted instantiation: flt_decomp.c:slz_flush
Unexecuted instantiation: flt_http_comp.c:slz_flush
Unexecuted instantiation: flt_spoe.c:slz_flush
Unexecuted instantiation: flt_trace.c:slz_flush
Unexecuted instantiation: freq_ctr.c:slz_flush
Unexecuted instantiation: frontend.c:slz_flush
Unexecuted instantiation: guid.c:slz_flush
Unexecuted instantiation: h1.c:slz_flush
Unexecuted instantiation: haterm.c:slz_flush
Unexecuted instantiation: http_ana.c:slz_flush
Unexecuted instantiation: http_ext.c:slz_flush
Unexecuted instantiation: http_fetch.c:slz_flush
Unexecuted instantiation: http_rules.c:slz_flush
Unexecuted instantiation: lb_chash.c:slz_flush
Unexecuted instantiation: lb_fas.c:slz_flush
Unexecuted instantiation: lb_fwlc.c:slz_flush
Unexecuted instantiation: lb_fwrr.c:slz_flush
Unexecuted instantiation: lb_map.c:slz_flush
Unexecuted instantiation: lb_ss.c:slz_flush
Unexecuted instantiation: mailers.c:slz_flush
Unexecuted instantiation: mqtt.c:slz_flush
Unexecuted instantiation: mux_spop.c:slz_flush
Unexecuted instantiation: pattern.c:slz_flush
Unexecuted instantiation: payload.c:slz_flush
Unexecuted instantiation: pipe.c:slz_flush
Unexecuted instantiation: proto_rhttp.c:slz_flush
Unexecuted instantiation: queue.c:slz_flush
Unexecuted instantiation: regex.c:slz_flush
Unexecuted instantiation: stats-file.c:slz_flush
Unexecuted instantiation: stats-html.c:slz_flush
Unexecuted instantiation: stats-json.c:slz_flush
Unexecuted instantiation: cache.c:slz_flush
Unexecuted instantiation: cfgcond.c:slz_flush
Unexecuted instantiation: cfgparse-global.c:slz_flush
Unexecuted instantiation: compression.c:slz_flush
Unexecuted instantiation: fcgi-app.c:slz_flush
Unexecuted instantiation: proto_tcp.c:slz_flush
Unexecuted instantiation: shctx.c:slz_flush
Unexecuted instantiation: slz.c:slz_flush
Unexecuted instantiation: slz_common.c:slz_flush
Unexecuted instantiation: uslz.c:slz_flush
203
204
/*
205
 * =============================================================================
206
 *                                uslz API
207
 *                      (u stands for uncompress)
208
 * =============================================================================
209
 */
210
211
#define USLZ_FL_NONE        0x0000
212
0
#define USLZ_FL_GZIP        0x0001
213
0
#define USLZ_FL_ZLIB        0x0002
214
0
#define USLZ_FL_FINAL       0x0004   /* current block is the last one. */
215
0
#define USLZ_FL_COMPLETE    0x0008   /* last block is completely treated, marks end of the decompressed stream */
216
0
#define USLZ_FL_EXP_GZIP    0x0010   /* caller explicitly imposed the gzip envelope */
217
0
#define USLZ_FL_EXP_ZLIB    0x0020   /* caller explicitly imposed the zlib envelope */
218
219
220
enum uslz_stream_state {
221
  USLZ_ST_INITIAL = 0,  /* Initial state of a new state block (must be zero). */
222
  USLZ_ST_PARTIAL_HEADER,  /* Waiting for a second data byte. */
223
  USLZ_ST_HEADER,
224
  USLZ_ST_UNCOMPRESSED_LEN,
225
  USLZ_ST_UNCOMPRESSED_ILEN,
226
  USLZ_ST_UNCOMPRESSED_DATA,
227
  USLZ_ST_LITERAL_COUNT,
228
  USLZ_ST_DISTANCE_COUNT,
229
  USLZ_ST_CODELEN_COUNT,
230
  USLZ_ST_READ_CODE_LENGTHS,
231
  USLZ_ST_READ_LENGTHS,
232
  USLZ_ST_READ_LENGTHS_16,
233
  USLZ_ST_READ_LENGTHS_17,
234
  USLZ_ST_READ_LENGTHS_18,
235
  USLZ_ST_READ_SYMBOL,
236
  USLZ_ST_READ_LENGTH,
237
  USLZ_ST_READ_DISTANCE,
238
  USLZ_ST_READ_DISTANCE_RET,
239
  USLZ_ST_READ_DISTANCE_EXTRA,
240
  USLZ_ST_CHECK_CKSUM,
241
};
242
243
/* decompression state */
244
struct uslz_stream {
245
  enum uslz_stream_state state;         /* parsing state, USLZ_ST_* */
246
247
  uint32_t crc;                         /* current crc value for the stream */
248
  uint16_t flags;                       /* USLZ_FL_* flags */
249
  unsigned int counter;                 /* generic counter */
250
  const unsigned char *in_ptr;          /* pointer to the next byte to read from
251
                                         * input buffer
252
                                         */
253
  const unsigned char *in_top;          /* pointer to one byte past the last byte
254
                                         * of the input buffer
255
                                         */
256
  unsigned int distance;
257
  unsigned char *out_base;              /* pointer to the beginning of the output
258
                                         * buffer
259
                                         */
260
  unsigned long out_max;                /* max number of bytes in ouput buffer */
261
  unsigned long dec_total;              /* total number of decoded bytes from stream */
262
  unsigned long dec_bofs;               /* offset used to read the current decoded block */
263
  unsigned long dec_bsize;              /* size of the current decoded block */
264
265
  uint64_t bit_accum;                   /* bit accumulator (used by GETBITS() macro) */
266
  unsigned char num_bits;               /* number of bits in the accumulator */
267
268
  unsigned char block_type;             /* compressed block type */
269
  unsigned int huff_index;              /* current index for pending huffman decoding
270
                                         * attempt
271
                                         */
272
  unsigned int symbol;                  /* symbol code currently being processed */
273
  unsigned int last_value;              /* last value read for length / distance table
274
                                         * construction
275
                                         */
276
  unsigned int repeat_length;           /* repeated string length */
277
278
  unsigned int len;                     /* uncompressed block length */
279
  unsigned int ilen;                    /* uncompressed block inverted length */
280
  unsigned int nread;                   /* number of bytes copied from uncompressed block */
281
282
  /* literal_table: Code-to-symbol conversion table for the alphabet used
283
   * for literals and length values.  Elements 0 and 1 correspond to a
284
   * one-bit code of 0 or 1, respectively; other elements are linked
285
   * (directly or indirectly) from these to represent the Huffman tree.
286
   * The value of each element is:
287
   *    - for terminal codes, the symbol corresponding to the code (a
288
   *      nonnegative value);
289
   *    - for nonterminal codes, the one's complement of the array index
290
   *      corresponding to the code with a zero appended (the following
291
   *      array element corresponds to the code with a one appended).
292
   * For an alphabet of N symbols, a Huffman tree will have N-1 non-leaf
293
   * nodes (including the root node, which is not represented in the
294
   * array).  In the case of the literal/length alphabet, there are
295
   * normally 286 symbols; however, the default (static) Huffman table
296
   * uses a 288-symbol alphabet with two unused symbols, so we reserve
297
   * enough space for that alphabet.
298
   */
299
  short literal_table[288*2-2];
300
  union {
301
    /* Code-to-symbol conversion table for the alphabet used for
302
     * distances.  This alphabet consists of 32 symbols, 2 of
303
     * which are unused.
304
     */
305
    short distance_table[32*2-2];
306
    /* we may need to hold up to 10 bytes to detect the format
307
     * (zlib/gzip/raw) before starting to decode the stream, thus
308
     * we use the distance table memory which is only used when we
309
     * start decoding.
310
     */
311
    struct {
312
      unsigned char buf[10];
313
      int buf_len;
314
      char gzip_flags;
315
    } hdr_detect;
316
  };
317
  short codelen_table[19*2-2];          /* Code-to-symbol conversion table for the alphabet
318
                                         * used for code lengths.
319
                                         */
320
  unsigned int literal_count;           /* number of literal codes in the Huffman table
321
                                         * (HLIT in RFC 1951)
322
                                         */
323
  unsigned int distance_count;          /* number of distance codes in the Huffman table
324
                                         * (HDIST in RFC 1951)
325
                                         */
326
  unsigned int codelen_count;           /* number of codelen codes in the Huffman table
327
                                         * used for decompressing the main Huffman tables
328
                                         * (HCLEN in RFC 1951)
329
                                         */
330
  unsigned char literal_len[288];       /* code length for the symbol in literal_table */
331
  unsigned char distance_len[32];       /* code length for the symbol in distance table */
332
  unsigned char codelen_len[19];        /* code length for the symbol in codelen table */
333
};
334
335
/* list of possible return values for uslz_decode() */
336
enum uslz_decode_ret {
337
  USLZ_DECODE_SUCCESS,
338
  USLZ_DECODE_OUT_OF_SPACE,
339
  USLZ_DECODE_OUT_OF_DATA,
340
  USLZ_DECODE_E_INVALID_ARGUMENT,
341
  USLZ_DECODE_E_BAD_COMP_METHOD,
342
  USLZ_DECODE_E_BAD_CRC,
343
  USLZ_DECODE_E_DICT,
344
  USLZ_DECODE_E_OUT_BUFFER,
345
  USLZ_DECODE_E_GEN_HUFF,
346
  USLZ_DECODE_E_DISTANCE,
347
  USLZ_DECODE_E_INVALID_SYMBOL,
348
  USLZ_DECODE_E_INVALID_STATE,
349
  USLZ_DECODE_E_INVALID_BLOCK_CODE,
350
  USLZ_DECODE_E_INVALID_DATA,
351
  USLZ_DECODE_E_CORRUPT,
352
  USLZ_DECODE_E_UNEXPECTED,
353
};
354
355
int uslz_init(struct uslz_stream *strm, unsigned char *output_buffer, long output_size);
356
int uslz_init_fmt(struct uslz_stream *strm, unsigned char *output_buffer, long output_size,
357
                  int format);
358
enum uslz_decode_ret uslz_decode(struct uslz_stream *state,
359
                                 const unsigned char *compressed_data, long compressed_size,
360
                                 unsigned char **decoded_data, long *decoded_size,
361
                                 long *consumed_bytes, uint32_t *crc_ret);
362
363
#endif