aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/common/common.c
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2023-03-19 17:03:12 +0000
committerXin LI <delphij@FreeBSD.org>2023-03-19 17:03:12 +0000
commit88417d17c2970465bece68bcd525713706ad291c (patch)
treeaa31ac751238e1bf9cb6774bb8850d6d1b148e82 /src/liblzma/common/common.c
parent2690f2feae431e93f56521baf8c072d32ee1be6a (diff)
downloadsrc-88417d17c2970465bece68bcd525713706ad291c.tar.gz
src-88417d17c2970465bece68bcd525713706ad291c.zip
Vendor import of xz 5.4.2 (trimmed)vendor/xz/5.4.2
Diffstat (limited to 'src/liblzma/common/common.c')
-rw-r--r--src/liblzma/common/common.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/liblzma/common/common.c b/src/liblzma/common/common.c
index a708fdf187a6..baad3dd84c7b 100644
--- a/src/liblzma/common/common.c
+++ b/src/liblzma/common/common.c
@@ -288,13 +288,21 @@ lzma_code(lzma_stream *strm, lzma_action action)
strm->next_in, &in_pos, strm->avail_in,
strm->next_out, &out_pos, strm->avail_out, action);
- strm->next_in += in_pos;
- strm->avail_in -= in_pos;
- strm->total_in += in_pos;
+ // Updating next_in and next_out has to be skipped when they are NULL
+ // to avoid null pointer + 0 (undefined behavior). Do this by checking
+ // in_pos > 0 and out_pos > 0 because this way NULL + non-zero (a bug)
+ // will get caught one way or other.
+ if (in_pos > 0) {
+ strm->next_in += in_pos;
+ strm->avail_in -= in_pos;
+ strm->total_in += in_pos;
+ }
- strm->next_out += out_pos;
- strm->avail_out -= out_pos;
- strm->total_out += out_pos;
+ if (out_pos > 0) {
+ strm->next_out += out_pos;
+ strm->avail_out -= out_pos;
+ strm->total_out += out_pos;
+ }
strm->internal->avail_in = strm->avail_in;