Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/sysinst Relax restrictions on packnames, as disklab...



details:   https://anonhg.NetBSD.org/src/rev/bc80de33895c
branches:  trunk
changeset: 465922:bc80de33895c
user:      martin <martin%NetBSD.org@localhost>
date:      Sat Dec 07 13:33:45 2019 +0000

description:
Relax restrictions on packnames, as disklabel(8) does not do full decoding
for the tag field.
Fix quoting of command args.

diffstat:

 usr.sbin/sysinst/disklabel.c |  38 ++++++++++++++++++++++++++------------
 1 files changed, 26 insertions(+), 12 deletions(-)

diffs (85 lines):

diff -r 5182ae6fa34e -r bc80de33895c usr.sbin/sysinst/disklabel.c
--- a/usr.sbin/sysinst/disklabel.c      Sat Dec 07 13:31:41 2019 +0000
+++ b/usr.sbin/sysinst/disklabel.c      Sat Dec 07 13:33:45 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: disklabel.c,v 1.16 2019/12/06 19:36:22 martin Exp $    */
+/*     $NetBSD: disklabel.c,v 1.17 2019/12/07 13:33:45 martin Exp $    */
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -262,13 +262,32 @@
        return &parts->dp;
 }
 
+/*
+ * Escape a string for usage as a tag name in a capfile(5),
+ * we really know there is enough space in the destination buffer...
+ */
+static void
+escape_capfile(char *dest, const char *src, size_t len)
+{
+       while (*src && len > 0) {
+               if (*src == ':')
+                       *dest++ = ' ';
+               else
+                       *dest++ = *src;
+               src++;
+               len--;
+       }
+       *dest = 0;
+}
+
 static bool
 disklabel_write_to_disk(struct disk_partitions *arg)
 {
        struct disklabel_disk_partitions *parts =
            (struct disklabel_disk_partitions*)arg;
        FILE *f;
-       char fname[PATH_MAX], packname[sizeof(parts->l.d_packname)+1];
+       char fname[PATH_MAX], packname[sizeof(parts->l.d_packname)+1],
+           disktype[sizeof(parts->l.d_typename)+1];
        int i, rv = 0;
        const char *disk = parts->dp.disk, *s;
        const struct partition *lp;
@@ -295,19 +314,14 @@
                        *d = *s;
                }
        }
-       parts->l.d_typename[sizeof(parts->l.d_typename)-1] = 0;
-       for (d = parts->l.d_typename; *d; d++) {
-               if (isalnum((unsigned char)*d) || *d == '-')
-                       continue;
-               *d = 0;
-               break;
-       }
 
        /* we need a valid disk type name, so enforce an arbitrary if
         * above did not yield a usable one */
        if (strlen(parts->l.d_typename) == 0)
                strncpy(parts->l.d_typename, "SCSI",
                    sizeof(parts->l.d_typename));
+       escape_capfile(disktype, parts->l.d_typename,
+           sizeof(parts->l.d_typename));
 
        sprintf(fname, "/tmp/disklabel.%u", getpid());
        f = fopen(fname, "w");
@@ -317,7 +331,7 @@
        lp = parts->l.d_partitions;
        scripting_fprintf(NULL, "cat <<EOF >%s\n", fname);
        scripting_fprintf(f, "%s|NetBSD installation generated:\\\n",
-           parts->l.d_typename);
+           disktype);
        scripting_fprintf(f, "\t:nc#%d:nt#%d:ns#%d:\\\n",
            parts->l.d_ncylinders, parts->l.d_ntracks, parts->l.d_nsectors);
        scripting_fprintf(f, "\t:sc#%d:su#%" PRIu32 ":\\\n",
@@ -359,8 +373,8 @@
         */
 #ifdef DISKLABEL_CMD
        /* disklabel the disk */
-       rv = run_program(RUN_DISPLAY, "%s -f %s %s %s %s",
-           DISKLABEL_CMD, fname, disk, parts->l.d_typename, packname);
+       rv = run_program(RUN_DISPLAY, "%s -f %s %s '%s' '%s'",
+           DISKLABEL_CMD, fname, disk, disktype, packname);
 #endif
 
        unlink(fname);



Home | Main Index | Thread Index | Old Index