Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Oct 2006 20:30:24 GMT
From:      douglas steinwand <dzs-pr@dzs.fx.org>
To:        freebsd-geom@FreeBSD.org
Subject:   Re: kern/104389: sys/geom/geom_dump.c doesn't encode XML entities
Message-ID:  <200610152030.k9FKUOGa045164@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/104389; it has been noted by GNATS.

From: douglas steinwand <dzs-pr@dzs.fx.org>
To: Poul-Henning Kamp <phk@phk.freebsd.dk>
Cc: douglas steinwand <dzs-pr@dzs.fx.org>, freebsd-gnats-submit@FreeBSD.org
Subject: Re: kern/104389: sys/geom/geom_dump.c doesn't encode XML entities
Date: Sun, 15 Oct 2006 13:20:41 -0700

 --BXVAT5kNtrzKuDFl
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 * Poul-Henning Kamp <phk@phk.freebsd.dk> [2006-10-15 18:12:56 +0000]:
 > I'm not keep on the encoding, and would be inclined to say
 > "Don't use such names then", but I can probably be convinced
 > that this is actually a good idea if sensible examples are shown.
 
 I encountered this issue thanks to a CD from Sun Microsystems:
 
 # glabel status
                       Name  Status  Components
 iso9660/tools_&_driver_1.0     N/A  acd0
 
 The label on its ISO9660 filesystem has "&", which must be encoded
 in XML.
 
 > The other thing is that in the patch, the _encode_entities()
 > function should not have a leading underscore and should
 > take arguments:
 > 
 > 	static void
 > 	encode_entities(struct sbuf *sb, const char *fmt,
 > 	    const char *str, int len);
 
 My initial patch was just a quick hack to work around the problem.
 I didn't know how FreeBSD's developers wanted to address it. For
 example, if XML will be used widely in the kernel, should a new
 format code for kvprintf() do this XML encoding?
 
 > So that usage would not need a randomsized local buffer and
 > double enveloping of the call:
 > 
 > >-	sbuf_printf(sb, "\t  <name>%s</name>\n", pp->name);
 > 
 > Should be:
 > 
 > 	encode_entities(sb, "\t  <name>%s</name>\n", pp->name, -1);
 > 
 > (-1 for len means "use strlen")
 
 Attached is a new patch for geom_dump.c which follows your
 recommendations.
 
 Thanks,
  - doug
 
 --BXVAT5kNtrzKuDFl
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename=patch-geom_dump
 
 --- sys/geom/geom_dump.c.orig	Wed Mar 10 00:49:08 2004
 +++ sys/geom/geom_dump.c	Sun Oct 15 12:53:42 2006
 @@ -45,6 +45,47 @@
  #include <geom/geom.h>
  #include <geom/geom_int.h>
  
 +static void
 +encode_entities(struct sbuf *sb, const char *fmt, const char *str, int len)
 +{
 +	char *d, *dst;
 +	const char *e;
 +	int i;
 +
 +	if (len == -1)
 +		len = strlen(str);
 +	/* Assume worst case expansion. */
 +	dst = d = g_malloc(len * 6 + 1, M_WAITOK); 
 +
 +	for(i = 0; i < len; i++) {
 +		switch(str[i]) {
 +		case '&':
 +			e = "&amp;";
 +			break;
 +		case '<':
 +			e = "&lt;";
 +			break;
 +		case '>':
 +			e = "&gt;";
 +			break;
 +		case '\'':
 +			e = "&apos;";
 +			break;
 +		case '"':
 +			e = "&quot;";
 +			break;
 +		default:
 +			*d++ = str[i];
 +			continue;
 +		}
 +		while(*e != '\0')
 +			*d++ = *e++;
 +	}
 +	*d = '\0';
 +
 +	sbuf_printf(sb, fmt, dst);
 +	g_free(dst);
 +}
  
  static void
  g_confdot_consumer(struct sbuf *sb, struct g_consumer *cp)
 @@ -182,7 +223,7 @@
  	sbuf_printf(sb, "\t  <geom ref=\"%p\"/>\n", pp->geom);
  	sbuf_printf(sb, "\t  <mode>r%dw%de%d</mode>\n",
  	    pp->acr, pp->acw, pp->ace);
 -	sbuf_printf(sb, "\t  <name>%s</name>\n", pp->name);
 +	encode_entities(sb, "\t  <name>%s</name>\n", pp->name, -1);
  	sbuf_printf(sb, "\t  <mediasize>%jd</mediasize>\n",
  	    (intmax_t)pp->mediasize);
  	sbuf_printf(sb, "\t  <sectorsize>%u</sectorsize>\n", pp->sectorsize);
 @@ -205,7 +246,7 @@
  
  	sbuf_printf(sb, "    <geom id=\"%p\">\n", gp);
  	sbuf_printf(sb, "      <class ref=\"%p\"/>\n", gp->class);
 -	sbuf_printf(sb, "      <name>%s</name>\n", gp->name);
 +	encode_entities(sb, "      <name>%s</name>\n", gp->name, -1);
  	sbuf_printf(sb, "      <rank>%d</rank>\n", gp->rank);
  	if (gp->flags & G_GEOM_WITHER)
  		sbuf_printf(sb, "      <wither/>\n");
 @@ -234,7 +275,7 @@
  	struct g_geom *gp2;
  
  	sbuf_printf(sb, "  <class id=\"%p\">\n", mp);
 -	sbuf_printf(sb, "    <name>%s</name>\n", mp->name);
 +	encode_entities(sb, "    <name>%s</name>\n", mp->name, -1);
  	LIST_FOREACH(gp2, &mp->geom, geom) {
  		if (gp != NULL && gp != gp2)
  			continue;
 
 --BXVAT5kNtrzKuDFl--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610152030.k9FKUOGa045164>