Date: Thu, 11 Mar 2010 15:40:03 GMT From: Jaakko Heinonen <jh@FreeBSD.org> To: freebsd-geom@FreeBSD.org Subject: Re: kern/104389: [geom] [patch] sys/geom/geom_dump.c doesn't encode XML entities Message-ID: <201003111540.o2BFe35v033069@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: Jaakko Heinonen <jh@FreeBSD.org> To: bug-followup@FreeBSD.org Cc: dzs-pr@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; %%%
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003111540.o2BFe35v033069>