From 9cccc18141090190083cbe25aa72e37d3f906ca0 Mon Sep 17 00:00:00 2001
From: Eric Andersen <andersen@codepoet.org>
Date: Tue, 23 Dec 2003 20:37:23 +0000
Subject: don't mess up errno

---
 libbb/xconnect.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

(limited to 'libbb')

diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index b3619fd0e..10ba9477c 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -27,9 +27,15 @@ unsigned short bb_lookup_port(const char *port, unsigned short default_port)
 {
 	unsigned short port_nr = htons(default_port);
 	if (port) {
-	char *endptr;
-		long port_long = strtol(port, &endptr, 10);
+		char *endptr;
+		int old_errno;
+		long port_long;
 
+		/* Since this is a lib function, we're not allowed to reset errno to 0.
+		 * Doing so could break an app that is deferring checking of errno. */
+		old_errno = errno;
+		errno = 0;
+		port_long = strtol(port, &endptr, 10);
 		if (errno != 0 || *endptr!='\0' || endptr==port || port_long < 0 || port_long > 65535) {
 			struct servent *tserv = getservbyname(port, "tcp");
 			if (tserv) {
@@ -38,6 +44,7 @@ unsigned short bb_lookup_port(const char *port, unsigned short default_port)
 	} else {
 			port_nr = htons(port_long);
 		}
+		errno = old_errno;
 	}
 	return port_nr;
 }
-- 
cgit v1.2.3