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 --- tagname.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) Index: rpm-5.4.14/rpmdb/tagname.c =================================================================== --- rpm-5.4.14.orig/rpmdb/tagname.c +++ rpm-5.4.14/rpmdb/tagname.c @@ -3,6 +3,19 @@ */ #include "system.h" +#include + +/* Don't redefine this macro if it already exists */ +#ifndef le32toh +#ifdef __USE_BSD +#include +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define le32toh(x) (x) +#else +#define le32toh(x) __bswap_32(x) +#endif +#endif /* __USE_BSD */ +#endif /* le32toh */ #include /* XXX DIGEST_CTX, xtolower, xstrcasecmp */ #include @@ -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); }