Subject: Re: pkg/36741
To: None <joerg@NetBSD.org, gnats-admin@netbsd.org, pkgsrc-bugs@netbsd.org,>
From: Dieter Baron <dillo@NetBSD.org>
List: pkgsrc-bugs
Date: 08/08/2007 06:45:01
The following reply was made to PR pkg/36741; it has been noted by GNATS.

From: Dieter Baron <dillo@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: pkg/36741
Date: Wed, 8 Aug 2007 08:44:49 +0200

 --UlVJffcvxoiEqYs2
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 hi,
 
 try the appached diff, which should fix the spurious warning.  It also
 fixes a segfault if opening the temp file doesn't work and no
 +INSTALLED_INFO exists (e.g. when trying to set the first variable as
 non-root).
 
 Joerg: okay to commit?
 
 					yours,
 					dillo
 
 --UlVJffcvxoiEqYs2
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="pkg_install-unset.diff"
 
 Index: files/lib/var.c
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_install/files/lib/var.c,v
 retrieving revision 1.4
 diff -u -r1.4 var.c
 --- files/lib/var.c	24 Apr 2006 13:52:05 -0000	1.4
 +++ files/lib/var.c	8 Aug 2007 06:40:35 -0000
 @@ -168,23 +168,31 @@
  		return 0;
  
  	fp = fopen(fname, "r");
 -	if (!fp && errno != ENOENT) {
 -		warn("var_set: can't open '%s' for reading", fname);
 -		return -1;
 +	if (fp == NULL) {
 +		if (errno != ENOENT) {
 +			warn("var_set: can't open '%s' for reading", fname);
 +			return -1;
 +		}
 +		if (value == NULL) {
 +			/* no variables are set, so unset is a no-op */
 +			return 0;
 +		}
  	}
  
  	tmpname = malloc(strlen(fname)+8);
  	sprintf(tmpname, "%s.XXXXXX", fname);
  	if ((fd=mkstemp(tmpname)) < 0) {
  		free(tmpname);
 -		fclose(fp);
 +		if (fp)
 +			fclose(fp);
  		warn("var_set: can't open temp file for '%s' for writing",
  		      fname);
  		return -1;
  	}
  	if (chmod(tmpname, 0644) < 0) {
  		close(fd);
 -		fclose(fp);
 +		if (fp)
 +			fclose(fp);
  		free(tmpname);
  		warn("var_set: can't set permissions for temp file for '%s'",
  		      fname);
 @@ -194,7 +202,8 @@
  		close(fd);
  		remove(tmpname);
  		free(tmpname);
 -		fclose(fp);
 +		if (fp)
 +			fclose(fp);
  		warn("var_set: can't open temp file for '%s' for writing",
  		      fname);
  		return -1;
 
 --UlVJffcvxoiEqYs2--