Csh has a section of code where it NUL terminates after a strlcpy().
Strlcpy() may read past what readlink() wrote since readlink() does
not append a NUL.


Index: bin/csh/dir.c
===================================================================
RCS file: /cvs/src/bin/csh/dir.c,v
retrieving revision 1.14
diff -u -p -d -r1.14 dir.c
--- bin/csh/dir.c       27 Oct 2009 23:59:21 -0000      1.14
+++ bin/csh/dir.c       11 Jul 2014 06:04:23 -0000
@@ -760,8 +760,8 @@ dcanon(Char *cp, Char *p)
                !adrof(STRignore_symlinks) &&
                (cc = readlink(short2str(cp), tlink,
                               sizeof tlink-1)) >= 0) {
+               tlink[cc] = '\0';
                (void) Strlcpy(link, str2short(tlink), sizeof 
link/sizeof(Char));
-               link[cc] = '\0';
 
                /*
                 * restore the '/'.
Index: bin/pax/ftree.c
===================================================================
RCS file: /cvs/src/bin/pax/ftree.c,v
retrieving revision 1.31
diff -u -p -d -r1.31 ftree.c
--- bin/pax/ftree.c     24 May 2014 18:51:00 -0000      1.31
+++ bin/pax/ftree.c     11 Jul 2014 06:04:23 -0000
@@ -477,7 +477,7 @@ next_file(ARCHD *arcn)
                        }
                        /*
                         * set link name length, watch out readlink does not
-                        * always NUL terminate the link path
+                        * NUL terminate the link path
                         */
                        arcn->ln_name[cnt] = '\0';
                        arcn->ln_nlen = cnt;

Reply via email to