diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 056721edb62..c9ab4e15937 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -1838,7 +1838,7 @@ static HRESULT reader_parse_dtd(xmlreader *reader)
}
/* [11 NS] LocalPart ::= NCName */
-static HRESULT reader_parse_local(xmlreader *reader, strval *local)
+static HRESULT reader_parse_local(xmlreader *reader, strval *local, BOOL check_for_separator)
{
WCHAR *ptr;
UINT start;
@@ -1860,6 +1860,9 @@ static HRESULT reader_parse_local(xmlreader *reader, strval *local)
ptr = reader_get_ptr(reader);
}
+ if (check_for_separator && *ptr == ':')
+ return NC_E_QNAMECOLON;
+
if (is_reader_pending(reader))
{
reader->resume[XmlReadResume_Local] = start;
@@ -1898,7 +1901,7 @@ static HRESULT reader_parse_qname(xmlreader *reader, strval *prefix, strval *loc
if (reader->resume[XmlReadResume_Local])
{
- hr = reader_parse_local(reader, local);
+ hr = reader_parse_local(reader, local, FALSE);
if (FAILED(hr)) return hr;
reader_init_strvalue(reader->resume[XmlReadResume_Name],
@@ -1923,7 +1926,7 @@ static HRESULT reader_parse_qname(xmlreader *reader, strval *prefix, strval *loc
/* skip ':' */
reader_skipn(reader, 1);
- hr = reader_parse_local(reader, local);
+ hr = reader_parse_local(reader, local, TRUE);
if (FAILED(hr)) return hr;
}
else
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 4318a29b76e..a44af67707a 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1415,6 +1415,8 @@ static struct test_entry element_tests[] = {
{ "", "a", "", S_OK },
{ "", "a", "", S_OK },
{ "", NULL, NULL, NC_E_QNAMECHARACTER },
+ { "", NULL, NULL, NC_E_QNAMECOLON },
+ { "<:b:c />", NULL, NULL, NC_E_QNAMECHARACTER },
{ NULL }
};