intel / intel/isa-l

isal_inflate with crc_flag==ISAL_DEFLATE eats extra bytes.

Open
#211 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
1.1k
Forks
346
PR merge metrics
No merged PRs in 30d

Description

isal_inflate with crc_flag==ISAL_DEFLATE eats extra bytes when there are extra bytes at tail.
It always want to pick 64 bit at once, so if we provide extra bytes to it, it will eat it.

The demo code provides 8 extra bytes in isal_inflate, it eats 6.

```
#define IN_DATA_SIZE ((ssize_t)(128))
int main()
{
uint8_t indata[IN_DATA_SIZE];
uint8_t out1[IN_DATA_SIZE*2];
ssize_t out1_len;
uint8_t out2[IN_DATA_SIZE];
ssize_t out2_len;
srand(0);
for (int i = 0; i < IN_DATA_SIZE; ++i) {
indata[i] = rand()%64;
}

int level = -1;
int nowrap = 1;
fprintf(stderr, "level=%d nowrap=%d\n", level, nowrap);
{
z_stream *strm = calloc(1, sizeof(z_stream));
deflateInit2(strm, level, Z_DEFLATED, nowrap ? -MAX_WBITS : MAX_WBITS, 8, Z_DEFAULT_STRATEGY);

strm->avail_in = 0;

strm->next_in = indata;
strm->avail_in = IN_DATA_SIZE;
strm->next_out = out1;
strm->avail_out = sizeof(out1);
int r = deflate(strm, Z_FINISH);

assert(r == Z_STREAM_END);
out1_len = sizeof(out1) - strm->avail_out;
fprintf(stderr, "%zd -> %zd r=%d\n", IN_DATA_SIZE, out1_len, r);
}
{
struct inflate_state *strm = calloc(1, sizeof(struct inflate_state));
isal_inflate_init(strm);
strm->crc_flag = nowrap ? ISAL_DEFLATE : ISAL_ZLIB;
strm->next_in = out1;
strm->avail_in = out1_len+8;
strm->next_out = out2;
strm->avail_out = sizeof(out2);
fprintf(stderr, "pre isal_inflate avail_in=%d\n", strm->avail_in);
int r = isal_inflate(strm);
fprintf(stderr, "post isal_inflate avail_in=%d\n", strm->avail_in);
out2_len = sizeof(out2) - strm->avail_out;
fprintf(stderr, "%zd -> %zd r=%d\n", out1_len, out2_len, r);
fprintf(stderr, "avail_in=%zd avail_out=%zd\n", strm->avail_in, strm->avail_out);
assert(r == ISAL_DECOMP_OK);
assert(strm->block_state == ISAL_BLOCK_FINISH);
assert(IN_DATA_SIZE == out2_len);
assert(strm->avail_in == 8);
}
}
```

```
%] ./mytest

level=-1 nowrap=1
128 -> 122 r=1
pre isal_inflate avail_in=130
post isal_inflate avail_in=2
122 -> 128 r=0
avail_in=2 avail_out=0
Assertion failed: (strm->avail_in == 8), function test2, file mytest.c, line 194.
zsh: abort programs/mytest

```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.