[DebianGIS-dev] Bug#567256: on sparc, mipsel and mips

Francesco P. Lovergine frankie at debian.org
Thu Jan 28 17:16:59 UTC 2010


On Thu, Jan 28, 2010 at 06:07:37PM +0100, Francesco P. Lovergine wrote:
> On Thu, Jan 28, 2010 at 05:48:21PM +0100, Francesco Paolo Lovergine wrote:
> > Package: hdf5
> > Version: 1.8.4-3
> > Severity: normal
> > 
> > H5detect segfaults as follows:
> > 
> >  * Modifications:
> >  *
> >  *      DO NOT MAKE MODIFICATIONS TO THIS FILE!
> >  *      It was generated by code in `H5detect.c'.
> >  *
> >  *-------------------------------------------------------------------------
> >  */
> > 
> > Program received signal SIGBUS, Bus error.
> > 0x00013994 in detect_C89_integers () at ../../../src/H5detect.c:1317
> > 1317        DETECT_I(short,               SHORT,        d_g[nd_g]); nd_g++;
> > 
> 
> This is an already seen error in 1.6 series, cfr:
> http://bugs.gentoo.org/118777
> 

ALIGNMENT macro should install a SIGBUS handler, but it apparently fails (?) in doing that...

#if defined(H5_HAVE_LONGJMP) && defined(H5_HAVE_SIGNAL)
#define ALIGNMENT(TYPE,INFO) {                                                \
    char                *volatile _buf = NULL;                                \
    volatile TYPE       _val = 1;                                                     \
    volatile TYPE       _val2;                                                \
    volatile size_t     _ano = 0;                                             \
    void                (*_handler)(int) = signal(SIGBUS, sigbus_handler);    \
    void                (*_handler2)(int) = signal(SIGSEGV, sigsegv_handler);   \
                                                                              \
    _buf = (char*)malloc(sizeof(TYPE) + align_g[NELMTS(align_g) - 1]);        \
    if(setjmp(jbuf_g)) _ano++;                                                \
    if(_ano < NELMTS(align_g)) {                                              \
        *((TYPE*)(_buf+align_g[_ano])) = _val; /*possible SIGBUS or SEGSEGV*/   \
        _val2 = *((TYPE*)(_buf+align_g[_ano])); /*possible SIGBUS or SEGSEGV*/  \
        /* Cray Check: This section helps detect alignment on Cray's */       \
        /*              vector machines (like the SV1) which mask off */      \
        /*              pointer values when pointing to non-word aligned */   \
        /*              locations with pointers that are supposed to be */    \
        /*              word aligned. -QAK */                                 \
        memset(_buf, 0xff, sizeof(TYPE)+align_g[NELMTS(align_g)-1]);          \
        /*How to handle VAX types?*/                                          \
        if(INFO.perm[0]) /* Big-Endian */                                     \
            memcpy(_buf+align_g[_ano]+(INFO.size-((INFO.offset+INFO.precision)/8)),((char *)&_val)+(INFO.size-((INFO.offset+INFO.precision)/8)),(size_t)(INFO.precision/8)); \
        else /* Little-Endian */                                              \
            memcpy(_buf+align_g[_ano]+(INFO.offset/8),((char *)&_val)+(INFO.offset/8),(size_t)(INFO.precision/8)); \
        _val2 = *((TYPE*)(_buf+align_g[_ano]));                               \
        if(_val!=_val2)                                                       \
            longjmp(jbuf_g, 1);                                               \
        /* End Cray Check */                                                  \
        (INFO.align)=align_g[_ano];                                           \
    } else {                                                                  \
        (INFO.align)=0;                                                       \
        fprintf(stderr, "unable to calculate alignment for %s\n", #TYPE);     \
    }                                                                         \
    free(_buf);                                                               \
    signal(SIGBUS, _handler); /*restore original handler*/                    \
    signal(SIGSEGV, _handler2); /*restore original handler*/                  \
}
#else
#define ALIGNMENT(TYPE,INFO) (INFO.align)=0
#endif


-- 
Francesco P. Lovergine





More information about the Pkg-grass-devel mailing list