diff --git a/.cvsignore b/.cvsignore index 454188f..116c771 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1 @@ -totem-pl-parser-2.28.1.tar.bz2 +totem-pl-parser-2.28.2.tar.bz2 diff --git a/reentrant.patch b/reentrant.patch deleted file mode 100644 index 8759092..0000000 --- a/reentrant.patch +++ /dev/null @@ -1,626 +0,0 @@ -only in patch2: -unchanged: ---- totem-pl-parser-2.28.1.orig/plparse/xmllexer.h -+++ totem-pl-parser-2.28.1/plparse/xmllexer.h -@@ -51,9 +51,26 @@ - #define T_CDATA_STOP 19 /* ]]> */ - - -+/* public structures */ -+struct lexer -+{ -+ const char * lexbuf; -+ int lexbuf_size; -+ int lexbuf_pos; -+ int in_comment; -+ char * lex_malloc; -+ enum { -+ NORMAL, -+ DATA, -+ CDATA, -+ } lex_mode; -+}; -+ -+ - /* public functions */ --void lexer_init(const char * buf, int size) XINE_PROTECTED; --int lexer_get_token(char * tok, int tok_size) XINE_PROTECTED; -+struct lexer *lexer_init(const char * buf, int size) XINE_PROTECTED; -+void lexer_finalize(struct lexer * lexer) XINE_PROTECTED; -+int lexer_get_token(struct lexer * lexer, char * tok, int tok_size) XINE_PROTECTED; - char *lexer_decode_entities (const char *tok) XINE_PROTECTED; - - #endif -only in patch2: -unchanged: ---- totem-pl-parser-2.28.1.orig/plparse/xmlparser.c -+++ totem-pl-parser-2.28.1/plparse/xmlparser.c -@@ -51,9 +51,6 @@ - #define DATA_SIZE 64 * 1024 - #define MAX_RECURSION 23 - --/* private global variables */ --static int xml_parser_mode; -- - /* private functions */ - - static char * strtoupper(char * str) { -@@ -103,10 +100,17 @@ - free(property); - } - --void xml_parser_init(const char * buf, int size, int mode) { -+xml_parser_t *xml_parser_init(const char * buf, int size, int mode) { -+ xml_parser_t *xml_parser = malloc(sizeof(xml_parser_t)); -+ xml_parser->lexer = lexer_init(buf, size); -+ xml_parser->mode = mode; -+ return xml_parser; -+} - -- lexer_init(buf, size); -- xml_parser_mode = mode; -+void xml_parser_finalize(xml_parser_t *xml_parser) -+{ -+ lexer_finalize(xml_parser->lexer); -+ free(xml_parser); - } - - static void xml_parser_free_props(xml_property_t *current_property) { -@@ -220,7 +224,7 @@ - - #define Q_STATE(CURRENT,NEW) (STATE_##NEW + state - STATE_##CURRENT) - --static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_names[], int rec, int flags) -+static int xml_parser_get_node_internal (xml_parser_t *xml_parser, xml_node_t *current_node, char *root_names[], int rec, int flags) - { - char tok[TOKEN_SIZE]; - char property_name[TOKEN_SIZE]; -@@ -239,7 +243,7 @@ - - memset (tok, 0, TOKEN_SIZE); - -- while ((bypass_get_token) || (res = lexer_get_token(tok, TOKEN_SIZE)) != T_ERROR) { -+ while ((bypass_get_token) || (res = lexer_get_token(xml_parser->lexer, tok, TOKEN_SIZE)) != T_ERROR) { - bypass_get_token = 0; - lprintf("info: %d - %d : '%s'\n", state, res, tok); - -@@ -295,7 +299,7 @@ - current_property = NULL; - - /* save node name */ -- if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) { -+ if (xml_parser->mode == XML_PARSER_CASE_INSENSITIVE) { - strtoupper(tok); - } - if (state == STATE_Q_NODE) { -@@ -331,7 +335,7 @@ - subtree->props = properties; - lprintf("info: rec %d new subtree %s\n", rec, node_name); - root_names[rec + 1] = node_name; -- parse_res = xml_parser_get_node_internal(subtree, root_names, rec + 1, flags); -+ parse_res = xml_parser_get_node_internal(xml_parser, subtree, root_names, rec + 1, flags); - if (parse_res == -1 || parse_res > 0) { - return parse_res; - } -@@ -374,7 +378,7 @@ - case (T_IDENT): - /* save property name */ - new_prop: -- if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) { -+ if (xml_parser->mode == XML_PARSER_CASE_INSENSITIVE) { - strtoupper(tok); - } - strcpy(property_name, tok); -@@ -409,7 +413,7 @@ - switch (res) { - case (T_IDENT): - /* must be equal to root_name */ -- if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) { -+ if (xml_parser->mode == XML_PARSER_CASE_INSENSITIVE) { - strtoupper(tok); - } - if (strcmp(tok, root_names[rec]) == 0) { -@@ -621,19 +625,19 @@ - } - } - --static int xml_parser_get_node (xml_node_t *current_node, int flags) -+static int xml_parser_get_node (xml_parser_t *xml_parser, xml_node_t *current_node, int flags) - { - char *root_names[MAX_RECURSION + 1]; - root_names[0] = ""; -- return xml_parser_get_node_internal (current_node, root_names, 0, flags); -+ return xml_parser_get_node_internal (xml_parser, current_node, root_names, 0, flags); - } - --int xml_parser_build_tree_with_options(xml_node_t **root_node, int flags) { -+int xml_parser_build_tree_with_options(xml_parser_t *xml_parser, xml_node_t **root_node, int flags) { - xml_node_t *tmp_node, *pri_node, *q_node; - int res; - - tmp_node = new_xml_node(); -- res = xml_parser_get_node(tmp_node, flags); -+ res = xml_parser_get_node(xml_parser, tmp_node, flags); - - /* delete any top-level [CDATA] nodes */; - pri_node = tmp_node->child; -@@ -676,8 +680,8 @@ - return res; - } - --int xml_parser_build_tree(xml_node_t **root_node) { -- return xml_parser_build_tree_with_options (root_node, 0); -+int xml_parser_build_tree(xml_parser_t *xml_parser, xml_node_t **root_node) { -+ return xml_parser_build_tree_with_options (xml_parser, root_node, 0); - } - - const char *xml_parser_get_property (const xml_node_t *node, const char *name) { -only in patch2: -unchanged: ---- totem-pl-parser-2.28.1.orig/plparse/totem-pl-parser.c -+++ totem-pl-parser-2.28.1/plparse/totem-pl-parser.c -@@ -1676,11 +1676,16 @@ - xml_node_t* doc, *node; - char *encoding, *new_contents; - gsize new_size; -+ xml_parser_t *xml_parser; - - totem_pl_parser_cleanup_xml (contents); -- xml_parser_init (contents, size, XML_PARSER_CASE_INSENSITIVE); -- if (xml_parser_build_tree_with_options (&doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) -+ xml_parser = xml_parser_init (contents, size, XML_PARSER_CASE_INSENSITIVE); -+ if (xml_parser_build_tree_with_options (xml_parser, &doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) { -+ xml_parser_finalize (xml_parser); - return NULL; -+ } -+ -+ xml_parser_finalize (xml_parser); - - encoding = NULL; - for (node = doc; node != NULL; node = node->next) { -@@ -1705,12 +1710,14 @@ - } - g_free (encoding); - -- xml_parser_init (new_contents, new_size, XML_PARSER_CASE_INSENSITIVE); -- if (xml_parser_build_tree_with_options (&doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) { -+ xml_parser = xml_parser_init (new_contents, new_size, XML_PARSER_CASE_INSENSITIVE); -+ if (xml_parser_build_tree_with_options (xml_parser, &doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) { -+ xml_parser_finalize (xml_parser); - g_free (new_contents); - return NULL; - } - -+ xml_parser_finalize (xml_parser); - g_free (new_contents); - - return doc; -only in patch2: -unchanged: ---- totem-pl-parser-2.28.1.orig/plparse/xmlparser.h -+++ totem-pl-parser-2.28.1/plparse/xmlparser.h -@@ -65,10 +65,16 @@ - struct xml_node_s *next; - } xml_node_t; - --void xml_parser_init(const char * buf, int size, int mode) XINE_PROTECTED; -+typedef struct xml_parser_s { -+ struct lexer *lexer; -+ int mode; -+} xml_parser_t; - --int xml_parser_build_tree(xml_node_t **root_node) XINE_PROTECTED; --int xml_parser_build_tree_with_options(xml_node_t **root_node, int flags) XINE_PROTECTED; -+xml_parser_t *xml_parser_init(const char * buf, int size, int mode) XINE_PROTECTED; -+void xml_parser_finalize(xml_parser_t *xml_parser) XINE_PROTECTED; -+ -+int xml_parser_build_tree(xml_parser_t *xml_parser, xml_node_t **root_node) XINE_PROTECTED; -+int xml_parser_build_tree_with_options(xml_parser_t *xml_parser, xml_node_t **root_node, int flags) XINE_PROTECTED; - - void xml_parser_free_tree(xml_node_t *root_node) XINE_PROTECTED; - -only in patch2: -unchanged: ---- totem-pl-parser-2.28.1.orig/plparse/xmllexer.c -+++ totem-pl-parser-2.28.1/plparse/xmllexer.c -@@ -44,16 +44,9 @@ - - /* private constants*/ - --/* private global variables */ --static const char * lexbuf; --static int lexbuf_size = 0; --static int lexbuf_pos = 0; --static int in_comment = 0; --static char *lex_malloc = NULL; -- - enum utf { UTF32BE, UTF32LE, UTF16BE, UTF16LE }; - --static void lex_convert (const char * buf, int size, enum utf utf) -+static void lex_convert (struct lexer * lexer, const char * buf, int size, enum utf utf) - { - char *utf8 = malloc (size * (utf >= UTF16BE ? 3 : 6) + 1); - char *bp = utf8; -@@ -85,45 +78,44 @@ - } - } - *bp = 0; -- lexbuf_size = bp - utf8; -- lexbuf = lex_malloc = realloc (utf8, lexbuf_size + 1); -+ lexer->lexbuf_size = bp - utf8; -+ lexer->lexbuf = lexer->lex_malloc = realloc (utf8, lexer->lexbuf_size + 1); - } - --static enum { -- NORMAL, -- DATA, -- CDATA, --} lex_mode = NORMAL; -- --void lexer_init(const char * buf, int size) { -+struct lexer *lexer_init(const char * buf, int size) { - static const char boms[] = { 0xFF, 0xFE, 0, 0, 0xFE, 0xFF }, - bom_utf8[] = { 0xEF, 0xBB, 0xBF }; -+ struct lexer * lexer = calloc (1, sizeof (*lexer)); - -- free (lex_malloc); -- lex_malloc = NULL; -- -- lexbuf = buf; -- lexbuf_size = size; -+ lexer->lexbuf = buf; -+ lexer->lexbuf_size = size; - - if (size >= 4 && !memcmp (buf, boms + 2, 4)) -- lex_convert (buf + 4, size - 4, UTF32BE); -+ lex_convert (lexer, buf + 4, size - 4, UTF32BE); - else if (size >= 4 && !memcmp (buf, boms, 4)) -- lex_convert (buf + 4, size - 4, UTF32LE); -+ lex_convert (lexer, buf + 4, size - 4, UTF32LE); - else if (size >= 3 && !memcmp (buf, bom_utf8, 3)) - { -- lexbuf += 3; -- lexbuf_size -= 3; -+ lexer->lexbuf += 3; -+ lexer->lexbuf_size -= 3; - } - else if (size >= 2 && !memcmp (buf, boms + 4, 2)) -- lex_convert (buf + 2, size - 2, UTF16BE); -+ lex_convert (lexer, buf + 2, size - 2, UTF16BE); - else if (size >= 2 && !memcmp (buf, boms, 2)) -- lex_convert (buf + 2, size - 2, UTF16LE); -+ lex_convert (lexer, buf + 2, size - 2, UTF16LE); - -- lexbuf_pos = 0; -- lex_mode = NORMAL; -- in_comment = 0; -+ lexer->lexbuf_pos = 0; -+ lexer->lex_mode = NORMAL; -+ lexer->in_comment = 0; - - lprintf("buffer length %d\n", size); -+ return lexer; -+} -+ -+void lexer_finalize(struct lexer * lexer) -+{ -+ free (lexer->lex_malloc); -+ free (lexer); - } - - typedef enum { -@@ -144,17 +136,17 @@ - STATE_IDENT /* must be last */ - } lexer_state_t; - --int lexer_get_token(char * tok, int tok_size) { -+int lexer_get_token(struct lexer * lexer, char * tok, int tok_size) { - int tok_pos = 0; - lexer_state_t state = STATE_IDLE; - char c; - - if (tok) { -- while ((tok_pos < tok_size) && (lexbuf_pos < lexbuf_size)) { -- c = lexbuf[lexbuf_pos]; -- lprintf("c=%c, state=%d, lex_mode=%d, in_comment=%d\n", c, state, lex_mode, in_comment); -+ while ((tok_pos < tok_size) && (lexer->lexbuf_pos < lexer->lexbuf_size)) { -+ c = lexer->lexbuf[lexer->lexbuf_pos]; -+ lprintf("c=%c, state=%d, lex_mode=%d, lexer->in_comment=%d\n", c, state, lexer->lex_mode, lexer->in_comment); - -- switch (lex_mode) { -+ switch (lexer->lex_mode) { - case NORMAL: - switch (state) { - /* init state */ -@@ -187,7 +179,7 @@ - break; - - case '/': -- if (!in_comment) -+ if (!lexer->in_comment) - state = STATE_T_M_STOP_2; - tok[tok_pos] = c; - tok_pos++; -@@ -214,7 +206,7 @@ - break; - - case '?': -- if (!in_comment) -+ if (!lexer->in_comment) - state = STATE_T_TI_STOP; - tok[tok_pos] = c; - tok_pos++; -@@ -226,14 +218,14 @@ - tok_pos++; - break; - } -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - break; - - /* end of line */ - case STATE_EOL: - if (c == '\n' || (c == '\r')) { - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok_pos++; - } else { - tok[tok_pos] = '\0'; -@@ -245,7 +237,7 @@ - case STATE_SEPAR: - if (c == ' ' || (c == '\t')) { - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok_pos++; - } else { - tok[tok_pos] = '\0'; -@@ -258,20 +250,20 @@ - switch (c) { - case '/': - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok_pos++; /* FIXME */ - tok[tok_pos] = '\0'; - return T_M_START_2; - break; - case '!': - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok_pos++; - state = STATE_T_COMMENT; - break; - case '?': - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok_pos++; /* FIXME */ - tok[tok_pos] = '\0'; - return T_TI_START; -@@ -285,8 +277,8 @@ - /* T_M_STOP_1 */ - case STATE_T_M_STOP_1: - tok[tok_pos] = '\0'; -- if (!in_comment) -- lex_mode = DATA; -+ if (!lexer->in_comment) -+ lexer->lex_mode = DATA; - return T_M_STOP_1; - break; - -@@ -294,11 +286,11 @@ - case STATE_T_M_STOP_2: - if (c == '>') { - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok_pos++; /* FIXME */ - tok[tok_pos] = '\0'; -- if (!in_comment) -- lex_mode = DATA; -+ if (!lexer->in_comment) -+ lexer->lex_mode = DATA; - return T_M_STOP_2; - } else { - tok[tok_pos] = '\0'; -@@ -315,7 +307,7 @@ - /* T_STRING */ - case STATE_T_STRING_DOUBLE: - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - if (c == '\"') { /* " */ - tok[tok_pos] = '\0'; /* FIXME */ - return T_STRING; -@@ -327,33 +319,33 @@ - case STATE_T_COMMENT: - switch (c) { - case '-': -- lexbuf_pos++; -- if (lexbuf[lexbuf_pos] == '-') -+ lexer->lexbuf_pos++; -+ if (lexer->lexbuf[lexer->lexbuf_pos] == '-') - { -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok[tok_pos++] = '-'; /* FIXME */ - tok[tok_pos++] = '-'; - tok[tok_pos] = '\0'; -- in_comment = 1; -+ lexer->in_comment = 1; - return T_C_START; - } - break; - case 'D': -- lexbuf_pos++; -- if (strncmp(lexbuf + lexbuf_pos, "OCTYPE", 6) == 0) { -+ lexer->lexbuf_pos++; -+ if (strncmp(lexer->lexbuf + lexer->lexbuf_pos, "OCTYPE", 6) == 0) { - strncpy(tok + tok_pos, "DOCTYPE", 7); /* FIXME */ -- lexbuf_pos += 6; -+ lexer->lexbuf_pos += 6; - return T_DOCTYPE_START; - } else { - return T_ERROR; - } - break; - case '[': -- lexbuf_pos++; -- if (strncmp(lexbuf + lexbuf_pos, "CDATA[", 6) == 0) { -+ lexer->lexbuf_pos++; -+ if (strncmp(lexer->lexbuf + lexer->lexbuf_pos, "CDATA[", 6) == 0) { - strncpy (tok + tok_pos, "[CDATA[", 7); /* FIXME */ -- lexbuf_pos += 6; -- lex_mode = CDATA; -+ lexer->lexbuf_pos += 6; -+ lexer->lex_mode = CDATA; - return T_CDATA_START; - } else{ - return T_ERROR; -@@ -369,11 +361,11 @@ - case STATE_T_TI_STOP: - if (c == '>') { - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok_pos++; /* FIXME */ - tok[tok_pos] = '\0'; -- if (!in_comment) -- lex_mode = DATA; -+ if (!lexer->in_comment) -+ lexer->lex_mode = DATA; - return T_TI_STOP; - } else { - tok[tok_pos] = '\0'; -@@ -387,13 +379,13 @@ - case '-': - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - state = STATE_T_C_STOP; - break; - default: - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - state = STATE_IDENT; - } - break; -@@ -404,21 +396,21 @@ - case '>': - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - tok[tok_pos] = '\0'; /* FIX ME */ - if (strlen(tok) != 3) { - tok[tok_pos - 3] = '\0'; -- lexbuf_pos -= 3; -+ lexer->lexbuf_pos -= 3; - return T_IDENT; - } else { -- in_comment = 0; -+ lexer->in_comment = 0; - return T_C_STOP; - } - break; - default: - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - state = STATE_IDENT; - } - break; -@@ -426,7 +418,7 @@ - /* T_STRING (single quotes) */ - case STATE_T_STRING_SINGLE: - tok[tok_pos] = c; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - if (c == '\'') { /* " */ - tok[tok_pos] = '\0'; /* FIXME */ - return T_STRING; -@@ -453,19 +445,19 @@ - case '?': - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - state = STATE_T_TI_STOP; - break; - case '-': - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - state = STATE_T_DASHDASH; - break; - default: - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - } - break; - default: -@@ -479,12 +471,12 @@ - { - case '<': - tok[tok_pos] = '\0'; -- lex_mode = NORMAL; -+ lexer->lex_mode = NORMAL; - return T_DATA; - default: - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - } - break; - -@@ -492,32 +484,32 @@ - switch (c) - { - case ']': -- if (strncmp(lexbuf + lexbuf_pos, "]]>", 3) == 0) { -- lexbuf_pos += 3; -- lex_mode = DATA; -+ if (strncmp(lexer->lexbuf + lexer->lexbuf_pos, "]]>", 3) == 0) { -+ lexer->lexbuf_pos += 3; -+ lexer->lex_mode = DATA; - return T_CDATA_STOP; - } else { - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - } - break; - default: - tok[tok_pos] = c; - tok_pos++; -- lexbuf_pos++; -+ lexer->lexbuf_pos++; - } - break; - } - } - lprintf ("loop done tok_pos = %d, tok_size=%d, lexbuf_pos=%d, lexbuf_size=%d\n", -- tok_pos, tok_size, lexbuf_pos, lexbuf_size); -+ tok_pos, tok_size, lexer->lexbuf_pos, lexer->lexbuf_size); - - /* pb */ - if (tok_pos >= tok_size) { - lprintf("token buffer is too little\n"); - } else { -- if (lexbuf_pos >= lexbuf_size) { -+ if (lexer->lexbuf_pos >= lexer->lexbuf_size) { - /* Terminate the current token */ - tok[tok_pos] = '\0'; - switch (state) { diff --git a/sources b/sources index 09fed12..6066f5b 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -bd4ef8ce1cd3c467cd6adc2835f027bc totem-pl-parser-2.28.1.tar.bz2 +a641b6061761535eb3646752bb1545f3 totem-pl-parser-2.28.2.tar.bz2 diff --git a/totem-pl-parser.spec b/totem-pl-parser.spec index 494e45b..526ca9e 100644 --- a/totem-pl-parser.spec +++ b/totem-pl-parser.spec @@ -1,6 +1,6 @@ Name: totem-pl-parser -Version: 2.28.1 -Release: 2%{?dist} +Version: 2.28.2 +Release: 1%{?dist} Summary: Totem Playlist Parser library Group: System Environment/Libraries @@ -16,9 +16,6 @@ BuildRequires: libxml2-devel BuildRequires: gettext BuildRequires: perl(XML::Parser) intltool -# https://bugzilla.gnome.org/show_bug.cgi?id=572705 -Patch0: reentrant.patch - %description A library to parse and save playlists, as used in music and movie players. @@ -37,7 +34,6 @@ developing applications that use %{name}. %prep %setup -q -%patch0 -p1 -b .reentrant %build %configure --enable-static=no @@ -70,6 +66,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/gtk-doc/html/totem-pl-parser %changelog +* Fri Dec 11 2009 Bastien Nocera <bnocera@redhat.com> 2.28.2-1 +- Update to 2.28.2 + * Thu Oct 15 2009 Bastien Nocera <bnocera@redhat.com> 2.28.1-2 - Fix crasher when parsing multiple XML-ish playlists in Rhythmbox