[prev in list] [next in list] [prev in thread] [next in thread] 

List:       debian-hurd
Subject:    Srange build failure in libbsd
From:       Guillem Jover <guillem () debian ! org>
Date:       2022-08-24 10:42:28
Message-ID: YwYAlKpber4DvXNH () thunder ! hadrons ! org
[Download RAW message or body]

Hi!

I recently added unit tests upstream for explicit_bzero() to libbsd,
and when uploading that into Debian, it strangely failed only on the
Hurd.

  https://buildd.debian.org/status/package.php?p=libbsd

I've been trying to check what's happening on and off, with the
temptation to simply disable the failing test on the Hurd, but not
doing so due to the suspicion that there's something insidiously
broken here, but I cannot see anything wrong in the unit tests itself.

With the attached patch it works. Removing the second print_hex() call
it stops working again. I've made the diff so that disassembled output
is minimal. And I cannot see anything obviously missing from the
disassembled output that would explain the misbehavior, or I'm failing
to see the obvious. :/

I'm also attaching the  «objdump -d » output for the broken and working
unit tests. Which I compared with:

  $ wdiff dis.broken dis.working | colordiff | less

Thanks,
Guillem

["explicit_bzero-debug.patch" (text/x-diff)]

diff --git i/test/explicit_bzero.c w/test/explicit_bzero.c
index 74993c2..686d417 100644
--- i/test/explicit_bzero.c
+++ w/test/explicit_bzero.c
@@ -44,6 +44,19 @@ enum {
 static char *altstack;
 #define ALTSTACK_SIZE (SIGSTKSZ + SECRETBYTES)
 
+static void __attribute__((__noinline__))
+print_hex(char *buf, size_t size)
+{
+      size_t i = 0;
+
+      while (i < size) {
+              for (size_t j = 0; j < 16 && i < size; j++, i++)
+                      printf(" %02x", (unsigned char)buf[i]);
+              printf("\n");
+      }
+      fflush(stdout);
+}
+
 static void
 setup_stack(void)
 {
@@ -154,7 +167,9 @@ test_with_bzero(void)
 	char buf[SECRETBYTES];
 	char *res;
 	assert_on_stack();
+	print_hex(altstack, ALTSTACK_SIZE);
 	populate_secret(buf, sizeof(buf));
+	print_hex(altstack, ALTSTACK_SIZE);
 	res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
 	ASSERT_NE(NULL, res);
 	explicit_bzero(buf, sizeof(buf));

["dis.broken.gz" (application/gzip)]
["dis.working.gz" (application/gzip)]

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic