summaryrefslogtreecommitdiff
path: root/pkgtools/pkg_install/files/lib/pkgdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/pkg_install/files/lib/pkgdb.c')
-rw-r--r--pkgtools/pkg_install/files/lib/pkgdb.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/pkgtools/pkg_install/files/lib/pkgdb.c b/pkgtools/pkg_install/files/lib/pkgdb.c
index 7a6d2da34fb..0d9244b9d09 100644
--- a/pkgtools/pkg_install/files/lib/pkgdb.c
+++ b/pkgtools/pkg_install/files/lib/pkgdb.c
@@ -1,4 +1,4 @@
-/* $NetBSD: pkgdb.c,v 1.37 2010/01/22 13:30:42 joerg Exp $ */
+/* $NetBSD: pkgdb.c,v 1.38 2010/04/14 18:24:58 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -7,10 +7,10 @@
#if HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif
-__RCSID("$NetBSD: pkgdb.c,v 1.37 2010/01/22 13:30:42 joerg Exp $");
+__RCSID("$NetBSD: pkgdb.c,v 1.38 2010/04/14 18:24:58 joerg Exp $");
/*-
- * Copyright (c) 1999-2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 1999-2010 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -168,6 +168,8 @@ pkgdb_retrieve(const char *key)
{
DBT keyd, vald;
int status;
+ char *eos;
+ static int corruption_warning;
if (pkgdbp == NULL)
return NULL;
@@ -179,9 +181,15 @@ pkgdb_retrieve(const char *key)
vald.data = (void *)NULL;
vald.size = 0;
status = (*pkgdbp->get) (pkgdbp, &keyd, &vald, 0);
- if (status) {
- vald.data = NULL;
- vald.size = 0;
+ if (status)
+ return NULL;
+ eos = memchr(vald.data, 0, vald.size);
+ if (eos == NULL || eos != (char *)vald.data + vald.size) {
+ if (!corruption_warning) {
+ warnx("pkgdb corrupted, please run ``pkg_admin rebuild''");
+ corruption_warning = 1;
+ }
+ return NULL;
}
return vald.data;