Index: src/apprentice.c
--- src/apprentice.c.orig	2009-09-02 14:35:59 +0200
+++ src/apprentice.c	2009-09-02 14:37:30 +0200
@@ -791,7 +791,7 @@
 	for (i = 0; i < marraycount; i++)
 		mentrycount += marray[i].cont_count;
 
-	slen = sizeof(**magicp) * mentrycount;
+	slen = sizeof(**magicp) * (mentrycount + 1);
 	if ((*magicp = CAST(struct magic *, malloc(slen))) == NULL) {
 		file_oomem(ms, slen);
 		errs++;
Index: src/compress.c
--- src/compress.c.orig	2009-03-23 15:21:51 +0100
+++ src/compress.c	2009-09-02 14:35:59 +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	2009-03-17 22:52:35 +0100
+++ src/file.h	2009-09-02 14:35:59 +0200
@@ -385,7 +385,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 *);
@@ -412,9 +412,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	2009-04-07 13:07:00 +0200
+++ src/funcs.c	2009-09-02 14:35:59 +0200
@@ -34,6 +34,7 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+#include <limits.h>
 #include <ctype.h>
 #if defined(HAVE_WCHAR_H)
 #include <wchar.h>
@@ -424,3 +425,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 <Todd.Miller@courtesan.com>
+ *
+ * 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 <limits.h>
+#endif
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#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	2009-09-02 14:37:02 +0200
+++ src/getopt_long.h	2009-09-02 14:35:59 +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	2009-03-20 22:25:41 +0100
+++ src/magic.c	2009-09-02 14:35:59 +0200
@@ -306,7 +306,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	2009-09-02 14:35:59 +0200
+++ src/softmagic.c	2009-09-02 14:37:59 +0200
@@ -191,8 +191,7 @@
 		if (file_check_mem(ms, ++cont_level) == -1)
 			return -1;
 
-		while (magic[magindex+1].cont_level != 0 &&
-		    ++magindex < nmagic) {
+		while (magindex+1 < nmagic && magic[++magindex].cont_level) {
 			m = &magic[magindex];
 			ms->line = m->lineno; /* for messages */
 
