Skip site navigation (1)Skip section navigation (2)
Date:      Mon,  4 Sep 2006 16:32:08 +0200 (CEST)
From:      Thomas Quinot <thomas@cuivre.fr.eu.org>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/102848: Malformed line in master.passwd causes libutil's pw_copy to crash
Message-ID:  <20060904143208.5985D5C44B@melamine.cuivre.fr.eu.org>
Resent-Message-ID: <200609041440.k84EeQNW018155@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         102848
>Category:       bin
>Synopsis:       Malformed line in master.passwd causes libutil's pw_copy to crash
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Sep 04 14:40:20 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Thomas Quinot
>Release:        FreeBSD 6.1-RC i386
>Organization:
>Environment:
System: FreeBSD melamine.cuivre.fr.eu.org 6.1-RC FreeBSD 6.1-RC #0: Thu May 4 13:21:21 CEST 2006 thomas@melamine.cuivre.fr.eu.org:/space/build/obj/space/build/src/RELENG_6/sys/MELAMINE i386


	
>Description:
	pw_copy is a libutil subprogram that copies master.passwd and replaces
	or adds a single entry. It is used, among others, by rpc.yppasswdd, to
	update master.passwd for a single user.

	When a malformed line is encountered in master.passwd, this function
	causes a null pointer dereference instead of silently copying the malformed
	line to the output FD. In the case of rpc.yppasswdd, this causes the daemon
	to abort if a password change is attempted for an entry located after the
	malformed one.

>How-To-Repeat:
	Add a malformed entry (wrong number of fields) to master.passwd
	on a NIS server.
	Use rpc.yppasswdd to attempt to change the password of an entry
	located after the faulty one.
	Observe that rpc.yppasswdd dies on a segfault and that master.passwd
	is left unmodified.
>Fix:

Index: pw_util.c
===================================================================
RCS file: /space/mirror/ncvs/src/lib/libutil/pw_util.c,v
retrieving revision 1.35
diff -u -r1.35 pw_util.c
--- pw_util.c	18 May 2004 15:53:58 -0000	1.35
+++ pw_util.c	4 Sep 2006 10:43:53 -0000
@@ -481,13 +481,22 @@
 		}
 
 		/* is it the one we're looking for? */
+
 		t = *q;
 		*q = '\0';
+
 		fpw = pw_scan(r, PWSCAN_MASTER);
+
+		/*
+		 * fpw is either the struct password for the current line,
+		 * or NULL if the line is malformed.
+		 */
+
 		*q = t;
-		if (strcmp(fpw->pw_name, pw->pw_name) != 0) {
+		if (fpw == NULL || strcmp(fpw->pw_name, pw->pw_name) != 0) {
 			/* nope */
-			free(fpw);
+			if (fpw != NULL)
+				free(fpw);
 			if (write(tfd, p, q - p + 1) != q - p + 1)
 				goto err;
 			++q;
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060904143208.5985D5C44B>