Index: src/apprentice.c --- src/apprentice.c.orig 2008-07-26 17:03:55 +0200 +++ src/apprentice.c 2008-08-30 22:53:20 +0200 @@ -697,6 +697,7 @@ file_oomem(ms, maxmagic * sizeof(*marray)); return -1; } + memset(marray, 0, maxmagic * sizeof(*marray)); marraycount = 0; /* print silly verbose header for USG compat. */ Index: src/compress.c --- src/compress.c.orig 2008-07-26 17:03:55 +0200 +++ src/compress.c 2008-08-30 22:53:20 +0200 @@ -167,7 +167,7 @@ * `safe' read for sockets and pipes. */ protected ssize_t -sread(int fd, void *buf, size_t n, int canbepipe) +file_sread(int fd, void *buf, size_t n, int canbepipe) { int rv, cnt; #ifdef FIONREAD @@ -261,7 +261,7 @@ if (swrite(tfd, startbuf, nbytes) != (ssize_t)nbytes) r = 1; else { - while ((r = sread(fd, buf, sizeof(buf), 1)) > 0) + while ((r = file_sread(fd, buf, sizeof(buf), 1)) > 0) if (swrite(tfd, buf, (size_t)r) != r) break; } @@ -463,7 +463,7 @@ n = 0; goto err; } - if ((r = sread(fdout[0], *newch, HOWMANY, 0)) <= 0) { + if ((r = file_sread(fdout[0], *newch, HOWMANY, 0)) <= 0) { #ifdef DEBUG (void)fprintf(stderr, "Read failed (%s)\n", strerror(errno)); Index: src/file.h --- src/file.h.orig 2008-07-26 17:03:55 +0200 +++ src/file.h 2008-08-30 22:53:20 +0200 @@ -370,7 +370,7 @@ protected void file_showstr(FILE *, const char *, size_t); protected size_t file_mbswidth(const char *); protected const char *file_getbuffer(struct magic_set *); -protected ssize_t sread(int, void *, size_t, int); +protected ssize_t file_sread(int, void *, size_t, int); protected int file_check_mem(struct magic_set *, unsigned int); protected int file_looks_utf8(const unsigned char *, size_t, unichar *, size_t *); @@ -391,9 +391,11 @@ #endif #ifndef HAVE_VASPRINTF +#define vasprintf file_vasprintf int vasprintf(char **, const char *, va_list); #endif #ifndef HAVE_ASPRINTF +#define asprintf file_asprintf int asprintf(char **ptr, const char *format_string, ...); #endif Index: src/funcs.c --- src/funcs.c.orig 2008-07-26 17:03:55 +0200 +++ src/funcs.c 2008-08-30 22:53:20 +0200 @@ -29,6 +29,7 @@ #include #include #include +#include #include #if defined(HAVE_WCHAR_H) #include @@ -346,3 +347,108 @@ #endif /* ENABLE_CONDITIONALS */ return 0; } + +/* + * From bsd-asprintf.c in OpenSSH: + * Copyright (c) 2004 Darren Tucker. + * + * Based originally on asprintf.c from OpenBSD: + * Copyright (c) 1997 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef HAVE_ASPRINTF +int asprintf(char **str, const char *fmt, ...) +{ + va_list ap; + int ret; + + *str = NULL; + va_start(ap, fmt); + ret = vasprintf(str, fmt, ap); + va_end(ap); + + return ret; +} +#endif + +#ifndef HAVE_VASPRINTF + +#ifdef HAVE_LIMITS_H +#include +#endif + +#include +#include +#include + +#ifndef VA_COPY +# ifdef HAVE_VA_COPY +# define VA_COPY(dest, src) va_copy(dest, src) +# else +# ifdef HAVE___VA_COPY +# define VA_COPY(dest, src) __va_copy(dest, src) +# else +# define VA_COPY(dest, src) (dest) = (src) +# endif +# endif +#endif + +#define INIT_SZ 128 + +int vasprintf(char **str, const char *fmt, va_list ap) +{ + int ret = -1; + va_list ap2; + char *string, *newstr; + size_t len; + + VA_COPY(ap2, ap); + if ((string = malloc(INIT_SZ)) == NULL) + goto fail; + + ret = vsnprintf(string, INIT_SZ, fmt, ap2); + if (ret >= 0 && ret < INIT_SZ) { /* succeeded with initial alloc */ + *str = string; + } else if (ret == INT_MAX || ret < 0) { /* Bad length */ + free(string); + goto fail; + } else { /* bigger than initial, realloc allowing for nul */ + len = (size_t)ret + 1; + if ((newstr = realloc(string, len)) == NULL) { + free(string); + goto fail; + } else { + va_end(ap2); + VA_COPY(ap2, ap); + ret = vsnprintf(newstr, len, fmt, ap2); + if (ret >= 0 && (size_t)ret < len) { + *str = newstr; + } else { /* failed with realloc'ed string, give up */ + free(newstr); + goto fail; + } + } + } + va_end(ap2); + return (ret); + +fail: + *str = NULL; + errno = ENOMEM; + va_end(ap2); + return (-1); +} +#endif + Index: src/getopt_long.h --- /dev/null 2008-08-30 22:55:00 +0200 +++ src/getopt_long.h 2008-08-30 22:53:20 +0200 @@ -0,0 +1,14 @@ +#ifndef __GETOPT_LONG_H +#define __GETOPT_LONG_H 1 +struct option { + const char *name; + int has_arg; + int *flag; + int val; +}; +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 +int getopt_long(int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex); + +#endif Index: src/magic.c --- src/magic.c.orig 2008-07-26 17:03:55 +0200 +++ src/magic.c 2008-08-30 22:53:20 +0200 @@ -334,7 +334,7 @@ if (ispipe) { ssize_t r = 0; - while ((r = sread(fd, (void *)&buf[nbytes], + while ((r = file_sread(fd, (void *)&buf[nbytes], (size_t)(HOWMANY - nbytes), 1)) > 0) { nbytes += r; if (r < PIPE_BUF) break; Index: src/softmagic.c --- src/softmagic.c.orig 2008-07-28 19:25:21 +0200 +++ src/softmagic.c 2008-08-30 22:53:20 +0200 @@ -302,10 +302,9 @@ } #ifndef HAVE_STRNDUP -char * strndup(const char *, size_t); - -char * -strndup(const char *str, size_t n) +#define strndup(str,n) magic_strndup(str,n) +static char * +magic_strndup(const char *str, size_t n) { size_t len; char *copy;