There appears to be a cut-and-paste error in one spot in pwd_mkdb. I am unsure of how it affects users, if it does at all. Here is the patch: --- pwd_mkdb.c.orig 2014-07-07 12:29:15.019698896 -0700 +++ pwd_mkdb.c 2014-07-07 12:30:08.125795430 -0700 @@ -341,21 +341,21 @@ main(int argc, char *argv[]) * user. When operating on `old format' databases, this * would result in applications `seeing' only the updated * entries. */ key.data = verskey; key.size = sizeof(verskey)-1; data.data = &version; data.size = 1; if ((dp->put)(dp, &key, &data, 0) == -1) error("put"); - if ((dp->put)(sdp, &key, &data, 0) == -1) + if ((sdp->put)(sdp, &key, &data, 0) == -1) error("put"); } ypcnt = 0; data.data = (u_char *)buf; sdata.data = (u_char *)sbuf; key.data = (u_char *)tbuf; for (cnt = 1; scan(fp, &pwd); ++cnt) { if (!is_comment && (pwd.pw_name[0] == '+' || pwd.pw_name[0] == '-')) { yp_enabled = 1; By grepping the file, we can see that everywhere else in the file uses sdp->put instead of dp->put: $ grep put pwd_mkdb.c.orig | grep sdp 5:351: if ((dp->put)(sdp, &key, &data, 0) == -1) 13:437: if ((sdp->put)(sdp, &key, &sdata, method) == -1) 15:445: if ((sdp->put)(sdp, &key, &sdata, method) == -1) 17:453: if ((sdp->put)(sdp, &key, &sdata, methoduid) == -1) 21:464: if ((sdp->put)(sdp, &key, &sdata, method) == -1) 29:527: if ((sdp->put)(sdp, &key, &sdata, method) == -1) 31:535: if ((sdp->put)(sdp, &key, &sdata, method) == -1) 33:543: if ((sdp->put)(sdp, &key, &sdata, methoduid) == -1) 37:554: if ((sdp->put)(sdp, &key, &sdata, method) == -1) 41:584: if ((sdp->put)(sdp, &key, &data, method) == -1) 45:590: if ((sdp->put)(sdp, &key, &data, method) == -1)
Interesting.. nectar@ wrote the code in question in 2003 so CC him.
I think this copy/paste error has no effect, since dp and sdp both refer to DB_HASH type databases, so they have the same put function. Nevertheless, it seems good to fix this (I have not tested it though).
I will take it.
A commit references this bug: Author: araujo Date: Mon Dec 28 05:48:22 UTC 2015 New revision: 292828 URL: https://svnweb.freebsd.org/changeset/base/292828 Log: The sdp opens the database with PERM_SECURE mode and it is different than dp that opens the database with PERM_INSECURE, so we need to check sdp->put against sdp instead of use dp->put. PR: bin/191720 Submitted by: Miles Ohlrich <turingsboy@yahoo.com> Approved by: rodrigc (mentor) Differential Revision: https://reviews.freebsd.org/D4255 Changes: head/usr.sbin/pwd_mkdb/pwd_mkdb.c
Committed. Thanks!