mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2026-05-14 09:06:25 +02:00
77 lines
2.7 KiB
Diff
77 lines
2.7 KiB
Diff
From 80297b6e252963d2c08f84f40bc3b5e517505ff4 Mon Sep 17 00:00:00 2001
|
|
From: Natanael Copa <ncopa@alpinelinux.org>
|
|
Date: Tue, 10 Mar 2026 11:54:48 +0100
|
|
Subject: [PATCH] softmagic: compare FILE_GUID values in wire format
|
|
|
|
Comparing GUIDs with memcmp() on native struct storage breaks on
|
|
big-endian systems like s390x, since EFI GUIDs are stored in mixed-endian
|
|
wire format. Convert the parsed magic GUID to on-disk byte order before
|
|
comparing against file contents.
|
|
|
|
Fixes efi-signature-list-sha256 test on s390x.
|
|
---
|
|
src/file.h | 1 +
|
|
src/funcs.c | 20 ++++++++++++++++++++
|
|
src/softmagic.c | 2 +-
|
|
3 files changed, 22 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/file.h b/src/file.h
|
|
index 06cf91d1..6f4087cd 100644
|
|
--- a/src/file.h
|
|
+++ b/src/file.h
|
|
@@ -559,6 +559,7 @@ file_protected int file_checkfmt(char *, size_t, const char *);
|
|
file_protected size_t file_printedlen(const struct magic_set *);
|
|
file_protected int file_print_guid(char *, size_t, const uint64_t *);
|
|
file_protected int file_parse_guid(const char *, uint64_t *);
|
|
+file_protected int file_compare_guid(const uint64_t *, const uint64_t *);
|
|
file_protected int file_replace(struct magic_set *, const char *, const char *);
|
|
file_protected int file_printf(struct magic_set *, const char *, ...)
|
|
__attribute__((__format__(__printf__, 2, 3)));
|
|
diff --git a/src/funcs.c b/src/funcs.c
|
|
index fa62b26d..c3cc0341 100644
|
|
--- a/src/funcs.c
|
|
+++ b/src/funcs.c
|
|
@@ -955,6 +955,26 @@ file_print_guid(char *str, size_t len, const uint64_t *guid)
|
|
#endif
|
|
}
|
|
|
|
+file_protected int
|
|
+file_compare_guid(const uint64_t *mguid, const uint64_t *fguid)
|
|
+{
|
|
+ const struct guid *m = CAST(const struct guid *, CAST(const void *, mguid));
|
|
+ const unsigned char *f = CAST(const unsigned char *, CAST(const void *, fguid));
|
|
+ unsigned char mbuf[16];
|
|
+
|
|
+ mbuf[0] = (unsigned char)(m->data1);
|
|
+ mbuf[1] = (unsigned char)(m->data1 >> 8);
|
|
+ mbuf[2] = (unsigned char)(m->data1 >> 16);
|
|
+ mbuf[3] = (unsigned char)(m->data1 >> 24);
|
|
+ mbuf[4] = (unsigned char)(m->data2);
|
|
+ mbuf[5] = (unsigned char)(m->data2 >> 8);
|
|
+ mbuf[6] = (unsigned char)(m->data3);
|
|
+ mbuf[7] = (unsigned char)(m->data3 >> 8);
|
|
+ memcpy(mbuf + 8, m->data4, 8);
|
|
+
|
|
+ return memcmp(mbuf, f, 16);
|
|
+}
|
|
+
|
|
file_protected int
|
|
file_pipe_closexec(int *fds)
|
|
{
|
|
diff --git a/src/softmagic.c b/src/softmagic.c
|
|
index 1a198005..ee85356d 100644
|
|
--- a/src/softmagic.c
|
|
+++ b/src/softmagic.c
|
|
@@ -2407,7 +2407,7 @@ magiccheck(struct magic_set *ms, struct magic *m, file_regex_t **m_cache)
|
|
return matched;
|
|
case FILE_GUID:
|
|
l = 0;
|
|
- v = memcmp(m->value.guid, p->guid, sizeof(p->guid));
|
|
+ v = file_compare_guid(m->value.guid, p->guid);
|
|
break;
|
|
default:
|
|
file_magerror(ms, "invalid type %d in magiccheck()", m->type);
|
|
--
|
|
2.53.0
|
|
|