kern/104389: [geom] [patch] sys/geom/geom_dump.c doesn't encode XML entities

Jaakko Heinonen jh at FreeBSD.org
Thu Mar 11 15:40:03 UTC 2010


The following reply was made to PR kern/104389; it has been noted by GNATS.

From: Jaakko Heinonen <jh at FreeBSD.org>
To: bug-followup at FreeBSD.org
Cc: dzs-pr at dzs.fx.org
Subject: Re: kern/104389: [geom] [patch] sys/geom/geom_dump.c doesn't
 encode XML entities
Date: Thu, 11 Mar 2010 17:31:50 +0200

 Hi,
 
 I have updated Doug's patch to use a sbuf instead of allocating the
 buffer by hand.
 
 %%%
 Index: sys/geom/geom_dump.c
 ===================================================================
 --- sys/geom/geom_dump.c	(revision 204950)
 +++ sys/geom/geom_dump.c	(working copy)
 @@ -154,6 +154,29 @@ g_conftxt(void *p, int flag)
  
  
  static void
 +g_conf_print_encoded(struct sbuf *sb, const char *fmt, const char *str)
 +{
 +	struct sbuf *s;
 +	const u_char *c;
 +
 +	s = sbuf_new_auto();
 +
 +	for (c = str; *c != '\0'; c++) {
 +		if (*c == '&' || *c == '<' || *c == '>' ||
 +		    *c == '\'' || *c == '"' || *c > 0x7e)
 +			sbuf_printf(s, "&#x%X;", *c);
 +		else if (*c == '\t' || *c == '\n' || *c == '\r' || *c > 0x1f)
 +			sbuf_putc(s, *c);
 +		else
 +			sbuf_putc(s, '?');
 +	}
 +
 +	sbuf_finish(s);
 +	sbuf_printf(sb, fmt, sbuf_data(s));
 +	sbuf_delete(s);
 +}
 +
 +static void
  g_conf_consumer(struct sbuf *sb, struct g_consumer *cp)
  {
  
 @@ -181,7 +204,7 @@ g_conf_provider(struct sbuf *sb, struct 
  	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);
 +	g_conf_print_encoded(sb, "\t  <name>%s</name>\n", pp->name);
  	sbuf_printf(sb, "\t  <mediasize>%jd</mediasize>\n",
  	    (intmax_t)pp->mediasize);
  	sbuf_printf(sb, "\t  <sectorsize>%u</sectorsize>\n", pp->sectorsize);
 @@ -208,7 +231,7 @@ g_conf_geom(struct sbuf *sb, struct g_ge
  
  	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);
 +	g_conf_print_encoded(sb, "      <name>%s</name>\n", gp->name);
  	sbuf_printf(sb, "      <rank>%d</rank>\n", gp->rank);
  	if (gp->flags & G_GEOM_WITHER)
  		sbuf_printf(sb, "      <wither/>\n");
 @@ -237,7 +260,7 @@ g_conf_class(struct sbuf *sb, struct g_c
  	struct g_geom *gp2;
  
  	sbuf_printf(sb, "  <class id=\"%p\">\n", mp);
 -	sbuf_printf(sb, "    <name>%s</name>\n", mp->name);
 +	g_conf_print_encoded(sb, "    <name>%s</name>\n", mp->name);
  	LIST_FOREACH(gp2, &mp->geom, geom) {
  		if (gp != NULL && gp != gp2)
  			continue;
 %%%


More information about the freebsd-geom mailing list