Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: passwd processing broken in amd64 (time_t probably)
On Wed, Jan 14, 2009 at 02:03:35PM +0000, Julio M. Merino Vidal wrote:
>
> Effectively, hardcoding a '*version = 1' in _pw_opendb before returning
> makes getpwent work again. So it looks like the version field is not
> being stored in the database properly.
If this is effectively the problem, how does the following look?
Index: pwd_mkdb.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/pwd_mkdb/pwd_mkdb.c,v
retrieving revision 1.34
diff -u -p -r1.34 pwd_mkdb.c
--- pwd_mkdb.c 21 Jul 2008 13:36:59 -0000 1.34
+++ pwd_mkdb.c 14 Jan 2009 14:25:49 -0000
@@ -1,6 +1,32 @@
/* $NetBSD: pwd_mkdb.c,v 1.34 2008/07/21 13:36:59 lukem Exp $ */
/*
+ * Copyright (c) 2000, 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
* Copyright (c) 1991, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
@@ -60,7 +86,7 @@
#include <sys/cdefs.h>
#if !defined(lint)
-__COPYRIGHT("@(#) Copyright (c) 2000\
+__COPYRIGHT("@(#) Copyright (c) 2000, 2009\
The NetBSD Foundation, Inc. All rights reserved.\
Copyright (c) 1991, 1993, 1994\
The Regents of the University of California. All rights reserved.");
@@ -115,6 +141,8 @@ HASHINFO openinfo = {
#define FILE_SECURE 0x02
#define FILE_ORIG 0x04
+#define DBVERSION 1
+
static char *pname; /* password file name */
static char prefix[MAXPATHLEN];
static char oldpwdfile[MAX(MAXPATHLEN, LINE_MAX * 2)];
@@ -131,6 +159,8 @@ int getdbent(DB *, const char *, int, vo
void inconsistancy(void);
void install(const char *, const char *);
int main(int, char **);
+void checkversion(DB *);
+void putversion(DB *);
void putdbents(DB *, struct passwd *, const char *, int, const char *, int,
int, int);
void putyptoken(DB *, const char *);
@@ -258,6 +288,10 @@ main(int argc, char *argv[])
&openinfo);
if (dp == NULL)
error(pwd_db_tmp);
+ if (username != NULL)
+ checkversion(dp);
+ else
+ putversion(dp);
clean |= FILE_INSECURE;
}
@@ -271,6 +305,10 @@ main(int argc, char *argv[])
edp = dbopen(pwd_Sdb_tmp, flags, PERM_SECURE, DB_HASH, &openinfo);
if (!edp)
error(pwd_Sdb_tmp);
+ if (username != NULL)
+ checkversion(edp);
+ else
+ putversion(edp);
clean |= FILE_SECURE;
/*
@@ -804,6 +842,45 @@ getdbent(DB *dp, const char *fn, int typ
}
void
+checkversion(DB *dp)
+{
+ DBT data, key;
+ int ret;
+
+ key.data = __UNCONST("VERSION");
+ key.size = strlen((char *)key.data) + 1;
+
+ ret = (*dp->get)(dp, &key, &data, 0);
+ if (ret == -1) {
+ warnx("cannot get VERSION record from database");
+ bailout();
+ }
+
+ if (ret == 1 || *(int *)data.data != DBVERSION) {
+ warnx("databases are laid out according to an old version");
+ warnx("re-build the databases without -u");
+ bailout();
+ }
+}
+
+void
+putversion(DB *dp)
+{
+ DBT data, key;
+ int version = DBVERSION;
+
+ key.data = __UNCONST("VERSION");
+ key.size = strlen((char *)key.data) + 1;
+ data.data = &version;
+ data.size = sizeof(version);
+
+ if ((*dp->put)(dp, &key, &data, R_NOOVERWRITE) == -1) {
+ warnx("cannot set VERSION record in database");
+ bailout();
+ }
+}
+
+void
putyptoken(DB *dp, const char *fn)
{
DBT data, key;
--
Julio M. Merino Vidal <jmmv%NetBSD.org@localhost>
Home |
Main Index |
Thread Index |
Old Index