Date: Fri, 23 Jul 2010 15:16:19 -0700 (PDT) From: Jeremy Chadwick <freebsd@jdc.parodius.com> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/148881: libdisk emits errors w/ disks that contain spaces in labels Message-ID: <20100723221619.771339B425@icarus.home.lan> Resent-Message-ID: <201007232220.o6NMK6rU006438@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 148881 >Category: bin >Synopsis: libdisk emits errors w/ disks that contain spaces in labels >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Jul 23 22:20:06 UTC 2010 >Closed-Date: >Last-Modified: >Originator: Jeremy Chadwick >Release: FreeBSD 8.1-PRERELEASE amd64 >Organization: >Environment: System: FreeBSD icarus.home.lan 8.1-PRERELEASE FreeBSD 8.1-PRERELEASE #0: Tue Jul 13 05:58:50 PDT 2010 root@icarus.home.lan:/usr/obj/usr/src/sys/X7SBA_RELENG_8_amd64 amd64 >Description: libdisk(3)'s Int_Open_Disk() function makes some bad assumptions about the syntax of the lines come from sysctl kern.geom.conftxt (passed in via sysinstall). Disks, slices, or partitions which have spaces in their label names -- such as FAT-formatted USB flash drives with spaces in their volume name, or anything glabel'd -- will cause libdisk to spit out an error similar to the below. Use of dialog in sysinstall hides portions of the error string: Int_Open_Disk(da1): can't parse length 'V100W' in line 3 (r='V100W') In this situation, the disk da1 was a FAT32-formatted USB flash drive with a volume name of "HP V100W". kern.geom.conftxt showed: 0 DISK da1 4009754624 512 hd 255 sc 63 1 PART da1s1 4009722368 512 i 1 o 32256 ty !12 xs MBR xt 12 2 LABEL msdosfs/HP V100W 4009722368 512 i 0 o 0 >How-To-Repeat: glabel create "some label" /dev/da0s1a sysinstall >Fix: I've spent the past 6-7 hours going over the libdisk(3) code's parser, and determined that (probably) the easiest way to deal with this is to ignore LABEL lines altogether. There is probably a cleaner way to deal with this, such as using libgeom(3) (which I did try but the API is severely lacking in documentation), but this is what I came up with. This should be thoroughly analysed before being considered for commit. Also, I want to point out that the inline comment for "t" assignment doesn't appear to be correct (see above example, re: MBR). This makes me wonder if we have further parser problems in this library (maybe this could explain PR 140972)? --- src/lib/libdisk/open_disk.c.orig 2009-08-03 01:13:06.000000000 -0700 +++ src/lib/libdisk/open_disk.c 2010-07-23 15:09:14.337845551 -0700 @@ -160,6 +160,13 @@ } t = strsep(&p, " "); /* Type {SUN, BSD, MBR, PC98, GPT} */ + /* + * Skip LABEL lines. This solves parsing errors when it + * comes to disks which contain volume labels or glabels + * with spaces, such as FAT-formatted USB flash drives. + */ + if (!strcmp(t, "LABEL")) + continue; n = strsep(&p, " "); /* name */ a = strsep(&p, " "); /* len */ len = strtoimax(a, &r, 0); >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100723221619.771339B425>