diff options
| -rw-r--r-- | executor/common_zlib.h | 13 | ||||
| -rw-r--r-- | pkg/csource/generated.go | 26 |
2 files changed, 24 insertions, 15 deletions
diff --git a/executor/common_zlib.h b/executor/common_zlib.h index 5f8124318..24382ac0c 100644 --- a/executor/common_zlib.h +++ b/executor/common_zlib.h @@ -98,8 +98,10 @@ static int puff_stored(struct puff_state* s) return 2; // not enough input if (s->outcnt + len > s->outlen) return 1; // not enough output space - while (len--) - s->out[s->outcnt++] = s->in[s->incnt++]; + for (; len--; s->outcnt++, s->incnt++) { + if (s->in[s->incnt]) + s->out[s->outcnt] = s->in[s->incnt]; + } // done with a valid stored block return 0; @@ -243,7 +245,8 @@ static int puff_codes(struct puff_state* s, // write out the literal if (s->outcnt == s->outlen) return 1; - s->out[s->outcnt] = symbol; + if (symbol) + s->out[s->outcnt] = symbol; s->outcnt++; } else if (symbol > 256) { // length // get and compute length @@ -264,8 +267,8 @@ static int puff_codes(struct puff_state* s, if (s->outcnt + len > s->outlen) return 1; while (len--) { - s->out[s->outcnt] = - dist > s->outcnt ? 0 : s->out[s->outcnt - dist]; + if (dist <= s->outcnt && s->out[s->outcnt - dist]) + s->out[s->outcnt] = s->out[s->outcnt - dist]; s->outcnt++; } } diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index 9ee0705c2..61b95e4cf 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -6387,8 +6387,10 @@ static int puff_stored(struct puff_state* s) return 2; if (s->outcnt + len > s->outlen) return 1; - while (len--) - s->out[s->outcnt++] = s->in[s->incnt++]; + for (; len--; s->outcnt++, s->incnt++) { + if (s->in[s->incnt]) + s->out[s->outcnt] = s->in[s->incnt]; + } return 0; } struct puff_huffman { @@ -6483,7 +6485,8 @@ static int puff_codes(struct puff_state* s, if (symbol < 256) { if (s->outcnt == s->outlen) return 1; - s->out[s->outcnt] = symbol; + if (symbol) + s->out[s->outcnt] = symbol; s->outcnt++; } else if (symbol > 256) { symbol -= 257; @@ -6499,8 +6502,8 @@ static int puff_codes(struct puff_state* s, if (s->outcnt + len > s->outlen) return 1; while (len--) { - s->out[s->outcnt] = - dist > s->outcnt ? 0 : s->out[s->outcnt - dist]; + if (dist <= s->outcnt && s->out[s->outcnt - dist]) + s->out[s->outcnt] = s->out[s->outcnt - dist]; s->outcnt++; } } @@ -11528,8 +11531,10 @@ static int puff_stored(struct puff_state* s) return 2; if (s->outcnt + len > s->outlen) return 1; - while (len--) - s->out[s->outcnt++] = s->in[s->incnt++]; + for (; len--; s->outcnt++, s->incnt++) { + if (s->in[s->incnt]) + s->out[s->outcnt] = s->in[s->incnt]; + } return 0; } struct puff_huffman { @@ -11624,7 +11629,8 @@ static int puff_codes(struct puff_state* s, if (symbol < 256) { if (s->outcnt == s->outlen) return 1; - s->out[s->outcnt] = symbol; + if (symbol) + s->out[s->outcnt] = symbol; s->outcnt++; } else if (symbol > 256) { symbol -= 257; @@ -11640,8 +11646,8 @@ static int puff_codes(struct puff_state* s, if (s->outcnt + len > s->outlen) return 1; while (len--) { - s->out[s->outcnt] = - dist > s->outcnt ? 0 : s->out[s->outcnt - dist]; + if (dist <= s->outcnt && s->out[s->outcnt - dist]) + s->out[s->outcnt] = s->out[s->outcnt - dist]; s->outcnt++; } } |
