Skip to content

Commit 0a9bd39

Browse files
committed
REVIEWED: sinfl external library to avoid ASAN complaints #3349
1 parent 8b2103f commit 0a9bd39

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

src/external/sinfl.h

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ extern "C" {
122122

123123
struct sinfl {
124124
const unsigned char *bitptr;
125+
const unsigned char *bitend; // @raysan5: added
125126
unsigned long long bitbuf;
126127
int bitcnt;
127128

@@ -185,9 +186,10 @@ sinfl_read64(const void *p) {
185186
}
186187
static void
187188
sinfl_copy64(unsigned char **dst, unsigned char **src) {
188-
unsigned long long n;
189-
memcpy(&n, *src, 8);
190-
memcpy(*dst, &n, 8);
189+
//unsigned long long n;
190+
//memcpy(&n, *src, 8);
191+
//memcpy(*dst, &n, 8);
192+
memcpy(*dst, *src, 8); // @raysan5
191193
*dst += 8, *src += 8;
192194
}
193195
static unsigned char*
@@ -210,9 +212,22 @@ sinfl_copy128(unsigned char **dst, unsigned char **src) {
210212
#endif
211213
static void
212214
sinfl_refill(struct sinfl *s) {
213-
s->bitbuf |= sinfl_read64(s->bitptr) << s->bitcnt;
214-
s->bitptr += (63 - s->bitcnt) >> 3;
215-
s->bitcnt |= 56; /* bitcount in range [56,63] */
215+
if (s->bitend - s->bitptr >= 8) {
216+
// @raysan5: original code, only those 3 lines
217+
s->bitbuf |= sinfl_read64(s->bitptr) << s->bitcnt;
218+
s->bitptr += (63 - s->bitcnt) >> 3;
219+
s->bitcnt |= 56; /* bitcount in range [56,63] */
220+
} else {
221+
// @raysan5: added this case when bits remaining < 8
222+
int bitswant = 63 - s->bitcnt;
223+
int byteswant = bitswant >> 3;
224+
int bytesuse = s->bitend - s->bitptr <= byteswant ? (int)(s->bitend - s->bitptr) : byteswant;
225+
unsigned long long n = 0;
226+
memcpy(&n, s->bitptr, bytesuse);
227+
s->bitbuf |= n << s->bitcnt;
228+
s->bitptr += bytesuse;
229+
s->bitcnt += bytesuse << 3;
230+
}
216231
}
217232
static int
218233
sinfl_peek(struct sinfl *s, int cnt) {
@@ -384,6 +399,7 @@ sinfl_decompress(unsigned char *out, int cap, const unsigned char *in, int size)
384399
int last = 0;
385400

386401
s.bitptr = in;
402+
s.bitend = e; // @raysan5: added
387403
while (1) {
388404
switch (state) {
389405
case hdr: {

0 commit comments

Comments
 (0)