[7885] in bugtraq

home help back first fref pref prev next nref lref last post

Re: nslookup issues

daemon@ATHENA.MIT.EDU (Wichert Akkerman)
Fri Sep 4 22:47:38 1998

Date: 	Sat, 5 Sep 1998 03:20:33 +0200
Reply-To: Wichert Akkerman <wichert@WIGGY.ML.ORG>
From: Wichert Akkerman <wichert@WIGGY.ML.ORG>
X-To:         Theo de Raadt <deraadt@CVS.OPENBSD.ORG>
To: BUGTRAQ@NETSPACE.ORG
In-Reply-To:  <199808311851.MAA15350@cvs.openbsd.org>; from Theo de Raadt on
              Mon, Aug 31, 1998 at 12:51:35PM -0600

--YiEDa0DAkWCtVeE4
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

Previously Theo de Raadt wrote:
> Well, here's a first cut at fixing some of the nslookup/dig problems.
> This patch should get people started at repairing their distributions.
> If anyone has any further fixes or notes some other issues in this
> area, please let me know.

This patch doesn't apply to bind 8.1.2. I've revised the patch
a bit and came to the patch below.=20

Wichert.


diff -ru org/bind-8.1.2/bin/dig/dig.c bind-8.1.2/bin/dig/dig.c
--- org/bind-8.1.2/bin/dig/dig.c        Thu Mar 19 20:30:18 1998
+++ bind-8.1.2/bin/dig/dig.c    Tue Sep  1 17:03:21 1998
@@ -745,9 +745,11 @@
 static int
 SetOption(const char *string) {
        char option[NAME_LEN], type[NAME_LEN], *ptr;
+       char get[80];
        int i;
=20
-       i =3D sscanf(string, " %s", option);
+       snprintf(get, sizeof(get), " %%%ds", sizeof(option-1));
+       i =3D sscanf(string, get, option);
        if (i !=3D 1) {
                fprintf(stderr, ";*** Invalid option: %s\n",  option);
                return (ERROR);
@@ -779,8 +781,10 @@
                _res.options &=3D ~RES_DNSRCH;
        } else if (strncmp(option, "do", 2) =3D=3D 0) { /* domain */
                ptr =3D strchr(option, '=3D');
-               if (ptr !=3D NULL)
-                       sscanf(++ptr, "%s", _res.defdname);
+               if (ptr !=3D NULL) {
+                       snprintf(get, sizeof(get),"%%%ds", sizeof(_res.defdname));
+                       sscanf(++ptr, get, _res.defdname);
+               }
        } else if (strncmp(option, "ti", 2) =3D=3D 0) {      /* timeout */
                ptr =3D strchr(option, '=3D');
                if (ptr !=3D NULL)
diff -ru org/bind-8.1.2/bin/nslookup/list.c bind-8.1.2/bin/nslookup/list.c
--- org/bind-8.1.2/bin/nslookup/list.c  Tue Nov 18 01:32:33 1997
+++ bind-8.1.2/bin/nslookup/list.c      Tue Sep  1 17:09:09 1998
@@ -152,13 +152,16 @@
 ListHostsByType(char *string, int putToFile) {
        char *namePtr, name[NAME_LEN], option[NAME_LEN];
        int i, qtype, result;
+       char get[80];
=20
        /*
         * Parse the command line. It maybe of the form "ls -t domain"
         * or "ls -t type domain".
         */
=20
-       i =3D sscanf(string, " ls -t %s %s", option, name);
+       snprintf(get, sizeof get, " ls -t %%%ds %%%ds", sizeof option-1,
+                               sizeof name-1);
+       i =3D sscanf(string, get, option, name);
        if (putToFile && i =3D=3D 2 && name[0] =3D=3D '>')
                i--;
        if (i =3D=3D 2) {
@@ -183,12 +186,15 @@
 ListHosts(char *string, int putToFile) {
        char *namePtr, name[NAME_LEN], option[NAME_LEN];
        int i, qtype, result;
+       char get[80];
=20
        /*
         *  Parse the command line. It maybe of the form "ls domain",
         *  "ls -X domain".
         */
-       i =3D sscanf(string, " ls %s %s", option, name);
+       snprintf(get, sizeof get, " ls -t %%%ds %%%ds", sizeof option-1,
+                       sizeof name-1);
+       i =3D sscanf(string, get, option, name);
        if (putToFile && i =3D=3D 2 && name[0] =3D=3D '>')
                i--;
        if (i =3D=3D 2) {
@@ -481,8 +487,10 @@
 {
     char file[PATH_MAX];
     char command[PATH_MAX];
+       char get[80];
=20
-    sscanf(string, " view %s", file);
+       snprintf(get, sizeof get, " view %%%ds", sizeof file-1);
+    sscanf(string, get, file);
     (void)sprintf(command, "grep \"^ \" %s | sort | %s", file, pager);
     system(command);
 }
@@ -516,6 +524,7 @@
        int             lastc;
        char                    name[NAME_LEN];
        char                    file[NAME_LEN];
+       char            get[80];
=20
        /*
         *  We need a valid current host info to get an inet address.
@@ -525,7 +534,8 @@
            return (ERROR);
        }
=20
-       if (sscanf(string, " finger %s", name) =3D=3D 1) {
+       snprintf(get, sizeof get, " finger %%%ds", sizeof name-1);
+       if (sscanf(string, get, name) =3D=3D 1) {
            if (putToFile && (name[0] =3D=3D '>')) {
                name[0] =3D '\0';
            }
diff -ru org/bind-8.1.2/bin/nslookup/main.c bind-8.1.2/bin/nslookup/main.c
--- org/bind-8.1.2/bin/nslookup/main.c  Fri Apr 25 02:27:18 1997
+++ bind-8.1.2/bin/nslookup/main.c      Tue Sep  1 21:15:25 1998
@@ -464,6 +464,7 @@
     char               newServer[NAME_LEN];
     int                        result;
     int                        i;
+    char               get[40];
=20
     /*
      *  Parse the command line. It maybe of the form "server name",
@@ -471,12 +472,15 @@
      */
=20
     if (local) {
-       i =3D sscanf(string, " lserver %s", newServer);
+       snprintf(get, sizeof get, "lserver %%%ds", sizeof newServer-1);
+       i =3D sscanf(string, get, newServer);
     } else {
-       i =3D sscanf(string, " server %s", newServer);
+       snprintf(get, sizeof get, "server %%%ds", sizeof newServer-1);
+       i =3D sscanf(string, get, newServer);
     }
     if (i !=3D 1) {
-       i =3D sscanf(string, " %s", newServer);
+       snprintf(get, sizeof get, " %%%ds", sizeof newServer-1);
+       i =3D sscanf(string, get, newServer);
        if (i !=3D 1) {
            fprintf(stderr,"SetDefaultServer: invalid name: %s\n",  string);
            return(ERROR);
@@ -667,6 +671,7 @@
     char       host[NAME_LEN];
     char       file[PATH_MAX];
     int                result;
+    char       get[80];
=20
     /*
      *  Invalidate the current host information to prevent Finger=20
@@ -681,7 +686,8 @@
      *
      */
=20
-    sscanf(string, " %s", host);       /* removes white space */
+    snprintf(get, sizeof get, " %%%ds", sizeof host-1);
+    sscanf(string, get, host); /* removes white space */
     if (!putToFile) {
        filePtr =3D stdout;
     } else {
@@ -738,11 +744,13 @@
     char       host[NAME_LEN];
     char       server[NAME_LEN];
     int                result;
+    char       get[80];
     static HostInfo serverInfo;
=20
     curHostValid =3D FALSE;
=20
-    sscanf(string, " %s %s", host, server);
+    snprintf(get, sizeof get, " %%%ds %%%ds", sizeof host-1, sizeof server=
-1);
+    sscanf(string, get, host, server);
     if (!putToFile) {
        filePtr =3D stdout;
     } else {
@@ -823,6 +831,7 @@
     char       type[NAME_LEN];
     char       *ptr;
     int                tmp;
+    char       get[40];
=20
     while (isspace(*option))
        ++option;
@@ -851,7 +860,8 @@
        } else if (strncmp(option, "do", 2) =3D=3D 0) { /* domain */
            ptr =3D strchr(option, '=3D');
            if (ptr !=3D NULL) {
-               sscanf(++ptr, "%s", _res.defdname);
+               snprintf(get, sizeof get, "%%%ds", sizeof _res.defdname-1);
+               sscanf(++ptr, get, _res.defdname);
                res_re_init();
            }
        } else if (strncmp(option, "deb", 1) =3D=3D 0) {        /* debug */
@@ -877,13 +887,15 @@
          strncmp(option, "ty", 2) =3D=3D 0) {          /* type */
            ptr =3D strchr(option, '=3D');
            if (ptr !=3D NULL) {
-               sscanf(++ptr, "%s", type);
+               snprintf(get, sizeof get, "%%%ds", sizeof type-1);
+               sscanf(++ptr, get, type);
                queryType =3D StringToType(type, queryType, stderr);
            }
        } else if (strncmp(option, "cl", 2) =3D=3D 0) { /* query class */
            ptr =3D strchr(option, '=3D');
            if (ptr !=3D NULL) {
-               sscanf(++ptr, "%s", type);
+               snprintf(get, sizeof get, "%%%ds", sizeof type-1);
+               sscanf(++ptr, get, type);
                queryClass =3D StringToClass(type, queryClass, stderr);
            }
        } else if (strncmp(option, "rec", 3) =3D=3D 0) {        /* recurse */
@@ -901,7 +913,8 @@
        } else if (strncmp(option, "ro", 2) =3D=3D 0) { /* root */
            ptr =3D strchr(option, '=3D');
            if (ptr !=3D NULL) {
-               sscanf(++ptr, "%s", rootServerName);
+               snprintf(get, sizeof get, "%%%ds", sizeof rootServerName-1);
+               sscanf(++ptr, get, rootServerName);
            }
        } else if (strncmp(option, "sea", 3) =3D=3D 0) {        /* search list */
            _res.options |=3D RES_DNSRCH;
@@ -964,6 +977,7 @@
     int n;
=20
     (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
+    _res.defdname[sizeof(_res.defdname) - 1] =3D '\0';
     if ((cp =3D strchr(_res.defdname, '\n')) !=3D NULL)
            *cp =3D '\0';
     /*
@@ -1109,8 +1123,9 @@
     if ((cp =3D getenv("HOME")) !=3D NULL &&
       (strlen(cp) + strlen(_PATH_NSLOOKUPRC)) < sizeof(buf)) {
=20
-       (void) strcpy(buf, cp);
-       (void) strcat(buf, _PATH_NSLOOKUPRC);
+       (void) strncpy(buf, cp, sizeof buf - 1);
+       buf[sizeof buf - 1] =3D '\0';
+       (void) strncat(buf, _PATH_NSLOOKUPRC, sizeof buf - strlen(buf) - 1);
=20
        if ((fp =3D fopen(buf, "r")) !=3D NULL) {
            while (fgets(buf, sizeof(buf), fp) !=3D NULL) {
diff -ru org/bind-8.1.2/bin/nslookup/subr.c bind-8.1.2/bin/nslookup/subr.c
--- org/bind-8.1.2/bin/nslookup/subr.c  Fri Apr 25 02:27:19 1997
+++ bind-8.1.2/bin/nslookup/subr.c      Tue Sep  1 21:14:39 1998
@@ -341,6 +341,7 @@
 {
        char    *redirect;
        FILE    *tmpPtr;
+       char    get[80];
=20
        /*
         *  Open an output file if we see '>' or >>'.
@@ -352,10 +353,12 @@
            return(NULL);
        }
        if (redirect[1] =3D=3D '>') {
-           sscanf(redirect, ">> %s", file);
+               snprintf(get, sizeof get, ">> %%%ds", sizeof file-1);
+           sscanf(redirect, get, file);
            tmpPtr =3D fopen(file, "a+");
        } else {
-           sscanf(redirect, "> %s", file);
+               snprintf(get, sizeof get, "> %%%ds", sizeof file-1);
+           sscanf(redirect, get, file);
            tmpPtr =3D fopen(file, "w");
        }
=20

--YiEDa0DAkWCtVeE4
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: 2.6.3ia

iQB1AwUBNfCR4ajZR/ntlUftAQHleQL8CSgokwkGTxTxWSzLNxwXQKPHdYMCLJv+
l/g4NZIPM2OpVlAKVFZDCmcinTFufpOgrE2UhKf2PO53u/tTrdu3yI57XHlSmiSk
7VHHkw94h8QezxBmBKuW90jD6o1YhkB/
=XZCq
-----END PGP SIGNATURE-----

--YiEDa0DAkWCtVeE4--

home help back first fref pref prev next nref lref last post