mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-12-10 02:23:40 +01:00
New testcases.
2002-05-18 Matthias Clasen <maclas@gmx.de> * tests/markups/fail-36.gmarkup: * tests/markups/fail-35.gmarkup: * tests/markups/valid-8.gmarkup: * tests/markups/valid-7.gmarkup: * tests/markups/valid-6.gmarkup: * tests/markups/valid-5.gmarkup: New testcases. * tests/markup-test.c (passthrough_handler): (text_handler): Don't ignore the text_len parameter. * glib/gmarkup.c (find_current_text_end): Don't hang on embedded nuls. (#81977) (g_markup_parse_context_parse): Fix passthrough handling to correctly skip processing instructions, comments, doctype declarations and CDATA marked sections. (#81977)
This commit is contained in:
committed by
Matthias Clasen
parent
ed8f19b4c6
commit
60f59976d9
@@ -97,6 +97,7 @@ struct _GMarkupParseContext
|
||||
|
||||
guint document_empty : 1;
|
||||
guint parsing : 1;
|
||||
gint balance;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -154,6 +155,8 @@ g_markup_parse_context_new (const GMarkupParser *parser,
|
||||
context->document_empty = TRUE;
|
||||
context->parsing = FALSE;
|
||||
|
||||
context->balance = 0;
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
@@ -722,8 +725,10 @@ find_current_text_end (GMarkupParseContext *context)
|
||||
p = context->current_text;
|
||||
next = g_utf8_find_next_char (p, end);
|
||||
|
||||
while (next)
|
||||
while (next && *next)
|
||||
{
|
||||
if (p == next)
|
||||
next++;
|
||||
p = next;
|
||||
next = g_utf8_find_next_char (p, end);
|
||||
}
|
||||
@@ -963,6 +968,7 @@ g_markup_parse_context_parse (GMarkupParseContext *context,
|
||||
const gchar *openangle = "<";
|
||||
add_to_partial (context, openangle, openangle + 1);
|
||||
context->start = context->iter;
|
||||
context->balance = 1;
|
||||
context->state = STATE_INSIDE_PASSTHROUGH;
|
||||
}
|
||||
else if (*context->iter == '/')
|
||||
@@ -1493,13 +1499,28 @@ g_markup_parse_context_parse (GMarkupParseContext *context,
|
||||
g_free (close_name);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case STATE_INSIDE_PASSTHROUGH:
|
||||
/* Possible next state: AFTER_CLOSE_ANGLE */
|
||||
do
|
||||
{
|
||||
if (*context->iter == '>')
|
||||
break;
|
||||
if (*context->iter == '<')
|
||||
context->balance++;
|
||||
if (*context->iter == '>')
|
||||
{
|
||||
context->balance--;
|
||||
add_to_partial (context, context->start, context->iter);
|
||||
context->start = context->iter;
|
||||
if ((g_str_has_prefix (context->partial_chunk->str, "<?")
|
||||
&& g_str_has_suffix (context->partial_chunk->str, "?")) ||
|
||||
(g_str_has_prefix (context->partial_chunk->str, "<!--")
|
||||
&& g_str_has_suffix (context->partial_chunk->str, "--")) ||
|
||||
(g_str_has_prefix (context->partial_chunk->str, "<![CDATA[")
|
||||
&& g_str_has_suffix (context->partial_chunk->str, "]]")) ||
|
||||
(g_str_has_prefix (context->partial_chunk->str, "<!DOCTYPE")
|
||||
&& context->balance == 0))
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (advance_char (context));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user