diff options
Diffstat (limited to 'pkgtools/pkg_install/files/lib/pkgdb.c')
-rw-r--r-- | pkgtools/pkg_install/files/lib/pkgdb.c | 20 |
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; |