]> git.cameronkatri.com Git - mandoc.git/blobdiff - dbm_map.c
In man(1) mode, properly clean up the resn[] result array
[mandoc.git] / dbm_map.c
index 486bb29bc119bcd47e899758130a9d885281498c..87c085d22ec18fcccfd4bd0ce674c8976fdc485e 100644 (file)
--- a/dbm_map.c
+++ b/dbm_map.c
@@ -1,4 +1,4 @@
-/*     $Id: dbm_map.c,v 1.1 2016/07/19 21:31:55 schwarze Exp $ */
+/*     $Id: dbm_map.c,v 1.8 2017/02/17 14:43:54 schwarze Exp $ */
 /*
  * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
  *
  * of the mandoc database, for read-only access.
  * The interface is defined in "dbm_map.h".
  */
+#include "config.h"
+
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#if HAVE_ENDIAN
 #include <endian.h>
+#elif HAVE_SYS_ENDIAN
+#include <sys/endian.h>
+#elif HAVE_NTOHL
+#include <arpa/inet.h>
+#endif
+#if HAVE_ERR
 #include <err.h>
+#endif
 #include <errno.h>
 #include <fcntl.h>
 #include <regex.h>
@@ -70,8 +80,14 @@ dbm_map(const char *fname)
                goto fail;
        magic = dbm_getint(0);
        if (be32toh(*magic) != MANDOCDB_MAGIC) {
-               warnx("dbm_map(%s): Bad initial magic %x (expected %x)",
-                   fname, be32toh(*magic), MANDOCDB_MAGIC);
+               if (strncmp(dbm_base, "SQLite format 3", 15))
+                       warnx("dbm_map(%s): "
+                           "Bad initial magic %x (expected %x)",
+                           fname, be32toh(*magic), MANDOCDB_MAGIC);
+               else
+                       warnx("dbm_map(%s): "
+                           "Obsolete format based on SQLite 3",
+                           fname);
                errno = EFTYPE;
                goto fail;
        }
@@ -84,8 +100,8 @@ dbm_map(const char *fname)
        }
        max_offset = be32toh(*dbm_getint(3)) + sizeof(int32_t);
        if (st.st_size != max_offset) {
-               warnx("dbm_map(%s): Inconsistent file size %llu (expected %d)",
-                   fname, st.st_size, max_offset);
+               warnx("dbm_map(%s): Inconsistent file size %lld (expected %d)",
+                   fname, (long long)st.st_size, max_offset);
                errno = EFTYPE;
                goto fail;
        }
@@ -127,7 +143,11 @@ void *
 dbm_get(int32_t offset)
 {
        offset = be32toh(offset);
-       if (offset < 0 || offset >= max_offset) {
+       if (offset < 0) {
+               warnx("dbm_get: Database corrupt: offset %d", offset);
+               return NULL;
+       }
+       if (offset >= max_offset) {
                warnx("dbm_get: Database corrupt: offset %d > %d",
                    offset, max_offset);
                return NULL;
@@ -155,7 +175,7 @@ dbm_getint(int32_t offset)
 int32_t
 dbm_addr(const void *p)
 {
-       return htobe32((char *)p - dbm_base);
+       return htobe32((const char *)p - dbm_base);
 }
 
 int