Coverage Report

Created: 2026-09-28 07:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/lzma-rs-0.2.0/src/decode/lzbuffer.rs
Line
Count
Source
1
use crate::error;
2
use std::io;
3
4
pub trait LzBuffer<W>
5
where
6
    W: io::Write,
7
{
8
    fn len(&self) -> usize;
9
    // Retrieve the last byte or return a default
10
    fn last_or(&self, lit: u8) -> u8;
11
    // Retrieve the n-th last byte
12
    fn last_n(&self, dist: usize) -> error::Result<u8>;
13
    // Append a literal
14
    fn append_literal(&mut self, lit: u8) -> error::Result<()>;
15
    // Fetch an LZ sequence (length, distance) from inside the buffer
16
    fn append_lz(&mut self, len: usize, dist: usize) -> error::Result<()>;
17
    // Get a reference to the output sink
18
    fn get_output(&self) -> &W;
19
    // Get a mutable reference to the output sink
20
    fn get_output_mut(&mut self) -> &mut W;
21
    // Consumes this buffer and flushes any data
22
    fn finish(self) -> io::Result<W>;
23
    // Consumes this buffer without flushing any data
24
    fn into_output(self) -> W;
25
}
26
27
// An accumulating buffer for LZ sequences
28
pub struct LzAccumBuffer<W>
29
where
30
    W: io::Write,
31
{
32
    stream: W,       // Output sink
33
    buf: Vec<u8>,    // Buffer
34
    memlimit: usize, // Buffer memory limit
35
    len: usize,      // Total number of bytes sent through the buffer
36
}
37
38
impl<W> LzAccumBuffer<W>
39
where
40
    W: io::Write,
41
{
42
0
    pub fn from_stream(stream: W) -> Self {
43
0
        Self::from_stream_with_memlimit(stream, std::usize::MAX)
44
0
    }
45
46
0
    pub fn from_stream_with_memlimit(stream: W, memlimit: usize) -> Self {
47
0
        Self {
48
0
            stream,
49
0
            buf: Vec::new(),
50
0
            memlimit,
51
0
            len: 0,
52
0
        }
53
0
    }
54
55
    // Append bytes
56
0
    pub fn append_bytes(&mut self, buf: &[u8]) {
57
0
        self.buf.extend_from_slice(buf);
58
0
        self.len += buf.len();
59
0
    }
60
61
    // Reset the internal dictionary
62
0
    pub fn reset(&mut self) -> io::Result<()> {
63
0
        self.stream.write_all(self.buf.as_slice())?;
64
0
        self.buf.clear();
65
0
        self.len = 0;
66
0
        Ok(())
67
0
    }
68
}
69
70
impl<W> LzBuffer<W> for LzAccumBuffer<W>
71
where
72
    W: io::Write,
73
{
74
0
    fn len(&self) -> usize {
75
0
        self.len
76
0
    }
77
78
    // Retrieve the last byte or return a default
79
0
    fn last_or(&self, lit: u8) -> u8 {
80
0
        let buf_len = self.buf.len();
81
0
        if buf_len == 0 {
82
0
            lit
83
        } else {
84
0
            self.buf[buf_len - 1]
85
        }
86
0
    }
87
88
    // Retrieve the n-th last byte
89
0
    fn last_n(&self, dist: usize) -> error::Result<u8> {
90
0
        let buf_len = self.buf.len();
91
0
        if dist > buf_len {
92
0
            return Err(error::Error::LzmaError(format!(
93
0
                "Match distance {} is beyond output size {}",
94
0
                dist, buf_len
95
0
            )));
96
0
        }
97
98
0
        Ok(self.buf[buf_len - dist])
99
0
    }
100
101
    // Append a literal
102
0
    fn append_literal(&mut self, lit: u8) -> error::Result<()> {
103
0
        let new_len = self.len + 1;
104
105
0
        if new_len > self.memlimit {
106
0
            Err(error::Error::LzmaError(format!(
107
0
                "exceeded memory limit of {}",
108
0
                self.memlimit
109
0
            )))
110
        } else {
111
0
            self.buf.push(lit);
112
0
            self.len = new_len;
113
0
            Ok(())
114
        }
115
0
    }
116
117
    // Fetch an LZ sequence (length, distance) from inside the buffer
118
0
    fn append_lz(&mut self, len: usize, dist: usize) -> error::Result<()> {
119
        lzma_debug!("LZ {{ len: {}, dist: {} }}", len, dist);
120
0
        let buf_len = self.buf.len();
121
0
        if dist > buf_len {
122
0
            return Err(error::Error::LzmaError(format!(
123
0
                "LZ distance {} is beyond output size {}",
124
0
                dist, buf_len
125
0
            )));
126
0
        }
127
128
0
        let mut offset = buf_len - dist;
129
0
        for _ in 0..len {
130
0
            let x = self.buf[offset];
131
0
            self.buf.push(x);
132
0
            offset += 1;
133
0
        }
134
0
        self.len += len;
135
0
        Ok(())
136
0
    }
137
138
    // Get a reference to the output sink
139
0
    fn get_output(&self) -> &W {
140
0
        &self.stream
141
0
    }
142
143
    // Get a mutable reference to the output sink
144
0
    fn get_output_mut(&mut self) -> &mut W {
145
0
        &mut self.stream
146
0
    }
147
148
    // Consumes this buffer and flushes any data
149
0
    fn finish(mut self) -> io::Result<W> {
150
0
        self.stream.write_all(self.buf.as_slice())?;
151
0
        self.stream.flush()?;
152
0
        Ok(self.stream)
153
0
    }
154
155
    // Consumes this buffer without flushing any data
156
0
    fn into_output(self) -> W {
157
0
        self.stream
158
0
    }
159
}
160
161
// A circular buffer for LZ sequences
162
pub struct LzCircularBuffer<W>
163
where
164
    W: io::Write,
