svn commit: r334326 - head/lib/libfetch

Dag-Erling Smørgrav des at FreeBSD.org
Tue May 29 13:07:38 UTC 2018


Author: des
Date: Tue May 29 13:07:36 2018
New Revision: 334326
URL: https://svnweb.freebsd.org/changeset/base/334326

Log:
  Fix an inverted conditional in the netrc code, which would ignore the
  value of $HOME and always use the home directory from the passwd
  database, unless $HOME was unset, in which case it would use (null).
  
  While there, clean up handling of netrcfd and add debugging aids.
  
  MFC after:	3 weeks

Modified:
  head/lib/libfetch/common.c
  head/lib/libfetch/fetch.c
  head/lib/libfetch/ftp.c

Modified: head/lib/libfetch/common.c
==============================================================================
--- head/lib/libfetch/common.c	Tue May 29 12:43:03 2018	(r334325)
+++ head/lib/libfetch/common.c	Tue May 29 13:07:36 2018	(r334326)
@@ -1361,19 +1361,20 @@ fetch_read_word(FILE *f)
 static int
 fetch_netrc_open(void)
 {
-	const char *p;
+	struct passwd *pwd;
 	char fn[PATH_MAX];
+	const char *p;
+	int fd, serrno;
 
 	if ((p = getenv("NETRC")) != NULL) {
+		DEBUGF("NETRC=%s\n", p);
 		if (snprintf(fn, sizeof(fn), "%s", p) >= (int)sizeof(fn)) {
 			fetch_info("$NETRC specifies a file name "
 			    "longer than PATH_MAX");
 			return (-1);
 		}
 	} else {
-		if ((p = getenv("HOME")) != NULL) {
-			struct passwd *pwd;
-
+		if ((p = getenv("HOME")) == NULL) {
 			if ((pwd = getpwuid(getuid())) == NULL ||
 			    (p = pwd->pw_dir) == NULL)
 				return (-1);
@@ -1382,7 +1383,12 @@ fetch_netrc_open(void)
 			return (-1);
 	}
 
-	return (open(fn, O_RDONLY));
+	if ((fd = open(fn, O_RDONLY)) < 0) {
+		serrno = errno;
+		DEBUGF("%s: %s\n", fn, strerror(serrno));
+		errno = serrno;
+	}
+	return (fd);
 }
 
 /*
@@ -1392,24 +1398,32 @@ int
 fetch_netrc_auth(struct url *url)
 {
 	const char *word;
+	int serrno;
 	FILE *f;
 
-	if (url->netrcfd == -2)
+	if (url->netrcfd < 0)
 		url->netrcfd = fetch_netrc_open();
 	if (url->netrcfd < 0)
 		return (-1);
-	if ((f = fdopen(url->netrcfd, "r")) == NULL)
+	if ((f = fdopen(url->netrcfd, "r")) == NULL) {
+		serrno = errno;
+		DEBUGF("fdopen(netrcfd): %s", strerror(errno));
+		close(url->netrcfd);
+		url->netrcfd = -1;
+		errno = serrno;
 		return (-1);
+	}
 	rewind(f);
+	DEBUGF("searching netrc for %s\n", url->host);
 	while ((word = fetch_read_word(f)) != NULL) {
 		if (strcmp(word, "default") == 0) {
-			DEBUGF("Using default .netrc settings");
+			DEBUGF("using default netrc settings\n");
 			break;
 		}
 		if (strcmp(word, "machine") == 0 &&
 		    (word = fetch_read_word(f)) != NULL &&
 		    strcasecmp(word, url->host) == 0) {
-			DEBUGF("Using .netrc settings for %s", word);
+			DEBUGF("using netrc settings for %s\n", word);
 			break;
 		}
 	}
@@ -1441,9 +1455,13 @@ fetch_netrc_auth(struct url *url)
 		}
 	}
 	fclose(f);
+	url->netrcfd = -1;
 	return (0);
- ferr:
+ferr:
+	serrno = errno;
 	fclose(f);
+	url->netrcfd = -1;
+	errno = serrno;
 	return (-1);
 }
 

Modified: head/lib/libfetch/fetch.c
==============================================================================
--- head/lib/libfetch/fetch.c	Tue May 29 12:43:03 2018	(r334325)
+++ head/lib/libfetch/fetch.c	Tue May 29 13:07:36 2018	(r334326)
@@ -272,6 +272,7 @@ fetchMakeURL(const char *scheme, const char *host, int
 		fetch_syserr();
 		return (NULL);
 	}
+	u->netrcfd = -1;
 
 	if ((u->doc = strdup(doc ? doc : "/")) == NULL) {
 		fetch_syserr();
@@ -286,7 +287,6 @@ fetchMakeURL(const char *scheme, const char *host, int
 	seturl(pwd);
 #undef seturl
 	u->port = port;
-	u->netrcfd = -2;
 
 	return (u);
 }
@@ -352,7 +352,7 @@ fetchParseURL(const char *URL)
 		fetch_syserr();
 		return (NULL);
 	}
-	u->netrcfd = -2;
+	u->netrcfd = -1;
 
 	/* scheme name */
 	if ((p = strstr(URL, ":/"))) {

Modified: head/lib/libfetch/ftp.c
==============================================================================
--- head/lib/libfetch/ftp.c	Tue May 29 12:43:03 2018	(r334325)
+++ head/lib/libfetch/ftp.c	Tue May 29 13:07:36 2018	(r334326)
@@ -914,7 +914,8 @@ ftp_authenticate(conn_t *conn, struct url *url, struct
 		fetch_netrc_auth(url);
 	user = url->user;
 	if (*user == '\0')
-		user = getenv("FTP_LOGIN");
+		if ((user = getenv("FTP_LOGIN")) != NULL)
+			DEBUGF("FTP_LOGIN=%s\n", user);
 	if (user == NULL || *user == '\0')
 		user = FTP_ANONYMOUS_USER;
 	if (purl && url->port == fetch_default_port(url->scheme))
@@ -928,7 +929,8 @@ ftp_authenticate(conn_t *conn, struct url *url, struct
 	if (e == FTP_NEED_PASSWORD) {
 		pwd = url->pwd;
 		if (*pwd == '\0')
-			pwd = getenv("FTP_PASSWORD");
+			if ((pwd = getenv("FTP_PASSWORD")) != NULL)
+				DEBUGF("FTP_PASSWORD=%s\n", pwd);
 		if (pwd == NULL || *pwd == '\0') {
 			if ((logname = getlogin()) == NULL)
 				logname = FTP_ANONYMOUS_USER;


More information about the svn-src-head mailing list