From eb7078be709b46eaa07792b677c33f64aea66d3a Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Sun, 13 Nov 2016 01:15:34 +0100 Subject: xplist: Properly parse CDATA blocks in get_text_content() --- src/xplist.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/xplist.c b/src/xplist.c index e5ba214..4438236 100644 --- a/src/xplist.c +++ b/src/xplist.c @@ -468,19 +468,35 @@ static void find_next(parse_ctx ctx, const char *nextchars, int skip_quotes) static char* get_text_content(parse_ctx ctx, const char* tag, int skip_ws, int unescape_entities) { - const char *p; - const char *q; - int taglen; - char *str; + const char *p = NULL; + const char *q = NULL; + int taglen = 0; + char *str = NULL; int i = 0; if (skip_ws) { parse_skip_ws(ctx); } p = ctx->pos; - find_char(ctx, '<', 1); - if (*ctx->pos != '<') { PLIST_XML_ERR("didn't find <\n"); return NULL; } - q = ctx->pos; + if (strncmp(ctx->pos, "pos+=9; + p = ctx->pos; + find_str(ctx, "]]>", 0); + if (ctx->pos >= ctx->end || strncmp(ctx->pos, "]]>", 3) != 0) { + PLIST_XML_ERR("EOF while looking for end of CDATA block\n"); + return NULL; + } + q = ctx->pos; + ctx->pos+=3; + } + find_char(ctx, '<', 0); + if (*ctx->pos != '<') { + PLIST_XML_ERR("EOF while looking for closing tag\n"); + return NULL; + } + if (!q) { + q = ctx->pos; + } ctx->pos++; if (ctx->pos >= ctx->end || *ctx->pos != '/') { PLIST_XML_ERR("EOF or empty tag while parsing '%s'\n",p); return NULL; } ctx->pos++; -- cgit v1.1-32-gdbae