aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/delta
diff options
context:
space:
mode:
Diffstat (limited to 'src/liblzma/delta')
-rw-r--r--src/liblzma/delta/delta_decoder.c7
-rw-r--r--src/liblzma/delta/delta_encoder.c12
2 files changed, 16 insertions, 3 deletions
diff --git a/src/liblzma/delta/delta_decoder.c b/src/liblzma/delta/delta_decoder.c
index 13d8a28f..77cf65cc 100644
--- a/src/liblzma/delta/delta_decoder.c
+++ b/src/liblzma/delta/delta_decoder.c
@@ -42,7 +42,12 @@ delta_decode(void *coder_ptr, const lzma_allocator *allocator,
in, in_pos, in_size, out, out_pos, out_size,
action);
- decode_buffer(coder, out + out_start, *out_pos - out_start);
+ // out might be NULL. In that case size == 0. Null pointer + 0 is
+ // undefined behavior so skip the call in that case as it would
+ // do nothing anyway.
+ const size_t size = *out_pos - out_start;
+ if (size > 0)
+ decode_buffer(coder, out + out_start, size);
return ret;
}
diff --git a/src/liblzma/delta/delta_encoder.c b/src/liblzma/delta/delta_encoder.c
index 38416515..056bf746 100644
--- a/src/liblzma/delta/delta_encoder.c
+++ b/src/liblzma/delta/delta_encoder.c
@@ -63,7 +63,12 @@ delta_encode(void *coder_ptr, const lzma_allocator *allocator,
const size_t out_avail = out_size - *out_pos;
const size_t size = my_min(in_avail, out_avail);
- copy_and_encode(coder, in + *in_pos, out + *out_pos, size);
+ // in and out might be NULL. In such cases size == 0.
+ // Null pointer + 0 is undefined behavior so skip
+ // the call in that case as it would do nothing anyway.
+ if (size > 0)
+ copy_and_encode(coder, in + *in_pos, out + *out_pos,
+ size);
*in_pos += size;
*out_pos += size;
@@ -78,7 +83,10 @@ delta_encode(void *coder_ptr, const lzma_allocator *allocator,
in, in_pos, in_size, out, out_pos, out_size,
action);
- encode_in_place(coder, out + out_start, *out_pos - out_start);
+ // Like above, avoid null pointer + 0.
+ const size_t size = *out_pos - out_start;
+ if (size > 0)
+ encode_in_place(coder, out + out_start, size);
}
return ret;