165
{
166
    stream: W,        // Output sink
167
    buf: Vec<u8>,     // Circular buffer
168
    dict_size: usize, // Length of the buffer
169
    memlimit: usize,  // Buffer memory limit
170
    cursor: usize,    // Current position
171
    len: usize,       // Total number of bytes sent through the buffer
172
}
173
174
impl<W> LzCircularBuffer<W>
175
where
176
    W: io::Write,
177
{
178
55.8k
    pub fn from_stream_with_memlimit(stream: W, dict_size: usize, memlimit: usize) -> Self {
179
        lzma_info!("Dict size in LZ buffer: {}", dict_size);
180
55.8k
        Self {
181
55.8k
            stream,
182
55.8k
            buf: Vec::new(),
183
55.8k
            dict_size,
184
55.8k
            memlimit,
185
55.8k
            cursor: 0,
186
55.8k
            len: 0,
187
55.8k
        }
188
55.8k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput>>::from_stream_with_memlimit
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_>>::from_stream_with_memlimit
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor>>::from_stream_with_memlimit
Line
Count
Source
178
4.84k
    pub fn from_stream_with_memlimit(stream: W, dict_size: usize, memlimit: usize) -> Self {
179
        lzma_info!("Dict size in LZ buffer: {}", dict_size);
180
4.84k
        Self {
181
4.84k
            stream,
182
4.84k
            buf: Vec::new(),
183
4.84k
            dict_size,
184
4.84k
            memlimit,
185
4.84k
            cursor: 0,
186
4.84k
            len: 0,
187
4.84k
        }
188
4.84k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput>>::from_stream_with_memlimit
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor>>::from_stream_with_memlimit
Line
Count
Source
178
51.0k
    pub fn from_stream_with_memlimit(stream: W, dict_size: usize, memlimit: usize) -> Self {
179
        lzma_info!("Dict size in LZ buffer: {}", dict_size);
180
51.0k
        Self {
181
51.0k
            stream,
182
51.0k
            buf: Vec::new(),
183
51.0k
            dict_size,
184
51.0k
            memlimit,
185
51.0k
            cursor: 0,
186
51.0k
            len: 0,
187
51.0k
        }
188
51.0k
    }
189
190
114M
    fn get(&self, index: usize) -> u8 {
191
114M
        *self.buf.get(index).unwrap_or(&0)
192
114M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput>>::get
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor>>::get
Line
Count
Source
190
8.46M
    fn get(&self, index: usize) -> u8 {
191
8.46M
        *self.buf.get(index).unwrap_or(&0)
192
8.46M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_>>::get
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput>>::get
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor>>::get
Line
Count
Source
190
105M
    fn get(&self, index: usize) -> u8 {
191
105M
        *self.buf.get(index).unwrap_or(&0)
192
105M
    }
193
194
114M
    fn set(&mut self, index: usize, value: u8) -> error::Result<()> {
195
114M
        let new_len = index + 1;
196
197
114M
        if self.buf.len() < new_len {
198
110M
            if new_len <= self.memlimit {
199
110M
                self.buf.resize(new_len, 0);
200
110M
            } else {
201
40
                return Err(error::Error::LzmaError(format!(
202
40
                    "exceeded memory limit of {}",
203
40
                    self.memlimit
204
40
                )));
205
            }
206
3.72M
        }
207
114M
        self.buf[index] = value;
208
114M
        Ok(())
209
114M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput>>::set
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor>>::set
Line
Count
Source
194
8.45M
    fn set(&mut self, index: usize, value: u8) -> error::Result<()> {
195
8.45M
        let new_len = index + 1;
196
197
8.45M
        if self.buf.len() < new_len {
198
8.44M
            if new_len <= self.memlimit {
199
8.44M
                self.buf.resize(new_len, 0);
200
8.44M
            } else {
201
2
                return Err(error::Error::LzmaError(format!(
202
2
                    "exceeded memory limit of {}",
203
2
                    self.memlimit
204
2
                )));
205
            }
206
12.9k
        }
207
8.45M
        self.buf[index] = value;
208
8.45M
        Ok(())
209
8.45M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_>>::set
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput>>::set
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor>>::set
Line
Count
Source
194
105M
    fn set(&mut self, index: usize, value: u8) -> error::Result<()> {
195
105M
        let new_len = index + 1;
196
197
105M
        if self.buf.len() < new_len {
198
101M
            if new_len <= self.memlimit {
199
101M
                self.buf.resize(new_len, 0);
200
101M
            } else {
201
38
                return Err(error::Error::LzmaError(format!(
202
38
                    "exceeded memory limit of {}",
203
38
                    self.memlimit
204
38
                )));
205
            }
206
3.71M
        }
207
105M
        self.buf[index] = value;
208
105M
        Ok(())
209
105M
    }
210
}
211
212
impl<W> LzBuffer<W> for LzCircularBuffer<W>
213
where
214
    W: io::Write,
215
{
216
10.8M
    fn len(&self) -> usize {
217
10.8M
        self.len
218
10.8M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::len
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::len
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::len
Line
Count
Source
216
312k
    fn len(&self) -> usize {
217
312k
        self.len
218
312k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::len
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::len
Line
Count
Source
216
10.5M
    fn len(&self) -> usize {
217
10.5M
        self.len
218
10.5M
    }
219
220
    // Retrieve the last byte or return a default
221
3.22M
    fn last_or(&self, lit: u8) -> u8 {
222
3.22M
        if self.len == 0 {
223
48.1k
            lit
224
        } else {
225
3.17M
            self.get((self.dict_size + self.cursor - 1) % self.dict_size)
226
        }
227
3.22M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::last_or
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::last_or
Line
Count
Source
221
79.0k
    fn last_or(&self, lit: u8) -> u8 {
222
79.0k
        if self.len == 0 {
223
7.54k
            lit
224
        } else {
225
71.4k
            self.get((self.dict_size + self.cursor - 1) % self.dict_size)
226
        }
227
79.0k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::last_or
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::last_or
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::last_or
Line
Count
Source
221
3.14M
    fn last_or(&self, lit: u8) -> u8 {
222
3.14M
        if self.len == 0 {
223
40.6k
            lit
224
        } else {
225
3.10M
            self.get((self.dict_size + self.cursor - 1) % self.dict_size)
226
        }
227
3.14M
    }
228
229
    // Retrieve the n-th last byte
230
85.8k
    fn last_n(&self, dist: usize) -> error::Result<u8> {
231
85.8k
        if dist > self.dict_size {
232
0
            return Err(error::Error::LzmaError(format!(
233
0
                "Match distance {} is beyond dictionary size {}",
234
0
                dist, self.dict_size
235
0
            )));
236
85.8k
        }
237
85.8k
        if dist > self.len {
238
0
            return Err(error::Error::LzmaError(format!(
239
0
                "Match distance {} is beyond output size {}",
240
0
                dist, self.len
241
0
            )));
242
85.8k
        }
243
244
85.8k
        let offset = (self.dict_size + self.cursor - dist) % self.dict_size;
245
85.8k
        Ok(self.get(offset))
246
85.8k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::last_n
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::last_n
Line
Count
Source
230
4.54k
    fn last_n(&self, dist: usize) -> error::Result<u8> {
231
4.54k
        if dist > self.dict_size {
232
0
            return Err(error::Error::LzmaError(format!(
233
0
                "Match distance {} is beyond dictionary size {}",
234
0
                dist, self.dict_size
235
0
            )));
236
4.54k
        }
237
4.54k
        if dist > self.len {
238
0
            return Err(error::Error::LzmaError(format!(
239
0
                "Match distance {} is beyond output size {}",
240
0
                dist, self.len
241
0
            )));
242
4.54k
        }
243
244
4.54k
        let offset = (self.dict_size + self.cursor - dist) % self.dict_size;
245
4.54k
        Ok(self.get(offset))
246
4.54k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::last_n
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::last_n
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::last_n
Line
Count
Source
230
81.3k
    fn last_n(&self, dist: usize) -> error::Result<u8> {
231
81.3k
        if dist > self.dict_size {
232
0
            return Err(error::Error::LzmaError(format!(
233
0
                "Match distance {} is beyond dictionary size {}",
234
0
                dist, self.dict_size
235
0
            )));
236
81.3k
        }
237
81.3k
        if dist > self.len {
238
0
            return Err(error::Error::LzmaError(format!(
239
0
                "Match distance {} is beyond output size {}",
240
0
                dist, self.len
241
0
            )));
242
81.3k
        }
243
244
81.3k
        let offset = (self.dict_size + self.cursor - dist) % self.dict_size;
245
81.3k
        Ok(self.get(offset))
246
81.3k
    }
247
248
    // Append a literal
249
114M
    fn append_literal(&mut self, lit: u8) -> error::Result<()> {
250
114M
        self.set(self.cursor, lit)?;
251
114M
        self.cursor += 1;
252
114M
        self.len += 1;
253
254
        // Flush the circular buffer to the output
255
114M
        if self.cursor == self.dict_size {
256
1.48k
            self.stream.write_all(self.buf.as_slice())?;
257
1.03k
            self.cursor = 0;
258
114M
        }
259
260
114M
        Ok(())
261
114M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::append_literal
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::append_literal
Line
Count
Source
249
8.45M
    fn append_literal(&mut self, lit: u8) -> error::Result<()> {
250
8.45M
        self.set(self.cursor, lit)?;
251
8.45M
        self.cursor += 1;
252
8.45M
        self.len += 1;
253
254
        // Flush the circular buffer to the output
255
8.45M
        if self.cursor == self.dict_size {
256
6
            self.stream.write_all(self.buf.as_slice())?;
257
5
            self.cursor = 0;
258
8.45M
        }
259
260
8.45M
        Ok(())
261
8.45M
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::append_literal
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::append_literal
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::append_literal
Line
Count
Source
249
105M
    fn append_literal(&mut self, lit: u8) -> error::Result<()> {
250
105M
        self.set(self.cursor, lit)?;
251
105M
        self.cursor += 1;
252
105M
        self.len += 1;
253
254
        // Flush the circular buffer to the output
255
105M
        if self.cursor == self.dict_size {
256
1.47k
            self.stream.write_all(self.buf.as_slice())?;
257
1.02k
            self.cursor = 0;
258
105M
        }
259
260
105M
        Ok(())
261
105M
    }
262
263
    // Fetch an LZ sequence (length, distance) from inside the buffer
264
522k
    fn append_lz(&mut self, len: usize, dist: usize) -> error::Result<()> {
265
        lzma_debug!("LZ {{ len: {}, dist: {} }}", len, dist);
266
522k
        if dist > self.dict_size {
267
3.81k
            return Err(error::Error::LzmaError(format!(
268
3.81k
                "LZ distance {} is beyond dictionary size {}",
269
3.81k
                dist, self.dict_size
270
3.81k
            )));
271
518k
        }
272
518k
        if dist > self.len {
273
24.0k
            return Err(error::Error::LzmaError(format!(
274
24.0k
                "LZ distance {} is beyond output size {}",
275
24.0k
                dist, self.len
276
24.0k
            )));
277
494k
        }
278
279
494k
        let mut offset = (self.dict_size + self.cursor - dist) % self.dict_size;
280
494k
        for _ in 0..len {
281
110M
            let x = self.get(offset);
282
110M
            self.append_literal(x)?;
283
110M
            offset += 1;
284
110M
            if offset == self.dict_size {
285
1.02k
                offset = 0
286
110M
            }
287
        }
288
494k
        Ok(())
289
522k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::append_lz
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::append_lz
Line
Count
Source
264
39.9k
    fn append_lz(&mut self, len: usize, dist: usize) -> error::Result<()> {
265
        lzma_debug!("LZ {{ len: {}, dist: {} }}", len, dist);
266
39.9k
        if dist > self.dict_size {
267
840
            return Err(error::Error::LzmaError(format!(
268
840
                "LZ distance {} is beyond dictionary size {}",
269
840
                dist, self.dict_size
270
840
            )));
271
39.1k
        }
272
39.1k
        if dist > self.len {
273
2.57k
            return Err(error::Error::LzmaError(format!(
274
2.57k
                "LZ distance {} is beyond output size {}",
275
2.57k
                dist, self.len
276
2.57k
            )));
277
36.5k
        }
278
279
36.5k
        let mut offset = (self.dict_size + self.cursor - dist) % self.dict_size;
280
36.5k
        for _ in 0..len {
281
8.39M
            let x = self.get(offset);
282
8.39M
            self.append_literal(x)?;
283
8.39M
            offset += 1;
284
8.39M
            if offset == self.dict_size {
285
0
                offset = 0
286
8.39M
            }
287
        }
288
36.5k
        Ok(())
289
39.9k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::append_lz
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::append_lz
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::append_lz
Line
Count
Source
264
482k
    fn append_lz(&mut self, len: usize, dist: usize) -> error::Result<()> {
265
        lzma_debug!("LZ {{ len: {}, dist: {} }}", len, dist);
266
482k
        if dist > self.dict_size {
267
2.97k
            return Err(error::Error::LzmaError(format!(
268
2.97k
                "LZ distance {} is beyond dictionary size {}",
269
2.97k
                dist, self.dict_size
270
2.97k
            )));
271
479k
        }
272
479k
        if dist > self.len {
273
21.4k
            return Err(error::Error::LzmaError(format!(
274
21.4k
                "LZ distance {} is beyond output size {}",
275
21.4k
                dist, self.len
276
21.4k
            )));
277
458k
        }
278
279
458k
        let mut offset = (self.dict_size + self.cursor - dist) % self.dict_size;
280
458k
        for _ in 0..len {
281
102M
            let x = self.get(offset);
282
102M
            self.append_literal(x)?;
283
102M
            offset += 1;
284
102M
            if offset == self.dict_size {
285
1.02k
                offset = 0
286
102M
            }
287
        }
288
458k
        Ok(())
289
482k
    }
290
291
    // Get a reference to the output sink
292
0
    fn get_output(&self) -> &W {
293
0
        &self.stream
294
0
    }
295
296
    // Get a mutable reference to the output sink
297
144k
    fn get_output_mut(&mut self) -> &mut W {
298
144k
        &mut self.stream
299
144k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::get_output_mut
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::get_output_mut
Line
Count
Source
297
6.31k
    fn get_output_mut(&mut self) -> &mut W {
298
6.31k
        &mut self.stream
299
6.31k
    }
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::get_output_mut
Line
Count
Source
297
137k
    fn get_output_mut(&mut self) -> &mut W {
298
137k
        &mut self.stream
299
137k
    }
300
301
    // Consumes this buffer and flushes any data
302
1.73k
    fn finish(mut self) -> io::Result<W> {
303
1.73k
        if self.cursor > 0 {
304
558
            self.stream.write_all(&self.buf[0..self.cursor])?;
305
557
            self.stream.flush()?;
306
1.17k
        }
307
1.72k
        Ok(self.stream)
308
1.73k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::finish
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::finish
Line
Count
Source
302
3
    fn finish(mut self) -> io::Result<W> {
303
3
        if self.cursor > 0 {
304
0
            self.stream.write_all(&self.buf[0..self.cursor])?;
305
0
            self.stream.flush()?;
306
3
        }
307
3
        Ok(self.stream)
308
3
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::finish
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::finish
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::finish
Line
Count
Source
302
1.72k
    fn finish(mut self) -> io::Result<W> {
303
1.72k
        if self.cursor > 0 {
304
558
            self.stream.write_all(&self.buf[0..self.cursor])?;
305
557
            self.stream.flush()?;
306
1.16k
        }
307
1.72k
        Ok(self.stream)
308
1.72k
    }
309
310
    // Consumes this buffer without flushing any data
311
19.5k
    fn into_output(self) -> W {
312
19.5k
        self.stream
313
19.5k
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::into_output
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::into_output
Line
Count
Source
311
50
    fn into_output(self) -> W {
312
50
        self.stream
313
50
    }
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<_> as lzma_rs::decode::lzbuffer::LzBuffer<_>>::into_output
Unexecuted instantiation: <lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata::lzma::LzmaOutput> as lzma_rs::decode::lzbuffer::LzBuffer<suricata::lzma::LzmaOutput>>::into_output
<lzma_rs::decode::lzbuffer::LzCircularBuffer<suricata_htp::decompressors::BlockingCursor> as lzma_rs::decode::lzbuffer::LzBuffer<suricata_htp::decompressors::BlockingCursor>>::into_output
Line
Count
Source
311
19.4k
    fn into_output(self) -> W {
312
19.4k
        self.stream
313
19.4k
    }
314
}