mirror of
https://git.yoctoproject.org/poky
synced 2026-04-05 08:02:25 +02:00
rpm: fix a endian incompatible error in generating tag
A flaw was found in the way rpm generating arbitrary tags, which leads to a incorrect query result, this issue is introduced by a incompatible endianess when the generating process is executed on different architectures. This patch resolves it by taking the byte order that host uses. (From OE-Core rev: b4b79a78012c64e3a19545972512153b1fe64b4d) Signed-off-by: Ming Liu <ming.liu@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
fix a endian incompatible error in generating rpm tag
|
||||
|
||||
A flaw was found in the way rpm generating arbitrary tags, which leads to a
|
||||
incorrect query result, this issue is introduced by a incompatible endianess
|
||||
when the generating process is executed on different architectures.
|
||||
|
||||
This patch resolves it by taking the byte order that host uses.
|
||||
|
||||
Upstream-Status: Pending
|
||||
|
||||
Signed-off-by: Ming Liu <ming.liu@windriver.com>
|
||||
---
|
||||
tagname.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff -urpN a/rpmdb/tagname.c b/rpmdb/tagname.c
|
||||
--- a/rpmdb/tagname.c
|
||||
+++ b/rpmdb/tagname.c
|
||||
@@ -3,6 +3,19 @@
|
||||
*/
|
||||
|
||||
#include "system.h"
|
||||
+#include <endian.h>
|
||||
+
|
||||
+/* Don't redefine this macro if it already exists */
|
||||
+#ifndef le32toh
|
||||
+#ifdef __USE_BSD
|
||||
+#include <byteswap.h>
|
||||
+#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
+#define le32toh(x) (x)
|
||||
+#else
|
||||
+#define le32toh(x) __bswap_32(x)
|
||||
+#endif
|
||||
+#endif /* __USE_BSD */
|
||||
+#endif /* le32toh */
|
||||
|
||||
#include <rpmio_internal.h> /* XXX DIGEST_CTX, xtolower, xstrcasecmp */
|
||||
#include <rpmmacro.h>
|
||||
@@ -152,7 +165,10 @@ static rpmTag _tagGenerate(const char *s
|
||||
xx = rpmDigestUpdate(ctx, s, nb);
|
||||
xx = rpmDigestFinal(ctx, &digest, &digestlen, 0);
|
||||
if (digest && digestlen > 4) {
|
||||
+ /* The tag is stored in a uniform byte order for cross-endian compatibility.
|
||||
+ Swap to the host uses. */
|
||||
memcpy(&tag, digest + (digestlen - 4), 4);
|
||||
+ tag = le32toh(tag);
|
||||
tag = (rpmTag) (tag & 0x3fffffff);
|
||||
tag = (rpmTag) (tag | 0x40000000);
|
||||
}
|
||||
@@ -89,6 +89,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.9-0.20120508.src.rpm;ex
|
||||
file://debugedit-valid-file-to-fix-segment-fault.patch \
|
||||
file://rpm-platform-file-fix.patch \
|
||||
file://rpm-lsb-compatibility.patch \
|
||||
file://rpm-tag-generate-endian-conversion-fix.patch \
|
||||
"
|
||||
|
||||
# Uncomment the following line to enable platform score debugging
|
||||
|
||||
Reference in New Issue
Block a user