Bug 191720

Summary: [patch] minor cut-and-paste error in pwd_mkdb(8)
Product: Base System Reporter: Miles Ohlrich <turingsboy>
Component: binAssignee: Marcelo Araujo <araujo>
Status: Closed FIXED    
Severity: Affects Only Me CC: araujo, jilles, nectar
Priority: ---    
Version: CURRENT   
Hardware: Any   
OS: Any   

Description Miles Ohlrich 2014-07-07 19:41:25 UTC
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)
Comment 1 Pedro F. Giffuni freebsd_committer freebsd_triage 2014-08-23 16:35:54 UTC
Interesting.. nectar@ wrote the code in question in 2003 so CC him.
Comment 2 Jilles Tjoelker freebsd_committer freebsd_triage 2014-08-23 22:29:28 UTC
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).
Comment 3 Marcelo Araujo freebsd_committer freebsd_triage 2015-11-21 03:47:23 UTC
I will take it.
Comment 4 commit-hook freebsd_committer freebsd_triage 2015-12-28 05:48:33 UTC
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
Comment 5 Marcelo Araujo freebsd_committer freebsd_triage 2015-12-28 05:49:24 UTC
Committed. Thanks!