Author: benno
Date: Fri Aug 25 16:10:16 2017
New Revision: 322894
URL: https://svnweb.freebsd.org/changeset/base/322894

Log:
  Replace makefs' hand-rolled unescaping with strunvis
  
  mtree path names and link attributes are encoded, generally using strvis. 
Newer
  versions of mtree will use C-style escapes but previously the accepted form 
was
  octal escapes. makefs' mtree code spots the C-style escapes but fails to deal
  with octal escapes correctly.
  
  Remove mtree's escape-decoding code (except for a few instances where it's
  needed) and instead pass pathnames and link targets through strunvis prior to
  use.
  
  Reviewed by:  marcel
  MFC after:    2 weeks
  Sponsored by: Dell EMC Isilon
  Differential Revision:        https://reviews.freebsd.org/D12104

Modified:
  head/usr.sbin/makefs/mtree.c

Modified: head/usr.sbin/makefs/mtree.c
==============================================================================
--- head/usr.sbin/makefs/mtree.c        Fri Aug 25 15:31:55 2017        
(r322893)
+++ head/usr.sbin/makefs/mtree.c        Fri Aug 25 16:10:16 2017        
(r322894)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
 #include <time.h>
 #include <unistd.h>
 #include <util.h>
+#include <vis.h>
 
 #include "makefs.h"
 
@@ -355,8 +356,6 @@ read_word(FILE *fp, char *buf, size_t bufsz)
                        break;
                case '\\':
                        esc++;
-                       if (esc == 1)
-                               continue;
                        break;
                case '`':
                case '\'':
@@ -401,34 +400,10 @@ read_word(FILE *fp, char *buf, size_t bufsz)
                                fi->line++;
                        }
                        break;
-               case 'a':
+               default:
                        if (esc)
-                               c = '\a';
+                               buf[idx++] = '\\';
                        break;
-               case 'b':
-                       if (esc)
-                               c = '\b';
-                       break;
-               case 'f':
-                       if (esc)
-                               c = '\f';
-                       break;
-               case 'n':
-                       if (esc)
-                               c = '\n';
-                       break;
-               case 'r':
-                       if (esc)
-                               c = '\r';
-                       break;
-               case 't':
-                       if (esc)
-                               c = '\t';
-                       break;
-               case 'v':
-                       if (esc)
-                               c = '\v';
-                       break;
                }
                buf[idx++] = c;
                esc = 0;
@@ -591,7 +566,15 @@ read_mtree_keywords(FILE *fp, fsnode *node)
                                        error = ENOATTR;
                                        break;
                                }
-                               node->symlink = estrdup(value);
+                               node->symlink = emalloc(strlen(value) + 1);
+                               if (node->symlink == NULL) {
+                                       error = errno;
+                                       break;
+                               }
+                               if (strunvis(node->symlink, value) < 0) {
+                                       error = errno;
+                                       break;
+                               }
                        } else
                                error = ENOSYS;
                        break;
@@ -971,13 +954,18 @@ read_mtree_spec1(FILE *fp, bool def, const char *name)
 static int
 read_mtree_spec(FILE *fp)
 {
-       char pathspec[PATH_MAX];
+       char pathspec[PATH_MAX], pathtmp[4*PATH_MAX + 1];
        char *cp;
        int error;
 
-       error = read_word(fp, pathspec, sizeof(pathspec));
+       error = read_word(fp, pathtmp, sizeof(pathtmp));
        if (error)
                goto out;
+       if (strnunvis(pathspec, PATH_MAX, pathtmp) == -1) {
+               error = errno;
+               goto out;
+       }
+       error = 0;
 
        cp = strchr(pathspec, '/');
        if (cp != NULL) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to