don't mess up errno
authorEric Andersen <andersen@codepoet.org>
Tue, 23 Dec 2003 20:37:23 +0000 (20:37 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 23 Dec 2003 20:37:23 +0000 (20:37 -0000)
libbb/xconnect.c

index b3619fd0ee43cb312bcfbc38b0823346da319bf6..10ba9477c173d6e35819cb67e2febb48b89133a2 100644 (file)
@@ -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;
 }