Alexandre Julliard : libwine: Ignore libraries that are of the wrong 32/ 64 class.

Ken Thomases ken at codeweavers.com
Fri Aug 14 05:16:19 CDT 2009


Hi Alexandre,

It seems this would fail to ignore a fat Mach-O library that doesn't  
include the right 32/64 class.  For example, a fat i386/ppc library  
when running 64-bit.

A fat library starts with the struct fat_header defined in /usr/ 
include/mach-o/fat.h, followed by a number of struct fat_arch-es.  Its  
magic is 0xcafebabe in big-endian order.

This would also fail to ignore a PowerPC-only library because the  
magic would be big-endian, but I doubt we care about that.

-Ken

On Aug 11, 2009, at 10:47 AM, Alexandre Julliard wrote:

> Module: wine
> Branch: master
> Commit: 99538272d5b4ffc852f950dd3447a7072d6316ff
> URL:    http://source.winehq.org/git/wine.git/?a=commit;h=99538272d5b4ffc852f950dd3447a7072d6316ff
>
> Author: Alexandre Julliard <julliard at winehq.org>
> Date:   Tue Aug 11 17:29:07 2009 +0200
>
> libwine: Ignore libraries that are of the wrong 32/64 class.
>
> ---
>
> libs/wine/loader.c |   46 +++++++++++++++++++++++++++++++++++++++++++ 
> +--
> 1 files changed, 44 insertions(+), 2 deletions(-)
>
> diff --git a/libs/wine/loader.c b/libs/wine/loader.c
> index d10a6e0..37c603e 100644
> --- a/libs/wine/loader.c
> +++ b/libs/wine/loader.c
> @@ -147,12 +147,54 @@ static void build_dll_path(void)
>     }
> }
>
> +/* check if the library is the correct architecture */
> +/* only returns false for a valid library of the wrong arch */
> +static int check_library_arch( int fd )
> +{
> +#ifdef __APPLE__
> +    struct  /* Mach-O header */
> +    {
> +        unsigned int magic;
> +        unsigned int cputype;
> +    } header;
> +
> +    if (read( fd, &header, sizeof(header) ) != sizeof(header))  
> return 1;
> +    if (header.magic != 0xfeedface) return 1;
> +    if (sizeof(void *) == sizeof(int)) return !(header.cputype >>  
> 24);
> +    else return (header.cputype >> 24) == 1; /* CPU_ARCH_ABI64 */
> +#else
> +    struct  /* ELF header */
> +    {
> +        unsigned char magic[4];
> +        unsigned char class;
> +        unsigned char data;
> +        unsigned char version;
> +    } header;
> +
> +    if (read( fd, &header, sizeof(header) ) != sizeof(header))  
> return 1;
> +    if (memcmp( header.magic, "\177ELF", 4 )) return 1;
> +    if (header.version != 1 /* EV_CURRENT */) return 1;
> +#ifdef WORDS_BIGENDIAN
> +    if (header.data != 2 /* ELFDATA2MSB */) return 1;
> +#else
> +    if (header.data != 1 /* ELFDATA2LSB */) return 1;
> +#endif
> +    if (sizeof(void *) == sizeof(int)) return header.class == 1; /*  
> ELFCLASS32 */
> +    else return header.class == 2; /* ELFCLASS64 */
> +#endif
> +}
> +
> /* check if a given file can be opened */
> static inline int file_exists( const char *name )
> {
> +    int ret = 0;
>     int fd = open( name, O_RDONLY );
> -    if (fd != -1) close( fd );
> -    return (fd != -1);
> +    if (fd != -1)
> +    {
> +        ret = check_library_arch( fd );
> +        close( fd );
> +    }
> +    return ret;
> }
>
> static inline char *prepend( char *buffer, const char *str, size_t  
> len )
>
>
>




More information about the wine-devel mailing list