From 4f09c01265edb0f7c4cd3f8f205f960277900994 Mon Sep 17 00:00:00 2001 From: Andrej Kacian Date: Fri, 25 Jul 2014 14:45:11 +0200 Subject: [PATCH] RSSyl: Fix Atom parser getting lost within feed/author. --- src/plugins/rssyl/libfeed/parser_atom10.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/plugins/rssyl/libfeed/parser_atom10.c b/src/plugins/rssyl/libfeed/parser_atom10.c index 64a4ffeaa..e758425e1 100644 --- a/src/plugins/rssyl/libfeed/parser_atom10.c +++ b/src/plugins/rssyl/libfeed/parser_atom10.c @@ -51,10 +51,13 @@ void feed_parser_atom10_start(void *data, const gchar *el, const gchar **attr) } else if( ctx->depth == 2 ) { - /* This should only happen with malformed atom feeds - we're in - * XML depth 2, but not inside an block. */ - if (ctx->curitem == NULL) + /* Make sure we are in one of known locations within the XML structure. + * This condition should never be true on a valid Atom feed. */ + if (ctx->location != FEED_LOC_ATOM10_AUTHOR && + ctx->location != FEED_LOC_ATOM10_ENTRY) { + ctx->depth++; return; + } if( !strcmp(el, "author") ) { /* Start of author info for current feed item. @@ -101,11 +104,13 @@ void feed_parser_atom10_end(void *data, const gchar *el) else text = ""; - ctx->depth--; - switch( ctx->depth ) { case 0: + /* Just in case. */ + break; + + case 1: if( !strcmp(el, "feed") ) { /* We have finished parsing the feed, reverse the list @@ -115,7 +120,7 @@ void feed_parser_atom10_end(void *data, const gchar *el) break; - case 1: + case 2: /* decide if we just received , so we can * add a complete item to feed */ @@ -142,7 +147,7 @@ void feed_parser_atom10_end(void *data, const gchar *el) break; - case 2: + case 3: if( ctx->curitem == NULL ) break; @@ -189,7 +194,7 @@ void feed_parser_atom10_end(void *data, const gchar *el) break; - case 3: + case 4: if( ctx->curitem == NULL ) break; @@ -234,4 +239,6 @@ void feed_parser_atom10_end(void *data, const gchar *el) ctx->str = NULL; } ctx->str = NULL; + + ctx->depth--; } -- 2.25.1