fix buf oflows better
authorderaadt <deraadt@openbsd.org>
Tue, 3 Sep 1996 16:04:55 +0000 (16:04 +0000)
committerderaadt <deraadt@openbsd.org>
Tue, 3 Sep 1996 16:04:55 +0000 (16:04 +0000)
lib/libterm/termcap.c
lib/libtermlib/getterm.c

index 8e11888..3919630 100644 (file)
@@ -80,7 +80,7 @@ tgetent(bp, name)
        char **fname;
        char  *home;
        int    i;
-       char   pathbuf[PBUFSIZ];        /* holds raw path of filenames */
+       char   pathbuf[PBUFSIZ+1];      /* holds raw path of filenames */
        char  *pathvec[PVECSIZ];        /* to point to names in pathbuf */
        char **pvec;                    /* holds usable tail of path vector */
        char  *termpath;
@@ -102,21 +102,25 @@ tgetent(bp, name)
         */
        if (!cp || *cp != '/') {        /* no TERMCAP or it holds an entry */
                if ((termpath = getenv("TERMPATH")) != NULL)
-                       strncpy(pathbuf, termpath, PBUFSIZ);
+                       strncpy(pathbuf, termpath, sizeof(pathbuf) - 1);
                else {
                        if ((home = getenv("HOME")) != NULL) {
                                /* set up default */
-                               strncpy(pathbuf, home, PBUFSIZ - strlen(_PATH_DEF) - 1);        /* $HOME first */
-                               pathbuf[PBUFSIZ - strlen(_PATH_DEF) - 1] = '\0';
+                               /* $HOME first */
+                               strncpy(pathbuf, home, sizeof(pathbuf) - 1 -
+                                   strlen(_PATH_DEF) - 1);
+                               pathbuf[sizeof(pathbuf) - 1 -
+                                   strlen(_PATH_DEF) - 1] = '\0';
                                p += strlen(pathbuf);   /* path, looking in */
                                *p++ = '/';
                        }       /* if no $HOME look in current directory */
-                       strncpy(p, _PATH_DEF, PBUFSIZ - (p - pathbuf));
+                       strncpy(p, _PATH_DEF, sizeof(pathbuf) -1 -
+                           (p - pathbuf));
                }
        }
        else                            /* user-defined name in TERMCAP */
-               strncpy(pathbuf, cp, PBUFSIZ);  /* still can be tokenized */
-       pathbuf[PBUFSIZ] = '\0';
+               strncpy(pathbuf, cp, sizeof(pathbuf) - 1); /* still can be tokenized */
+       pathbuf[sizeof(pathbuf) - 1] = '\0';
 
        *fname++ = pathbuf;     /* tokenize path into vector of names */
        while (*++p)
index 80e8504..f0ea6d8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: getterm.c,v 1.10 1996/09/03 05:11:11 tholo Exp $      */
+/*     $OpenBSD: getterm.c,v 1.11 1996/09/03 16:04:57 deraadt Exp $    */
 
 /*
  * Copyright (c) 1996 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
@@ -31,7 +31,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$OpenBSD: getterm.c,v 1.10 1996/09/03 05:11:11 tholo Exp $";
+static char rcsid[] = "$OpenBSD: getterm.c,v 1.11 1996/09/03 16:04:57 deraadt Exp $";
 #endif
 
 #include <stdlib.h>
@@ -98,21 +98,23 @@ _ti_gettermcap(name)
      */
     if (!cp || *cp != '/') {   /* no TERMCAP or it holds an entry */
        if ((termpath = getenv("TERMPATH")) != NULL)
-           strncpy(pathbuf, termpath, MAXPATHLEN);
+           strncpy(pathbuf, termpath, sizeof(pathbuf)-1);
        else {
            if ((home = getenv("HOME")) != NULL) {
                /* set up default */
-               strncpy(pathbuf, home, MAXPATHLEN - strlen(_PATH_CAPDEF) - 1);  /* $HOME first */
-               pathbuf[MAXPATHLEN - strlen(_PATH_CAPDEF) - 1] = '\0';
+               /* $HOME first */
+               strncpy(pathbuf, home, sizeof(pathbuf) - 1 -
+                   strlen(_PATH_CAPDEF) - 1);
+               pathbuf[sizeof(pathbuf) - 1 - strlen(_PATH_CAPDEF) - 1] = '\0';
                p += strlen(pathbuf);   /* path, looking in */
                *p++ = '/';
            }   /* if no $HOME look in current directory */
-           strncpy(p, _PATH_CAPDEF, MAXPATHLEN - (p - pathbuf));
+           strncpy(p, _PATH_CAPDEF, sizeof(pathbuf) - 1 - (p - pathbuf));
        }
     }
     else                                       /* user-defined name in TERMCAP */
-       strncpy(pathbuf, cp, MAXPATHLEN);       /* still can be tokenized */
-    pathbuf[MAXPATHLEN] = '\0';
+       strncpy(pathbuf, cp, sizeof(pathbuf)-1);        /* still can be tokenized */
+    pathbuf[sizeof(pathbuf)-1] = '\0';
 
     *fname++ = pathbuf;        /* tokenize path into vector of names */
     while (*++p)
@@ -244,18 +246,20 @@ _ti_getterminfo(name)
      * TERMINFO exists.
      */
     if ((termpath = getenv("TERMINFO")) != NULL)
-       strncpy(pathbuf, termpath, MAXPATHLEN);
+       strncpy(pathbuf, termpath, sizeof(pathbuf) - 1);
     else {
        if ((home = getenv("HOME")) != NULL) {
            /* set up default */
+           /* $HOME first */
+           strncpy(pathbuf, home, sizeof(pathbuf) - 1 -
+               strlen(_PATH_INFODEF) - 1);
+           pathbuf[sizeof(pathbuf) - 1 - strlen(_PATH_INFODEF) - 1] = '\0';
            p += strlen(home);  /* path, looking in */
-               strncpy(pathbuf, home, MAXPATHLEN - strlen(_PATH_INFODEF) - 1); /* $HOME first */
-               pathbuf[MAXPATHLEN - strlen(_PATH_INFODEF) - 1] = '\0';
            *p++ = '/';
        }       /* if no $HOME look in current directory */
-       strncpy(p, _PATH_INFODEF, MAXPATHLEN - (p - pathbuf));
+       strncpy(p, _PATH_INFODEF, sizeof(pathbuf) - 1 - (p - pathbuf));
     }
-    pathbuf[MAXPATHLEN] = '\0';
+    pathbuf[sizeof(pathbuf) - 1] = '\0';
 
     *fname++ = pathbuf;        /* tokenize path into vector of names */
     while (*++p)