1 From dae29a98c066bc67bb5ba12219d5fd68a8675514 Mon Sep 17 00:00:00 2001
2 From: Hongxu Jia <hongxu.jia@windriver.com>
3 Date: Fri, 26 Apr 2013 20:44:10 +0800
4 Subject: [PATCH] packlib.c: support dictionary byte-order dependent
6 The previous dict files are NOT byte-order independent, in fact they are
7 probably ARCHITECTURE SPECIFIC.
8 Create the dict files in big endian, and convert to host endian while
9 load them. This could fix the endian issue on multiple platform.
11 Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
12 Upstream-Status: Pending
14 We can't use the endian.h, htobe* and be*toh functions because they are
15 not available on older versions of glibc, such as that found in RHEL
18 Change to checking endian and directly calling bswap_* as defined in
21 Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
24 lib/packlib.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
25 1 file changed, 204 insertions(+), 4 deletions(-)
27 Index: cracklib-2.8.22/lib/packlib.c
28 ===================================================================
29 --- cracklib-2.8.22.orig/lib/packlib.c
30 +++ cracklib-2.8.22/lib/packlib.c
37 +#define _BSD_SOURCE /* See feature_test_macros(7) */
40 +#include <byteswap.h>
43 static const char vers_id[] = "packlib.c : v2.3p2 Alec Muffett 18 May 1993";
44 @@ -45,6 +51,182 @@ typedef struct
45 char data_get[NUMWORDS][MAXWORDLEN];
54 +IheaderHostToBigEndian(char *pHeader, int nBitType)
56 + if (nBitType == en_is64 && __BYTE_ORDER == __LITTLE_ENDIAN)
58 + struct pi_header64 *pHeader64 = (struct pi_header64*)pHeader;
60 + pHeader64->pih_magic = bswap_64(pHeader64->pih_magic);
61 + pHeader64->pih_numwords = bswap_64(pHeader64->pih_numwords);
62 + pHeader64->pih_blocklen = bswap_16(pHeader64->pih_blocklen);
63 + pHeader64->pih_pad = bswap_16(pHeader64->pih_pad);
66 + printf("Header64: magic %x, numwords %x, blocklen %x, pad %x\n",
67 + pHeader64->pih_magic, pHeader64->pih_numwords,
68 + pHeader64->pih_blocklen, pHeader64->pih_pad);
71 + else if (nBitType == en_is32 && __BYTE_ORDER == __LITTLE_ENDIAN)
73 + struct pi_header *pHeader32 = (struct pi_header*)pHeader;
75 + pHeader32->pih_magic = bswap_32(pHeader32->pih_magic);
76 + pHeader32->pih_numwords = bswap_32(pHeader32->pih_numwords);
77 + pHeader32->pih_blocklen = bswap_16(pHeader32->pih_blocklen);
78 + pHeader32->pih_pad = bswap_16(pHeader32->pih_pad);
81 + printf("Header32: magic %x, numwords %x, blocklen %x, pad %x\n",
82 + pHeader32->pih_magic, pHeader32->pih_numwords,
83 + pHeader32->pih_blocklen, pHeader32->pih_pad);
86 + else if (__BYTE_ORDER == __LITTLE_ENDIAN)
88 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
96 +IheaderBigEndianToHost(char *pHeader, int nBitType)
98 + if (nBitType == en_is64 && __BYTE_ORDER == __LITTLE_ENDIAN)
100 + struct pi_header64 *pHeader64 = (struct pi_header64*)pHeader;
102 + pHeader64->pih_magic = bswap_64(pHeader64->pih_magic);
103 + pHeader64->pih_numwords = bswap_64(pHeader64->pih_numwords);
104 + pHeader64->pih_blocklen = bswap_16(pHeader64->pih_blocklen);
105 + pHeader64->pih_pad = bswap_16(pHeader64->pih_pad);
108 + printf("Header64: magic %x, numwords %x, blocklen %x, pad %x\n",
109 + pHeader64->pih_magic, pHeader64->pih_numwords,
110 + pHeader64->pih_blocklen, pHeader64->pih_pad);
113 + else if (nBitType == en_is32 && __BYTE_ORDER == __LITTLE_ENDIAN)
115 + struct pi_header *pHeader32 = (struct pi_header*)pHeader;
117 + pHeader32->pih_magic = bswap_32(pHeader32->pih_magic);
118 + pHeader32->pih_numwords = bswap_32(pHeader32->pih_numwords);
119 + pHeader32->pih_blocklen = bswap_16(pHeader32->pih_blocklen);
120 + pHeader32->pih_pad = bswap_16(pHeader32->pih_pad);
123 + printf("Header32: magic %x, numwords %x, blocklen %x, pad %x\n",
124 + pHeader32->pih_magic, pHeader32->pih_numwords,
125 + pHeader32->pih_blocklen, pHeader32->pih_pad);
128 + else if (__BYTE_ORDER == __LITTLE_ENDIAN)
130 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
138 +HwmsHostToBigEndian(char *pHwms, int nLen,int nBitType)
142 + if (nBitType == en_is64 && __BYTE_ORDER == __LITTLE_ENDIAN)
144 + uint64_t *pHwms64 = (uint64_t*)pHwms;
146 + for (i = 0; i < nLen / sizeof(uint64_t); i++)
148 + *pHwms64++ = bswap_64(*pHwms64);
152 + else if (nBitType == en_is32 && __BYTE_ORDER == __LITTLE_ENDIAN)
154 + uint32_t *pHwms32 = (uint32_t*)pHwms;
156 + for (i = 0; i < nLen / sizeof(uint32_t); i++)
158 + *pHwms32++ = bswap_32(*pHwms32);
162 + else if (__BYTE_ORDER == __LITTLE_ENDIAN)
164 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
169 + for (i = 0; i < nLen; i+=8)
171 + printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X %02X\n",
172 + nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF, pHwms[i+1]&0xFF,
173 + pHwms[i+2]&0xFF, pHwms[i+3]&0xFF, pHwms[i+4]&0xFF,
174 + pHwms[i+5]&0xFF, pHwms[i+6]&0xFF, pHwms[i+7]&0xFF);
182 +HwmsBigEndianToHost(char *pHwms, int nLen, int nBitType)
186 + if (nBitType == en_is64 && __BYTE_ORDER == __LITTLE_ENDIAN)
188 + uint64_t *pHwms64 = (uint64_t*)pHwms;
190 + for (i = 0; i < nLen / sizeof(uint64_t); i++)
192 + *pHwms64++ = bswap_64(*pHwms64);
196 + else if (nBitType == en_is32 && __BYTE_ORDER == __LITTLE_ENDIAN)
198 + uint32_t *pHwms32 = (uint32_t*)pHwms;
200 + for (i = 0; i < nLen / sizeof(uint32_t); i++)
202 + *pHwms32++ = bswap_32(*pHwms32);
206 + else if (__BYTE_ORDER == __LITTLE_ENDIAN)
208 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
213 + for (i = 0; i < nLen; i+=8)
215 + printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X %02X\n",
216 + nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF, pHwms[i+1]&0xFF,
217 + pHwms[i+2]&0xFF, pHwms[i+3]&0xFF, pHwms[i+4]&0xFF,
218 + pHwms[i+5]&0xFF, pHwms[i+6]&0xFF, pHwms[i+7]&0xFF);
226 _PWIsBroken64(FILE *ifp)
227 @@ -57,6 +239,7 @@ _PWIsBroken64(FILE *ifp)
231 + IheaderBigEndianToHost((char *) &pdesc64.header, en_is64);
232 return (pdesc64.header.pih_magic == PIH_MAGIC);
235 @@ -149,7 +332,11 @@ PWOpen(prefix, mode)
236 pdesc.header.pih_blocklen = NUMWORDS;
237 pdesc.header.pih_numwords = 0;
239 - fwrite((char *) &pdesc.header, sizeof(pdesc.header), 1, ifp);
240 + struct pi_header tmpheader32;
242 + memcpy(&tmpheader32, &pdesc.header, sizeof(pdesc.header));
243 + IheaderHostToBigEndian((char *) &tmpheader32, en_is32);
244 + fwrite((char *) &tmpheader32, sizeof(tmpheader32), 1, ifp);
247 pdesc.flags &= ~PFOR_WRITE;
248 @@ -173,6 +360,7 @@ PWOpen(prefix, mode)
249 return ((PWDICT *) 0);
252 + IheaderBigEndianToHost((char *) &pdesc.header, en_is32);
253 if ((pdesc.header.pih_magic == 0) || (pdesc.header.pih_numwords == 0))
255 /* uh-oh. either a broken "64-bit" file or a garbage file. */
256 @@ -195,6 +383,7 @@ PWOpen(prefix, mode)
258 return ((PWDICT *) 0);
260 + IheaderBigEndianToHost((char *) &pdesc64.header, en_is64);
261 if (pdesc64.header.pih_magic != PIH_MAGIC)
263 /* nope, not "64-bit" after all */
264 @@ -290,6 +479,7 @@ PWOpen(prefix, mode)
266 pdesc.flags &= ~PFOR_USEHWMS;
268 + HwmsBigEndianToHost((char*)pdesc64.hwms, sizeof(pdesc64.hwms), en_is64);
269 for (i = 0; i < sizeof(pdesc.hwms) / sizeof(pdesc.hwms[0]); i++)
271 pdesc.hwms[i] = pdesc64.hwms[i];
272 @@ -299,6 +489,7 @@ PWOpen(prefix, mode)
274 pdesc.flags &= ~PFOR_USEHWMS;
276 + HwmsBigEndianToHost((char*)pdesc.hwms, sizeof(pdesc.hwms), en_is32);
278 for (i=1; i<=0xff; i++)
280 @@ -332,7 +523,11 @@ PWClose(pwp)
284 - if (!fwrite((char *) &pwp->header, sizeof(pwp->header), 1, pwp->ifp))
285 + struct pi_header tmpheader32;
287 + memcpy(&tmpheader32, &pwp->header, sizeof(pwp->header));
288 + IheaderHostToBigEndian((char *) &tmpheader32, en_is32);
289 + if (!fwrite((char *) &tmpheader32, sizeof(tmpheader32), 1, pwp->ifp))
291 fprintf(stderr, "index magic fwrite failed\n");
293 @@ -351,7 +546,12 @@ PWClose(pwp)
294 printf("hwm[%02x] = %d\n", i, pwp->hwms[i]);
297 - fwrite(pwp->hwms, 1, sizeof(pwp->hwms), pwp->wfp);
301 + memcpy(&tmp_pwp, pwp, sizeof(PWDICT));
302 + HwmsHostToBigEndian(tmp_pwp.hwms, sizeof(tmp_pwp.hwms), en_is32);
303 + fwrite(tmp_pwp.hwms, 1, sizeof(tmp_pwp.hwms), pwp->wfp);
307 @@ -405,7 +605,8 @@ PutPW(pwp, string)
309 datum = (uint32_t) ftell(pwp->dfp);
311 - fwrite((char *) &datum, sizeof(datum), 1, pwp->ifp);
312 + uint32_t tmpdatum = (__BYTE_ORDER == __LITTLE_ENDIAN) ? bswap_32(datum) : datum;
313 + fwrite((char *) &tmpdatum, sizeof(tmpdatum), 1, pwp->ifp);
315 fputs(pwp->data_put[0], pwp->dfp);
317 @@ -473,6 +674,7 @@ GetPW(pwp, number)
318 perror("(index fread failed)");
321 + datum64 = (__BYTE_ORDER == __LITTLE_ENDIAN) ? bswap_64(datum64) : datum64;
324 if (fseek(pwp->ifp, sizeof(struct pi_header) + (thisblock * sizeof(uint32_t)), 0))
325 @@ -486,6 +688,7 @@ GetPW(pwp, number)
326 perror("(index fread failed)");
329 + datum = (__BYTE_ORDER == __LITTLE_ENDIAN) ? bswap_32(datum) : datum;