chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
keymap: Add support for Eject button on MSI GE60/GE70
[elogind.git]
/
src
/
journal
/
compress.c
diff --git
a/src/journal/compress.c
b/src/journal/compress.c
index 75e70c5ffa8b8d60b0aaca7eb00a0670d0435a85..a4427be75a04fd97e8846bea9f9be7ae2640d624 100644
(file)
--- a/
src/journal/compress.c
+++ b/
src/journal/compress.c
@@
-24,6
+24,7
@@
#include <string.h>
#include <lzma.h>
#include <string.h>
#include <lzma.h>
+#include "macro.h"
#include "compress.h"
bool compress_blob(const void *src, uint64_t src_size, void *dst, uint64_t *dst_size) {
#include "compress.h"
bool compress_blob(const void *src, uint64_t src_size, void *dst, uint64_t *dst_size) {
@@
-66,10
+67,11
@@
fail:
}
bool uncompress_blob(const void *src, uint64_t src_size,
}
bool uncompress_blob(const void *src, uint64_t src_size,
- void **dst, uint64_t *dst_alloc_size, uint64_t* dst_size) {
+ void **dst, uint64_t *dst_alloc_size, uint64_t* dst_size
, uint64_t dst_max
) {
lzma_stream s = LZMA_STREAM_INIT;
lzma_ret ret;
lzma_stream s = LZMA_STREAM_INIT;
lzma_ret ret;
+ uint64_t space;
bool b = false;
assert(src);
bool b = false;
assert(src);
@@
-98,7
+100,8
@@
bool uncompress_blob(const void *src, uint64_t src_size,
s.avail_in = src_size;
s.next_out = *dst;
s.avail_in = src_size;
s.next_out = *dst;
- s.avail_out = *dst_alloc_size;
+ space = dst_max > 0 ? MIN(*dst_alloc_size, dst_max) : *dst_alloc_size;
+ s.avail_out = space;
for (;;) {
void *p;
for (;;) {
void *p;
@@
-111,18
+114,23
@@
bool uncompress_blob(const void *src, uint64_t src_size,
if (ret != LZMA_OK)
goto fail;
if (ret != LZMA_OK)
goto fail;
- p = realloc(*dst, *dst_alloc_size*2);
+ if (dst_max > 0 && (space - s.avail_out) >= dst_max)
+ break;
+
+ p = realloc(*dst, space*2);
if (!p)
goto fail;
s.next_out = (uint8_t*) p + ((uint8_t*) s.next_out - (uint8_t*) *dst);
if (!p)
goto fail;
s.next_out = (uint8_t*) p + ((uint8_t*) s.next_out - (uint8_t*) *dst);
- s.avail_out += *dst_alloc_size;
+ s.avail_out += space;
+
+ space *= 2;
*dst = p;
*dst = p;
- *dst_alloc_size
*= 2
;
+ *dst_alloc_size
= space
;
}
}
- *dst_size =
*dst_alloc_siz
e - s.avail_out;
+ *dst_size =
spac
e - s.avail_out;
b = true;
fail:
b = true;
fail: