[OE-core] [PATCH 1/2] cracklib: fix default dictionary should be generated for target endianness

Hongxu Jia hongxu.jia at windriver.com
Thu May 2 05:40:01 UTC 2013


On 04/30/2013 01:36 AM, Saul Wold wrote:
> On 04/27/2013 04:05 AM, Hongxu Jia wrote:
>> The previous dict files are NOT byte-order independent, in fact they are
>> probably ARCHITECTURE SPECIFIC.
>> Create the dict files in big endian, and convert to host endian while
>> load them. This could fix the endian issue on multiple platform.
>>
> 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.
>
> Sau!

The creation of dict files is still at build time but in big endian 
rather than
host endian, and it could work for Read-Only system.

In meta/recipes-extended/cracklib/cracklib_2.8.22.bb
...
  24 do_install_append_class-target() {
  25     create-cracklib-dict -o ${D}${datadir}/cracklib/pw_dict 
${D}${datadir}/cracklib/cracklib-small
  26 }
...
It will invoke the previous function at build time in which 
create-cracklib-dict
is cracklib-native's.

//Hongxu

>
>> [Bug #4419]
>>
>> Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
>> ---
>>   ...c-support-dictionary-byte-order-dependent.patch |  322 
>> ++++++++++++++++++++
>>   meta/recipes-extended/cracklib/cracklib_2.8.22.bb  |    3 +-
>>   2 files changed, 324 insertions(+), 1 deletion(-)
>>   create mode 100644 
>> meta/recipes-extended/cracklib/cracklib/0001-packlib.c-support-dictionary-byte-order-dependent.patch
>>
>> 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 
>>
>> new file mode 100644
>> index 0000000..fc402ee
>> --- /dev/null
>> +++ 
>> b/meta/recipes-extended/cracklib/cracklib/0001-packlib.c-support-dictionary-byte-order-dependent.patch
>> @@ -0,0 +1,322 @@
>> +From dae29a98c066bc67bb5ba12219d5fd68a8675514 Mon Sep 17 00:00:00 2001
>> +From: Hongxu Jia <hongxu.jia at windriver.com>
>> +Date: Fri, 26 Apr 2013 20:44:10 +0800
>> +Subject: [PATCH] packlib.c: support dictionary byte-order dependent
>> +
>> +The previous dict files are NOT byte-order independent, in fact they 
>> are
>> +probably ARCHITECTURE SPECIFIC.
>> +Create the dict files in big endian, and convert to host endian while
>> +load them. This could fix the endian issue on multiple platform.
>> +
>> +Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
>> +Upstream-Status: Pending
>> +---
>> + lib/packlib.c |  208 
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>> + 1 file changed, 204 insertions(+), 4 deletions(-)
>> +
>> +diff --git a/lib/packlib.c b/lib/packlib.c
>> +index 8f32d14..323ee83 100644
>> +--- a/lib/packlib.c
>> ++++ b/lib/packlib.c
>> +@@ -16,6 +16,9 @@
>> + #ifdef HAVE_STDINT_H
>> + #include <stdint.h>
>> + #endif
>> ++
>> ++#define _BSD_SOURCE             /* See feature_test_macros(7) */
>> ++#include <endian.h>
>> + #include "packer.h"
>> +
>> + static const char vers_id[] = "packlib.c : v2.3p2 Alec Muffett 18 
>> May 1993";
>> +@@ -45,6 +48,182 @@ typedef struct
>> +     char data_get[NUMWORDS][MAXWORDLEN];
>> + } PWDICT64;
>> +
>> ++enum{
>> ++    en_is32,
>> ++    en_is64
>> ++};
>> ++
>> ++static int
>> ++IheaderHostToBigEndian(char *pHeader, int nBitType)
>> ++{
>> ++    if (nBitType == en_is64)
>> ++    {
>> ++        struct pi_header64 *pHeader64 = (struct pi_header64*)pHeader;
>> ++
>> ++        pHeader64->pih_magic = htobe64(pHeader64->pih_magic);
>> ++        pHeader64->pih_numwords = htobe64(pHeader64->pih_numwords);
>> ++        pHeader64->pih_blocklen = htobe16(pHeader64->pih_blocklen);
>> ++        pHeader64->pih_pad = htobe16(pHeader64->pih_pad);
>> ++
>> ++#if DEBUG
>> ++        printf("Header64: magic %x, numwords %x, blocklen %x, pad 
>> %x\n",
>> ++          pHeader64->pih_magic, pHeader64->pih_numwords,
>> ++          pHeader64->pih_blocklen, pHeader64->pih_pad);
>> ++#endif
>> ++    }
>> ++    else if (nBitType == en_is32)
>> ++    {
>> ++        struct pi_header *pHeader32 = (struct pi_header*)pHeader;
>> ++
>> ++        pHeader32->pih_magic = htobe32(pHeader32->pih_magic);
>> ++        pHeader32->pih_numwords = htobe32(pHeader32->pih_numwords);
>> ++        pHeader32->pih_blocklen = htobe16(pHeader32->pih_blocklen);
>> ++        pHeader32->pih_pad = htobe16(pHeader32->pih_pad);
>> ++
>> ++#if DEBUG
>> ++        printf("Header32: magic %x, numwords %x, blocklen %x, pad 
>> %x\n",
>> ++          pHeader32->pih_magic, pHeader32->pih_numwords,
>> ++          pHeader32->pih_blocklen, pHeader32->pih_pad);
>> ++#endif
>> ++    }
>> ++    else
>> ++    {
>> ++        fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
>> ++        return (-1);
>> ++    }
>> ++
>> ++    return 0;
>> ++}
>> ++
>> ++static int
>> ++IheaderBigEndianToHost(char *pHeader, int nBitType)
>> ++{
>> ++    if (nBitType == en_is64)
>> ++    {
>> ++        struct pi_header64 *pHeader64 = (struct pi_header64*)pHeader;
>> ++
>> ++        pHeader64->pih_magic = be64toh(pHeader64->pih_magic);
>> ++        pHeader64->pih_numwords = be64toh(pHeader64->pih_numwords);
>> ++        pHeader64->pih_blocklen = be16toh(pHeader64->pih_blocklen);
>> ++        pHeader64->pih_pad = be16toh(pHeader64->pih_pad);
>> ++
>> ++#if DEBUG
>> ++        printf("Header64: magic %x, numwords %x, blocklen %x, pad 
>> %x\n",
>> ++          pHeader64->pih_magic, pHeader64->pih_numwords,
>> ++          pHeader64->pih_blocklen, pHeader64->pih_pad);
>> ++#endif
>> ++    }
>> ++    else if (nBitType == en_is32)
>> ++    {
>> ++        struct pi_header *pHeader32 = (struct pi_header*)pHeader;
>> ++
>> ++        pHeader32->pih_magic = be32toh(pHeader32->pih_magic);
>> ++        pHeader32->pih_numwords = be32toh(pHeader32->pih_numwords);
>> ++        pHeader32->pih_blocklen = be16toh(pHeader32->pih_blocklen);
>> ++        pHeader32->pih_pad = be16toh(pHeader32->pih_pad);
>> ++
>> ++#if DEBUG
>> ++        printf("Header32: magic %x, numwords %x, blocklen %x, pad 
>> %x\n",
>> ++            pHeader32->pih_magic, pHeader32->pih_numwords,
>> ++            pHeader32->pih_blocklen, pHeader32->pih_pad);
>> ++#endif
>> ++    }
>> ++    else
>> ++    {
>> ++        fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
>> ++        return (-1);
>> ++    }
>> ++
>> ++    return 0;
>> ++}
>> ++
>> ++static int
>> ++HwmsHostToBigEndian(char *pHwms, int nLen,int nBitType)
>> ++{
>> ++    int i = 0;
>> ++
>> ++    if (nBitType == en_is64)
>> ++    {
>> ++        uint64_t *pHwms64 = (uint64_t*)pHwms;
>> ++
>> ++        for (i = 0; i < nLen / sizeof(uint64_t); i++)
>> ++        {
>> ++            *pHwms64++ = htobe64(*pHwms64);
>> ++        }
>> ++
>> ++    }
>> ++    else if (nBitType == en_is32)
>> ++    {
>> ++        uint32_t *pHwms32 = (uint32_t*)pHwms;
>> ++
>> ++        for (i = 0; i < nLen / sizeof(uint32_t); i++)
>> ++        {
>> ++            *pHwms32++ = htobe32(*pHwms32);
>> ++        }
>> ++
>> ++    }
>> ++    else
>> ++    {
>> ++        fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
>> ++        return (-1);
>> ++    }
>> ++
>> ++#if DEBUG
>> ++    for (i = 0; i < nLen; i+=8)
>> ++    {
>> ++        printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X %02X\n",
>> ++            nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF, 
>> pHwms[i+1]&0xFF,
>> ++            pHwms[i+2]&0xFF, pHwms[i+3]&0xFF, pHwms[i+4]&0xFF,
>> ++            pHwms[i+5]&0xFF, pHwms[i+6]&0xFF, pHwms[i+7]&0xFF);
>> ++    }
>> ++#endif
>> ++
>> ++    return 0;
>> ++}
>> ++
>> ++static int
>> ++HwmsBigEndianToHost(char *pHwms, int nLen, int nBitType)
>> ++{
>> ++    int i = 0;
>> ++
>> ++    if (nBitType == en_is64)
>> ++    {
>> ++        uint64_t *pHwms64 = (uint64_t*)pHwms;
>> ++
>> ++        for (i = 0; i < nLen / sizeof(uint64_t); i++)
>> ++        {
>> ++            *pHwms64++ = be64toh(*pHwms64);
>> ++        }
>> ++
>> ++    }
>> ++    else if (nBitType == en_is32)
>> ++    {
>> ++        uint32_t *pHwms32 = (uint32_t*)pHwms;
>> ++
>> ++        for (i = 0; i < nLen / sizeof(uint32_t); i++)
>> ++        {
>> ++            *pHwms32++ = be32toh(*pHwms32);
>> ++        }
>> ++
>> ++    }
>> ++    else
>> ++    {
>> ++        fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
>> ++        return (-1);
>> ++    }
>> ++
>> ++#if DEBUG
>> ++    for (i = 0; i < nLen; i+=8)
>> ++    {
>> ++        printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X %02X\n",
>> ++            nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF, 
>> pHwms[i+1]&0xFF,
>> ++            pHwms[i+2]&0xFF, pHwms[i+3]&0xFF, pHwms[i+4]&0xFF,
>> ++            pHwms[i+5]&0xFF, pHwms[i+6]&0xFF, pHwms[i+7]&0xFF);
>> ++    }
>> ++#endif
>> ++
>> ++    return 0;
>> ++}
>> +
>> + static int
>> + _PWIsBroken64(FILE *ifp)
>> +@@ -57,6 +236,7 @@ _PWIsBroken64(FILE *ifp)
>> +        return 0;
>> +     }
>> +
>> ++    IheaderBigEndianToHost((char *) &pdesc64.header, en_is64);
>> +     return (pdesc64.header.pih_magic == PIH_MAGIC);
>> + }
>> +
>> +@@ -149,7 +329,11 @@ PWOpen(prefix, mode)
>> +     pdesc.header.pih_blocklen = NUMWORDS;
>> +     pdesc.header.pih_numwords = 0;
>> +
>> +-    fwrite((char *) &pdesc.header, sizeof(pdesc.header), 1, ifp);
>> ++    struct pi_header tmpheader32;
>> ++
>> ++    memcpy(&tmpheader32,  &pdesc.header, sizeof(pdesc.header));
>> ++    IheaderHostToBigEndian((char *) &tmpheader32, en_is32);
>> ++    fwrite((char *) &tmpheader32, sizeof(tmpheader32), 1, ifp);
>> +     } else
>> +     {
>> +     pdesc.flags &= ~PFOR_WRITE;
>> +@@ -173,6 +357,7 @@ PWOpen(prefix, mode)
>> +         return ((PWDICT *) 0);
>> +     }
>> +
>> ++        IheaderBigEndianToHost((char *) &pdesc.header, en_is32);
>> +         if ((pdesc.header.pih_magic == 0) || 
>> (pdesc.header.pih_numwords == 0))
>> +         {
>> +             /* uh-oh. either a broken "64-bit" file or a garbage 
>> file. */
>> +@@ -195,6 +380,7 @@ PWOpen(prefix, mode)
>> +         }
>> +                 return ((PWDICT *) 0);
>> +             }
>> ++            IheaderBigEndianToHost((char *) &pdesc64.header, en_is64);
>> +             if (pdesc64.header.pih_magic != PIH_MAGIC)
>> +             {
>> +                 /* nope, not "64-bit" after all */
>> +@@ -290,6 +476,7 @@ PWOpen(prefix, mode)
>> +                 {
>> +                     pdesc.flags &= ~PFOR_USEHWMS;
>> +                 }
>> ++                HwmsBigEndianToHost((char*)pdesc64.hwms, 
>> sizeof(pdesc64.hwms), en_is64);
>> +                 for (i = 0; i < sizeof(pdesc.hwms) / 
>> sizeof(pdesc.hwms[0]); i++)
>> +                 {
>> +                     pdesc.hwms[i] = pdesc64.hwms[i];
>> +@@ -299,6 +486,7 @@ PWOpen(prefix, mode)
>> +         {
>> +         pdesc.flags &= ~PFOR_USEHWMS;
>> +         }
>> ++        HwmsBigEndianToHost((char*)pdesc.hwms, sizeof(pdesc.hwms), 
>> en_is32);
>> + #if DEBUG
>> +             for (i=1; i<=0xff; i++)
>> +             {
>> +@@ -332,7 +520,11 @@ PWClose(pwp)
>> +         return (-1);
>> +     }
>> +
>> +-    if (!fwrite((char *) &pwp->header, sizeof(pwp->header), 1, 
>> pwp->ifp))
>> ++    struct pi_header tmpheader32;
>> ++
>> ++    memcpy(&tmpheader32,  &pwp->header, sizeof(pwp->header));
>> ++    IheaderHostToBigEndian((char *) &tmpheader32, en_is32);
>> ++    if (!fwrite((char *) &tmpheader32, sizeof(tmpheader32), 1, 
>> pwp->ifp))
>> +     {
>> +         fprintf(stderr, "index magic fwrite failed\n");
>> +         return (-1);
>> +@@ -351,7 +543,12 @@ PWClose(pwp)
>> +             printf("hwm[%02x] = %d\n", i, pwp->hwms[i]);
>> + #endif
>> +         }
>> +-        fwrite(pwp->hwms, 1, sizeof(pwp->hwms), pwp->wfp);
>> ++
>> ++        PWDICT tmp_pwp;
>> ++
>> ++        memcpy(&tmp_pwp, pwp, sizeof(PWDICT));
>> ++        HwmsHostToBigEndian(tmp_pwp.hwms, sizeof(tmp_pwp.hwms), 
>> en_is32);
>> ++        fwrite(tmp_pwp.hwms, 1, sizeof(tmp_pwp.hwms), pwp->wfp);
>> +     }
>> +     }
>> +
>> +@@ -405,7 +602,8 @@ PutPW(pwp, string)
>> +
>> +     datum = (uint32_t) ftell(pwp->dfp);
>> +
>> +-    fwrite((char *) &datum, sizeof(datum), 1, pwp->ifp);
>> ++    uint32_t tmpdatum = htobe32(datum);
>> ++    fwrite((char *) &tmpdatum, sizeof(tmpdatum), 1, pwp->ifp);
>> +
>> +     fputs(pwp->data_put[0], pwp->dfp);
>> +     putc(0, pwp->dfp);
>> +@@ -473,6 +671,7 @@ GetPW(pwp, number)
>> +            perror("(index fread failed)");
>> +            return ((char *) 0);
>> +        }
>> ++       datum64 =  be64toh(datum64);
>> +        datum = datum64;
>> +     } else {
>> +        if (fseek(pwp->ifp, sizeof(struct pi_header) + (thisblock * 
>> sizeof(uint32_t)), 0))
>> +@@ -486,6 +685,7 @@ GetPW(pwp, number)
>> +            perror("(index fread failed)");
>> +            return ((char *) 0);
>> +        }
>> ++       datum = be32toh(datum);
>> +     }
>> +
>> +     int r = 1;
>> +--
>> +1.7.10.4
>> +
>> diff --git a/meta/recipes-extended/cracklib/cracklib_2.8.22.bb 
>> b/meta/recipes-extended/cracklib/cracklib_2.8.22.bb
>> index 7e398f4..349c74f 100644
>> --- a/meta/recipes-extended/cracklib/cracklib_2.8.22.bb
>> +++ b/meta/recipes-extended/cracklib/cracklib_2.8.22.bb
>> @@ -10,7 +10,8 @@ PR ="r0"
>>
>>   EXTRA_OECONF = "--without-python"
>>
>> -SRC_URI = "${SOURCEFORGE_MIRROR}/cracklib/cracklib-${PV}.tar.gz"
>> +SRC_URI = "${SOURCEFORGE_MIRROR}/cracklib/cracklib-${PV}.tar.gz \
>> + file://0001-packlib.c-support-dictionary-byte-order-dependent.patch"
>>
>>   SRC_URI[md5sum] = "463177b5c29c7a598c991e12a4898e06"
>>   SRC_URI[sha256sum] = 
>> "feaff49bfb513ec10b2618c00d2f7f60776ba93fcc5fa22dd3479dd9cad9f770"
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20130502/b377872a/attachment-0002.html>


More information about the Openembedded-core mailing list