From owner-freebsd-bugs@FreeBSD.ORG Fri Oct 13 20:50:40 2006 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id F150516A47C for ; Fri, 13 Oct 2006 20:50:40 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id C408743D6E for ; Fri, 13 Oct 2006 20:50:19 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id k9DKoJc7070957 for ; Fri, 13 Oct 2006 20:50:19 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id k9DKoJ9u070956; Fri, 13 Oct 2006 20:50:19 GMT (envelope-from gnats) Resent-Date: Fri, 13 Oct 2006 20:50:19 GMT Resent-Message-Id: <200610132050.k9DKoJ9u070956@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, douglas steinwand Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id B731616A403 for ; Fri, 13 Oct 2006 20:43:16 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [216.136.204.117]) by mx1.FreeBSD.org (Postfix) with ESMTP id 34FEC43DB5 for ; Fri, 13 Oct 2006 20:43:04 +0000 (GMT) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.13.1/8.13.1) with ESMTP id k9DKh3g3055023 for ; Fri, 13 Oct 2006 20:43:03 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.13.1/8.13.1/Submit) id k9DKh3lW055022; Fri, 13 Oct 2006 20:43:03 GMT (envelope-from nobody) Message-Id: <200610132043.k9DKh3lW055022@www.freebsd.org> Date: Fri, 13 Oct 2006 20:43:03 GMT From: douglas steinwand To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.0 Cc: Subject: kern/104389: sys/geom/geom_dump.c doesn't encode XML entities X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Oct 2006 20:50:41 -0000 >Number: 104389 >Category: kern >Synopsis: sys/geom/geom_dump.c doesn't encode XML entities >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Oct 13 20:50:19 GMT 2006 >Closed-Date: >Last-Modified: >Originator: douglas steinwand >Release: 6.2-PRERELEASE >Organization: >Environment: FreeBSD sun-x2100.fx.org 6.2-PRERELEASE FreeBSD 6.2-PRERELEASE #1: Fri Oct 13 07:15:37 PDT 2006 root@sun-x2100.fx.org:/usr/obj/usr/src/sys/HAWK6-SMP amd64 >Description: The sysctl kern.geom.confxml can return invalid XML if, for example, the label has characters that are not safe in XML. This breaks libgeom's geom_xml2tree and utilities that use it, like glabel and gstat. >How-To-Repeat: # glabel list # mdconfig -at swap -s 1m md0 # glabel create bread\&butter /dev/md0 GEOM_LABEL: Label for provider md0 is label/bread&butter. # glabel list Cannot get GEOM tree: Unknown error: -1. # gstat gstat: geom_gettree = -1: Unknown error: 0 >Fix: geom_dump.c should encode XML entities. Attached is a patch. Patch attached with submission follows: --- sys/geom/geom_dump.c.orig Wed Mar 10 00:49:08 2004 +++ sys/geom/geom_dump.c Fri Oct 13 13:04:11 2006 @@ -45,6 +45,43 @@ #include #include +static void +_encode_entities(char *d, size_t dlen, const char *s) +{ + const char *e; + char *t; + + if (dlen < 1) + return; + for(; *s && dlen > 1; s++) { + switch(*s) { + case '&': + e = "&"; + break; + case '<': + e = "<"; + break; + case '>': + e = ">"; + break; + case '\'': + e = "'"; + break; + case '"': + e = """; + break; + default: + *d++ = *s; + dlen--; + continue; + } + for(t = d; *e && dlen >= 1; e++, d++, dlen--) + *d = *e; + if (dlen < 1) + d = t; + } + *d = 0; +} static void g_confdot_consumer(struct sbuf *sb, struct g_consumer *cp) @@ -177,12 +214,14 @@ static void g_conf_provider(struct sbuf *sb, struct g_provider *pp) { + char buf[128]; sbuf_printf(sb, "\t\n", pp); sbuf_printf(sb, "\t \n", pp->geom); sbuf_printf(sb, "\t r%dw%de%d\n", pp->acr, pp->acw, pp->ace); - sbuf_printf(sb, "\t %s\n", pp->name); + _encode_entities(buf, sizeof(buf), pp->name); + sbuf_printf(sb, "\t %s\n", buf); sbuf_printf(sb, "\t %jd\n", (intmax_t)pp->mediasize); sbuf_printf(sb, "\t %u\n", pp->sectorsize); @@ -202,10 +241,12 @@ { struct g_consumer *cp2; struct g_provider *pp2; + char buf[128]; sbuf_printf(sb, " \n", gp); sbuf_printf(sb, " \n", gp->class); - sbuf_printf(sb, " %s\n", gp->name); + _encode_entities(buf, sizeof(buf), gp->name); + sbuf_printf(sb, " %s\n", buf); sbuf_printf(sb, " %d\n", gp->rank); if (gp->flags & G_GEOM_WITHER) sbuf_printf(sb, " \n"); @@ -232,9 +273,11 @@ g_conf_class(struct sbuf *sb, struct g_class *mp, struct g_geom *gp, struct g_provider *pp, struct g_consumer *cp) { struct g_geom *gp2; + char buf[128]; sbuf_printf(sb, " \n", mp); - sbuf_printf(sb, " %s\n", mp->name); + _encode_entities(buf, sizeof(buf), mp->name); + sbuf_printf(sb, " %s\n", buf); LIST_FOREACH(gp2, &mp->geom, geom) { if (gp != NULL && gp != gp2) continue; >Release-Note: >Audit-Trail: >Unformatted: