<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 04/30/2013 01:36 AM, Saul Wold
wrote:<br>
</div>
<blockquote cite="mid:517EAFB2.1080000@linux.intel.com" type="cite">On
04/27/2013 04:05 AM, Hongxu Jia wrote:
<br>
<blockquote type="cite">The previous dict files are NOT byte-order
independent, in fact they are
<br>
probably ARCHITECTURE SPECIFIC.
<br>
Create the dict files in big endian, and convert to host endian
while
<br>
load them. This could fix the endian issue on multiple platform.
<br>
<br>
</blockquote>
Problem with this fix is that is writes files out on first time it
runs, this means it will not work correctly on Read-Only FS, is
there a solution that can be solved on the host build machine.
<br>
<br>
Sau!
<br>
</blockquote>
<br>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-1">
The creation of dict files is still at build time but in big endian
rather than<br>
host endian, and it could work for Read-Only system.<br>
<br>
In meta/recipes-extended/cracklib/cracklib_2.8.22.bb<br>
...<br>
24 do_install_append_class-target() {<br>
25 create-cracklib-dict -o ${D}${datadir}/cracklib/pw_dict
${D}${datadir}/cracklib/cracklib-small<br>
26 }<br>
...<br>
It will invoke the previous function at build time in which
create-cracklib-dict<br>
is cracklib-native's.<br>
<br>
//Hongxu<br>
<br>
<blockquote cite="mid:517EAFB2.1080000@linux.intel.com" type="cite">
<br>
<blockquote type="cite">[Bug #4419]
<br>
<br>
Signed-off-by: Hongxu Jia <a class="moz-txt-link-rfc2396E" href="mailto:hongxu.jia@windriver.com"><hongxu.jia@windriver.com></a>
<br>
---
<br>
...c-support-dictionary-byte-order-dependent.patch | 322
++++++++++++++++++++
<br>
meta/recipes-extended/cracklib/cracklib_2.8.22.bb | 3 +-
<br>
2 files changed, 324 insertions(+), 1 deletion(-)
<br>
create mode 100644
meta/recipes-extended/cracklib/cracklib/0001-packlib.c-support-dictionary-byte-order-dependent.patch<br>
<br>
diff --git
a/meta/recipes-extended/cracklib/cracklib/0001-packlib.c-support-dictionary-byte-order-dependent.patch
b/meta/recipes-extended/cracklib/cracklib/0001-packlib.c-support-dictionary-byte-order-dependent.patch
<br>
new file mode 100644
<br>
index 0000000..fc402ee
<br>
--- /dev/null
<br>
+++
b/meta/recipes-extended/cracklib/cracklib/0001-packlib.c-support-dictionary-byte-order-dependent.patch<br>
@@ -0,0 +1,322 @@
<br>
+From dae29a98c066bc67bb5ba12219d5fd68a8675514 Mon Sep 17
00:00:00 2001
<br>
+From: Hongxu Jia <a class="moz-txt-link-rfc2396E" href="mailto:hongxu.jia@windriver.com"><hongxu.jia@windriver.com></a>
<br>
+Date: Fri, 26 Apr 2013 20:44:10 +0800
<br>
+Subject: [PATCH] packlib.c: support dictionary byte-order
dependent
<br>
+
<br>
+The previous dict files are NOT byte-order independent, in fact
they are
<br>
+probably ARCHITECTURE SPECIFIC.
<br>
+Create the dict files in big endian, and convert to host endian
while
<br>
+load them. This could fix the endian issue on multiple
platform.
<br>
+
<br>
+Signed-off-by: Hongxu Jia <a class="moz-txt-link-rfc2396E" href="mailto:hongxu.jia@windriver.com"><hongxu.jia@windriver.com></a>
<br>
+Upstream-Status: Pending
<br>
+---
<br>
+ lib/packlib.c | 208
+++++++++++++++++++++++++++++++++++++++++++++++++++++++--
<br>
+ 1 file changed, 204 insertions(+), 4 deletions(-)
<br>
+
<br>
+diff --git a/lib/packlib.c b/lib/packlib.c
<br>
+index 8f32d14..323ee83 100644
<br>
+--- a/lib/packlib.c
<br>
++++ b/lib/packlib.c
<br>
+@@ -16,6 +16,9 @@
<br>
+ #ifdef HAVE_STDINT_H
<br>
+ #include <stdint.h>
<br>
+ #endif
<br>
++
<br>
++#define _BSD_SOURCE /* See feature_test_macros(7)
*/
<br>
++#include <endian.h>
<br>
+ #include "packer.h"
<br>
+
<br>
+ static const char vers_id[] = "packlib.c : v2.3p2 Alec Muffett
18 May 1993";
<br>
+@@ -45,6 +48,182 @@ typedef struct
<br>
+ char data_get[NUMWORDS][MAXWORDLEN];
<br>
+ } PWDICT64;
<br>
+
<br>
++enum{
<br>
++ en_is32,
<br>
++ en_is64
<br>
++};
<br>
++
<br>
++static int
<br>
++IheaderHostToBigEndian(char *pHeader, int nBitType)
<br>
++{
<br>
++ if (nBitType == en_is64)
<br>
++ {
<br>
++ struct pi_header64 *pHeader64 = (struct
pi_header64*)pHeader;
<br>
++
<br>
++ pHeader64->pih_magic =
htobe64(pHeader64->pih_magic);
<br>
++ pHeader64->pih_numwords =
htobe64(pHeader64->pih_numwords);
<br>
++ pHeader64->pih_blocklen =
htobe16(pHeader64->pih_blocklen);
<br>
++ pHeader64->pih_pad =
htobe16(pHeader64->pih_pad);
<br>
++
<br>
++#if DEBUG
<br>
++ printf("Header64: magic %x, numwords %x, blocklen %x,
pad %x\n",
<br>
++ pHeader64->pih_magic, pHeader64->pih_numwords,
<br>
++ pHeader64->pih_blocklen, pHeader64->pih_pad);
<br>
++#endif
<br>
++ }
<br>
++ else if (nBitType == en_is32)
<br>
++ {
<br>
++ struct pi_header *pHeader32 = (struct
pi_header*)pHeader;
<br>
++
<br>
++ pHeader32->pih_magic =
htobe32(pHeader32->pih_magic);
<br>
++ pHeader32->pih_numwords =
htobe32(pHeader32->pih_numwords);
<br>
++ pHeader32->pih_blocklen =
htobe16(pHeader32->pih_blocklen);
<br>
++ pHeader32->pih_pad =
htobe16(pHeader32->pih_pad);
<br>
++
<br>
++#if DEBUG
<br>
++ printf("Header32: magic %x, numwords %x, blocklen %x,
pad %x\n",
<br>
++ pHeader32->pih_magic, pHeader32->pih_numwords,
<br>
++ pHeader32->pih_blocklen, pHeader32->pih_pad);
<br>
++#endif
<br>
++ }
<br>
++ else
<br>
++ {
<br>
++ fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
<br>
++ return (-1);
<br>
++ }
<br>
++
<br>
++ return 0;
<br>
++}
<br>
++
<br>
++static int
<br>
++IheaderBigEndianToHost(char *pHeader, int nBitType)
<br>
++{
<br>
++ if (nBitType == en_is64)
<br>
++ {
<br>
++ struct pi_header64 *pHeader64 = (struct
pi_header64*)pHeader;
<br>
++
<br>
++ pHeader64->pih_magic =
be64toh(pHeader64->pih_magic);
<br>
++ pHeader64->pih_numwords =
be64toh(pHeader64->pih_numwords);
<br>
++ pHeader64->pih_blocklen =
be16toh(pHeader64->pih_blocklen);
<br>
++ pHeader64->pih_pad =
be16toh(pHeader64->pih_pad);
<br>
++
<br>
++#if DEBUG
<br>
++ printf("Header64: magic %x, numwords %x, blocklen %x,
pad %x\n",
<br>
++ pHeader64->pih_magic, pHeader64->pih_numwords,
<br>
++ pHeader64->pih_blocklen, pHeader64->pih_pad);
<br>
++#endif
<br>
++ }
<br>
++ else if (nBitType == en_is32)
<br>
++ {
<br>
++ struct pi_header *pHeader32 = (struct
pi_header*)pHeader;
<br>
++
<br>
++ pHeader32->pih_magic =
be32toh(pHeader32->pih_magic);
<br>
++ pHeader32->pih_numwords =
be32toh(pHeader32->pih_numwords);
<br>
++ pHeader32->pih_blocklen =
be16toh(pHeader32->pih_blocklen);
<br>
++ pHeader32->pih_pad =
be16toh(pHeader32->pih_pad);
<br>
++
<br>
++#if DEBUG
<br>
++ printf("Header32: magic %x, numwords %x, blocklen %x,
pad %x\n",
<br>
++ pHeader32->pih_magic,
pHeader32->pih_numwords,
<br>
++ pHeader32->pih_blocklen,
pHeader32->pih_pad);
<br>
++#endif
<br>
++ }
<br>
++ else
<br>
++ {
<br>
++ fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
<br>
++ return (-1);
<br>
++ }
<br>
++
<br>
++ return 0;
<br>
++}
<br>
++
<br>
++static int
<br>
++HwmsHostToBigEndian(char *pHwms, int nLen,int nBitType)
<br>
++{
<br>
++ int i = 0;
<br>
++
<br>
++ if (nBitType == en_is64)
<br>
++ {
<br>
++ uint64_t *pHwms64 = (uint64_t*)pHwms;
<br>
++
<br>
++ for (i = 0; i < nLen / sizeof(uint64_t); i++)
<br>
++ {
<br>
++ *pHwms64++ = htobe64(*pHwms64);
<br>
++ }
<br>
++
<br>
++ }
<br>
++ else if (nBitType == en_is32)
<br>
++ {
<br>
++ uint32_t *pHwms32 = (uint32_t*)pHwms;
<br>
++
<br>
++ for (i = 0; i < nLen / sizeof(uint32_t); i++)
<br>
++ {
<br>
++ *pHwms32++ = htobe32(*pHwms32);
<br>
++ }
<br>
++
<br>
++ }
<br>
++ else
<br>
++ {
<br>
++ fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
<br>
++ return (-1);
<br>
++ }
<br>
++
<br>
++#if DEBUG
<br>
++ for (i = 0; i < nLen; i+=8)
<br>
++ {
<br>
++ printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X
%02X\n",
<br>
++ nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF,
pHwms[i+1]&0xFF,
<br>
++ pHwms[i+2]&0xFF, pHwms[i+3]&0xFF,
pHwms[i+4]&0xFF,
<br>
++ pHwms[i+5]&0xFF, pHwms[i+6]&0xFF,
pHwms[i+7]&0xFF);
<br>
++ }
<br>
++#endif
<br>
++
<br>
++ return 0;
<br>
++}
<br>
++
<br>
++static int
<br>
++HwmsBigEndianToHost(char *pHwms, int nLen, int nBitType)
<br>
++{
<br>
++ int i = 0;
<br>
++
<br>
++ if (nBitType == en_is64)
<br>
++ {
<br>
++ uint64_t *pHwms64 = (uint64_t*)pHwms;
<br>
++
<br>
++ for (i = 0; i < nLen / sizeof(uint64_t); i++)
<br>
++ {
<br>
++ *pHwms64++ = be64toh(*pHwms64);
<br>
++ }
<br>
++
<br>
++ }
<br>
++ else if (nBitType == en_is32)
<br>
++ {
<br>
++ uint32_t *pHwms32 = (uint32_t*)pHwms;
<br>
++
<br>
++ for (i = 0; i < nLen / sizeof(uint32_t); i++)
<br>
++ {
<br>
++ *pHwms32++ = be32toh(*pHwms32);
<br>
++ }
<br>
++
<br>
++ }
<br>
++ else
<br>
++ {
<br>
++ fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
<br>
++ return (-1);
<br>
++ }
<br>
++
<br>
++#if DEBUG
<br>
++ for (i = 0; i < nLen; i+=8)
<br>
++ {
<br>
++ printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X
%02X\n",
<br>
++ nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF,
pHwms[i+1]&0xFF,
<br>
++ pHwms[i+2]&0xFF, pHwms[i+3]&0xFF,
pHwms[i+4]&0xFF,
<br>
++ pHwms[i+5]&0xFF, pHwms[i+6]&0xFF,
pHwms[i+7]&0xFF);
<br>
++ }
<br>
++#endif
<br>
++
<br>
++ return 0;
<br>
++}
<br>
+
<br>
+ static int
<br>
+ _PWIsBroken64(FILE *ifp)
<br>
+@@ -57,6 +236,7 @@ _PWIsBroken64(FILE *ifp)
<br>
+ return 0;
<br>
+ }
<br>
+
<br>
++ IheaderBigEndianToHost((char *) &pdesc64.header,
en_is64);
<br>
+ return (pdesc64.header.pih_magic == PIH_MAGIC);
<br>
+ }
<br>
+
<br>
+@@ -149,7 +329,11 @@ PWOpen(prefix, mode)
<br>
+ pdesc.header.pih_blocklen = NUMWORDS;
<br>
+ pdesc.header.pih_numwords = 0;
<br>
+
<br>
+- fwrite((char *) &pdesc.header, sizeof(pdesc.header),
1, ifp);
<br>
++ struct pi_header tmpheader32;
<br>
++
<br>
++ memcpy(&tmpheader32, &pdesc.header,
sizeof(pdesc.header));
<br>
++ IheaderHostToBigEndian((char *) &tmpheader32,
en_is32);
<br>
++ fwrite((char *) &tmpheader32, sizeof(tmpheader32), 1,
ifp);
<br>
+ } else
<br>
+ {
<br>
+ pdesc.flags &= ~PFOR_WRITE;
<br>
+@@ -173,6 +357,7 @@ PWOpen(prefix, mode)
<br>
+ return ((PWDICT *) 0);
<br>
+ }
<br>
+
<br>
++ IheaderBigEndianToHost((char *) &pdesc.header,
en_is32);
<br>
+ if ((pdesc.header.pih_magic == 0) ||
(pdesc.header.pih_numwords == 0))
<br>
+ {
<br>
+ /* uh-oh. either a broken "64-bit" file or a
garbage file. */
<br>
+@@ -195,6 +380,7 @@ PWOpen(prefix, mode)
<br>
+ }
<br>
+ return ((PWDICT *) 0);
<br>
+ }
<br>
++ IheaderBigEndianToHost((char *)
&pdesc64.header, en_is64);
<br>
+ if (pdesc64.header.pih_magic != PIH_MAGIC)
<br>
+ {
<br>
+ /* nope, not "64-bit" after all */
<br>
+@@ -290,6 +476,7 @@ PWOpen(prefix, mode)
<br>
+ {
<br>
+ pdesc.flags &= ~PFOR_USEHWMS;
<br>
+ }
<br>
++ HwmsBigEndianToHost((char*)pdesc64.hwms,
sizeof(pdesc64.hwms), en_is64);
<br>
+ for (i = 0; i < sizeof(pdesc.hwms) /
sizeof(pdesc.hwms[0]); i++)
<br>
+ {
<br>
+ pdesc.hwms[i] = pdesc64.hwms[i];
<br>
+@@ -299,6 +486,7 @@ PWOpen(prefix, mode)
<br>
+ {
<br>
+ pdesc.flags &= ~PFOR_USEHWMS;
<br>
+ }
<br>
++ HwmsBigEndianToHost((char*)pdesc.hwms,
sizeof(pdesc.hwms), en_is32);
<br>
+ #if DEBUG
<br>
+ for (i=1; i<=0xff; i++)
<br>
+ {
<br>
+@@ -332,7 +520,11 @@ PWClose(pwp)
<br>
+ return (-1);
<br>
+ }
<br>
+
<br>
+- if (!fwrite((char *) &pwp->header,
sizeof(pwp->header), 1, pwp->ifp))
<br>
++ struct pi_header tmpheader32;
<br>
++
<br>
++ memcpy(&tmpheader32, &pwp->header,
sizeof(pwp->header));
<br>
++ IheaderHostToBigEndian((char *) &tmpheader32,
en_is32);
<br>
++ if (!fwrite((char *) &tmpheader32,
sizeof(tmpheader32), 1, pwp->ifp))
<br>
+ {
<br>
+ fprintf(stderr, "index magic fwrite failed\n");
<br>
+ return (-1);
<br>
+@@ -351,7 +543,12 @@ PWClose(pwp)
<br>
+ printf("hwm[%02x] = %d\n", i, pwp->hwms[i]);
<br>
+ #endif
<br>
+ }
<br>
+- fwrite(pwp->hwms, 1, sizeof(pwp->hwms),
pwp->wfp);
<br>
++
<br>
++ PWDICT tmp_pwp;
<br>
++
<br>
++ memcpy(&tmp_pwp, pwp, sizeof(PWDICT));
<br>
++ HwmsHostToBigEndian(tmp_pwp.hwms,
sizeof(tmp_pwp.hwms), en_is32);
<br>
++ fwrite(tmp_pwp.hwms, 1, sizeof(tmp_pwp.hwms),
pwp->wfp);
<br>
+ }
<br>
+ }
<br>
+
<br>
+@@ -405,7 +602,8 @@ PutPW(pwp, string)
<br>
+
<br>
+ datum = (uint32_t) ftell(pwp->dfp);
<br>
+
<br>
+- fwrite((char *) &datum, sizeof(datum), 1,
pwp->ifp);
<br>
++ uint32_t tmpdatum = htobe32(datum);
<br>
++ fwrite((char *) &tmpdatum, sizeof(tmpdatum), 1,
pwp->ifp);
<br>
+
<br>
+ fputs(pwp->data_put[0], pwp->dfp);
<br>
+ putc(0, pwp->dfp);
<br>
+@@ -473,6 +671,7 @@ GetPW(pwp, number)
<br>
+ perror("(index fread failed)");
<br>
+ return ((char *) 0);
<br>
+ }
<br>
++ datum64 = be64toh(datum64);
<br>
+ datum = datum64;
<br>
+ } else {
<br>
+ if (fseek(pwp->ifp, sizeof(struct pi_header) +
(thisblock * sizeof(uint32_t)), 0))
<br>
+@@ -486,6 +685,7 @@ GetPW(pwp, number)
<br>
+ perror("(index fread failed)");
<br>
+ return ((char *) 0);
<br>
+ }
<br>
++ datum = be32toh(datum);
<br>
+ }
<br>
+
<br>
+ int r = 1;
<br>
+--
<br>
+1.7.10.4
<br>
+
<br>
diff --git a/meta/recipes-extended/cracklib/cracklib_2.8.22.bb
b/meta/recipes-extended/cracklib/cracklib_2.8.22.bb
<br>
index 7e398f4..349c74f 100644
<br>
--- a/meta/recipes-extended/cracklib/cracklib_2.8.22.bb
<br>
+++ b/meta/recipes-extended/cracklib/cracklib_2.8.22.bb
<br>
@@ -10,7 +10,8 @@ PR ="r0"
<br>
<br>
EXTRA_OECONF = "--without-python"
<br>
<br>
-SRC_URI =
"${SOURCEFORGE_MIRROR}/cracklib/cracklib-${PV}.tar.gz"
<br>
+SRC_URI = "${SOURCEFORGE_MIRROR}/cracklib/cracklib-${PV}.tar.gz
\
<br>
+
<a class="moz-txt-link-freetext" href="file://0001-packlib.c-support-dictionary-byte-order-dependent.patch">file://0001-packlib.c-support-dictionary-byte-order-dependent.patch</a>"
<br>
<br>
SRC_URI[md5sum] = "463177b5c29c7a598c991e12a4898e06"
<br>
SRC_URI[sha256sum] =
"feaff49bfb513ec10b2618c00d2f7f60776ba93fcc5fa22dd3479dd9cad9f770"
<br>
<br>
</blockquote>
</blockquote>
<br>
</body>
</html>