Commit eb7078be authored by Nikias Bassen's avatar Nikias Bassen

xplist: Properly parse CDATA blocks in get_text_content()

parent 52f3a565
...@@ -468,19 +468,35 @@ static void find_next(parse_ctx ctx, const char *nextchars, int skip_quotes) ...@@ -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) static char* get_text_content(parse_ctx ctx, const char* tag, int skip_ws, int unescape_entities)
{ {
const char *p; const char *p = NULL;
const char *q; const char *q = NULL;
int taglen; int taglen = 0;
char *str; char *str = NULL;
int i = 0; int i = 0;
if (skip_ws) { if (skip_ws) {
parse_skip_ws(ctx); parse_skip_ws(ctx);
} }
p = ctx->pos; p = ctx->pos;
find_char(ctx, '<', 1); if (strncmp(ctx->pos, "<![CDATA[", 9) == 0) {
if (*ctx->pos != '<') { PLIST_XML_ERR("didn't find <\n"); return NULL; } ctx->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; q = ctx->pos;
}
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; } if (ctx->pos >= ctx->end || *ctx->pos != '/') { PLIST_XML_ERR("EOF or empty tag while parsing '%s'\n",p); return NULL; }
ctx->pos++; ctx->pos++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment