btrbk: add mainProgram (#356350)
[NixPkgs.git] / pkgs / by-name / xa / xar / patches / 0015-Fix-segfault-in-xar_attrcopy_from_heap.patch
blobbfec41f10a731ae95f247204d675114562b24700
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Ivan Trubach <mr.trubach@icloud.com>
3 Date: Sat, 27 Jul 2024 21:04:20 +0300
4 Subject: [PATCH 15/19] Fix segfault in xar_attrcopy_from_heap
6 Fixes a nasty segfault crash when extracting files with extended
7 attributes (and perhaps in other cases).
9 xar_attrcopy_from_heap (in lib/io.c) must not assume that context is
10 convertible to DATA_CONTEXT. Without this change, it calls the callback
11 from the provided context as if it was DATA_CONTEXT, but the context can
12 actually be other types, e.g. LINUXATTR_CONTEXT.
13 ---
14 xar/lib/data.c | 9 ++++++++-
15 xar/lib/io.c | 3 ---
16 2 files changed, 8 insertions(+), 4 deletions(-)
18 diff --git a/xar/lib/data.c b/xar/lib/data.c
19 index dcb5783..cfb3d58 100644
20 --- a/xar/lib/data.c
21 +++ b/xar/lib/data.c
22 @@ -245,6 +245,13 @@ int32_t xar_data_extract(xar_t x, xar_file_t f, const char *file, char *buffer,
23 return retval;
26 +static int xar_data_verify_callback(xar_t x, xar_file_t f, void *inbuf, size_t bsize, void *context) {
27 + DATA_CONTEXT(context)->total += bsize;
28 + if (DATA_CONTEXT(context)->progress)
29 + DATA_CONTEXT(context)->progress(x, f, DATA_CONTEXT(context)->total);
30 + return 0;
33 int32_t xar_data_verify(xar_t x, xar_file_t f, xar_progress_callback p)
35 const char *opt;
36 @@ -269,5 +276,5 @@ int32_t xar_data_verify(xar_t x, xar_file_t f, xar_progress_callback p)
37 if (!tmpp) // It appears that xar can have truely empty files, aka, no data. We should just fail to verify these files.
38 return 0; // After all, the checksum of blank is meaningless. So, failing to do so will cause a crash.
40 - return XAR(x)->attrcopy_from_heap(x, f, tmpp, NULL , (void *)(&context));
41 + return XAR(x)->attrcopy_from_heap(x, f, tmpp, xar_data_verify_callback, (void *)(&context));
43 diff --git a/xar/lib/io.c b/xar/lib/io.c
44 index fb9a72e..64c69af 100644
45 --- a/xar/lib/io.c
46 +++ b/xar/lib/io.c
47 @@ -529,9 +529,6 @@ int32_t xar_attrcopy_from_heap(xar_t x, xar_file_t f, xar_prop_t p, write_callba
49 readsofar += bsize;
51 - if (DATA_CONTEXT(context)->progress)
52 - DATA_CONTEXT(context)->progress(x, f, readsofar);
54 bsize = def_bsize;
57 --
58 2.44.1