Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: dwar...@packages.debian.org, Aurelien Jarno <aure...@debian.org>, 
k...@debian.org, vagr...@debian.org, Domenico Andreoli <ca...@debian.org>, 
car...@debian.org
Control: affects -1 + src:dwarves

Dear release team,

Please unblock package dwarves

[ Reason ]
Back in #1033301, Aurelien reported that the arm64 kernel size did
increase significantly due to issues with BTF deduplication. First
suspected to be a Linux kernel upstream issue, Aurelien discussed this
on with upstream and it was found that the issue is caused by a
src:dwarves regression (applied in 1.24-4).

Details in https://bugs.debian.org/1033301#31

The (not yet uploaded) dwarves upload with attache debdiff
cherry-picks the upstream commit.

(Please provide enough (but not too much) information to help
the release team to judge the request efficiently. E.g. by
filling in the sections below.)

[ Impact ]
Increased arm64 kernel size.

[ Tests ]
Apart from the report from Aurelien[1], package passes its autopkgtest.

 [1]  https://lore.kernel.org/linux-arm-kernel/zezhajup21ln5...@aurel32.net/
[ Risks ]
The upstream commit zero-initializes memory which previous was not
initialized after allocation, and might have contained garbage values
which were used. The fix is isolated as a oneliner.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
Ideally this enters the archive before a next upload for src:linux is
built (and which would be aimed for bookworm).

unblock dwarves/1.24-4.1

Regards,
Salvatore
diff -Nru dwarves-1.24/debian/changelog dwarves-1.24/debian/changelog
--- dwarves-1.24/debian/changelog       2022-12-10 10:11:28.000000000 +0100
+++ dwarves-1.24/debian/changelog       2023-05-02 20:37:16.000000000 +0200
@@ -1,3 +1,13 @@
+dwarves (1.24-4.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * dwarves: Zero-initialize struct cu in cu__new() to prevent incorrect BTF
+    types.
+    Fixes BTF deduplication issues causing arm64 kernel size increase.
+    Thanks to Aurelien Jarno (Closes: #1033301)
+
+ -- Salvatore Bonaccorso <car...@debian.org>  Tue, 02 May 2023 20:37:16 +0200
+
 dwarves (1.24-4) unstable; urgency=medium
 
   * Backport upstream patches to support newer toolchains.
diff -Nru 
dwarves-1.24/debian/patches/03-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch
 
dwarves-1.24/debian/patches/03-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch
--- 
dwarves-1.24/debian/patches/03-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch
   1970-01-01 01:00:00.000000000 +0100
+++ 
dwarves-1.24/debian/patches/03-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch
   2023-05-02 20:37:16.000000000 +0200
@@ -0,0 +1,94 @@
+From: Alan Maguire <alan.magu...@oracle.com>
+Date: Fri, 21 Oct 2022 16:02:03 +0100
+Subject: dwarves: Zero-initialize struct cu in cu__new() to prevent incorrect
+ BTF types
+Origin: 
https://git.kernel.org/pub/scm/devel/pahole/pahole.git/commit?id=b72f5188856df0abf45e1a707856bb4e4e86153c
+Bug-Debian: https://bugs.debian.org/1033301
+
+BTF deduplication was throwing some strange results, where core kernel
+data types were failing to deduplicate due to the return values
+of function type members being void (0) instead of the actual type
+(unsigned int).  An example of this can be seen below, where
+"struct dst_ops" was failing to deduplicate between kernel and
+module:
+
+struct dst_ops {
+        short unsigned int family;
+        unsigned int gc_thresh;
+        int (*gc)(struct dst_ops *);
+        struct dst_entry * (*check)(struct dst_entry *, __u32);
+        unsigned int (*default_advmss)(const struct dst_entry *);
+        unsigned int (*mtu)(const struct dst_entry *);
+...
+
+struct dst_ops___2 {
+        short unsigned int family;
+        unsigned int gc_thresh;
+        int (*gc)(struct dst_ops___2 *);
+        struct dst_entry___2 * (*check)(struct dst_entry___2 *, __u32);
+        void (*default_advmss)(const struct dst_entry___2 *);
+        void (*mtu)(const struct dst_entry___2 *);
+...
+
+This was seen with
+
+bcc648a10cbc ("btf_encoder: Encode DW_TAG_unspecified_type returning routines 
as void")
+
+...which rewrites the return value as 0 (void) when it is marked
+as matching DW_TAG_unspecified_type:
+
+static int32_t btf_encoder__tag_type(struct btf_encoder *encoder, uint32_t 
type_id_off, uint32_t tag_type)
+{
+       if (tag_type == 0)
+               return 0;
+
+       if (encoder->cu->unspecified_type.tag && tag_type == 
encoder->cu->unspecified_type.type) {
+               // No provision for encoding this, turn it into void.
+               return 0;
+       }
+
+       return type_id_off + tag_type;
+}
+
+However the odd thing was that on further examination, the unspecified type
+was not being set, so why was this logic being tripped?  Futher debugging
+showed that the encoder->cu->unspecified_type.tag value was garbage, and
+the type id happened to collide with "unsigned int"; as a result we
+were replacing unsigned ints with void return values, and since this
+was being done to function type members in structs, it triggered a
+type mismatch which failed deduplication between kernel and module.
+
+The fix is simply to calloc() the cu in cu__new() instead.
+
+Committer notes:
+
+We have zalloc(size) as an alias to calloc(1, size), use it instead.
+
+Fixes: bcc648a10cbcd0b9 ("btf_encoder: Encode DW_TAG_unspecified_type 
returning routines as void")
+Signed-off-by: Alan Maguire <alan.magu...@oracle.com>
+Acked-by: Andrii Nakryiko <and...@kernel.org>
+Acked-by: Jiri Olsa <jo...@kernel.org>
+Cc: b...@vger.kernel.org
+Cc: dwar...@vger.kernel.org
+Link: 
https://lore.kernel.org/r/1666364523-9648-1-git-send-email-alan.magu...@oracle.com
+Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
+---
+ dwarves.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/dwarves.c b/dwarves.c
+index fbebc1dda501..95a3bac0e36f 100644
+--- a/dwarves.c
++++ b/dwarves.c
+@@ -626,7 +626,7 @@ struct cu *cu__new(const char *name, uint8_t addr_size,
+                  const unsigned char *build_id, int build_id_len,
+                  const char *filename, bool use_obstack)
+ {
+-      struct cu *cu = malloc(sizeof(*cu) + build_id_len);
++      struct cu *cu = zalloc(sizeof(*cu) + build_id_len);
+ 
+       if (cu != NULL) {
+               uint32_t void_id;
+-- 
+2.40.1
+
diff -Nru dwarves-1.24/debian/patches/series dwarves-1.24/debian/patches/series
--- dwarves-1.24/debian/patches/series  2022-12-10 10:11:28.000000000 +0100
+++ dwarves-1.24/debian/patches/series  2023-05-02 20:37:16.000000000 +0200
@@ -1,3 +1,4 @@
 00-store-the-CU-being-processed-to-avoid-changing-many-functions.patch
 01-record-if-a-CU-has-a-DW_TAG_unspecified_type.patch
 02-encode-DW_TAG_unspecified_type-returning-routines-as-void.patch
+03-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch

Reply via email to