startPtr gets set to non-null if the section is closed, and to null if the section is not yet closed. */
| 4589 | the section is not yet closed. |
| 4590 | */ |
| 4591 | static enum XML_Error |
| 4592 | doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, |
| 4593 | const char *end, const char **nextPtr, XML_Bool haveMore, |
| 4594 | enum XML_Account account) { |
| 4595 | const char *s = *startPtr; |
| 4596 | const char **eventPP; |
| 4597 | const char **eventEndPP; |
| 4598 | if (enc == parser->m_encoding) { |
| 4599 | eventPP = &parser->m_eventPtr; |
| 4600 | *eventPP = s; |
| 4601 | eventEndPP = &parser->m_eventEndPtr; |
| 4602 | } else { |
| 4603 | eventPP = &(parser->m_openInternalEntities->internalEventPtr); |
| 4604 | eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr); |
| 4605 | } |
| 4606 | *eventPP = s; |
| 4607 | *startPtr = NULL; |
| 4608 | |
| 4609 | for (;;) { |
| 4610 | const char *next = s; /* in case of XML_TOK_NONE or XML_TOK_PARTIAL */ |
| 4611 | int tok = XmlCdataSectionTok(enc, s, end, &next); |
| 4612 | #if XML_GE == 1 |
| 4613 | if (! accountingDiffTolerated(parser, tok, s, next, __LINE__, account)) { |
| 4614 | accountingOnAbort(parser); |
| 4615 | return XML_ERROR_AMPLIFICATION_LIMIT_BREACH; |
| 4616 | } |
| 4617 | #else |
| 4618 | UNUSED_P(account); |
| 4619 | #endif |
| 4620 | *eventEndPP = next; |
| 4621 | switch (tok) { |
| 4622 | case XML_TOK_CDATA_SECT_CLOSE: |
| 4623 | if (parser->m_endCdataSectionHandler) |
| 4624 | parser->m_endCdataSectionHandler(parser->m_handlerArg); |
| 4625 | /* BEGIN disabled code */ |
| 4626 | /* see comment under XML_TOK_CDATA_SECT_OPEN */ |
| 4627 | else if ((0) && parser->m_characterDataHandler) |
| 4628 | parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, |
| 4629 | 0); |
| 4630 | /* END disabled code */ |
| 4631 | else if (parser->m_defaultHandler) |
| 4632 | reportDefault(parser, enc, s, next); |
| 4633 | *startPtr = next; |
| 4634 | *nextPtr = next; |
| 4635 | if (parser->m_parsingStatus.parsing == XML_FINISHED) |
| 4636 | return XML_ERROR_ABORTED; |
| 4637 | else |
| 4638 | return XML_ERROR_NONE; |
| 4639 | case XML_TOK_DATA_NEWLINE: |
| 4640 | if (parser->m_characterDataHandler) { |
| 4641 | XML_Char c = 0xA; |
| 4642 | parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); |
| 4643 | } else if (parser->m_defaultHandler) |
| 4644 | reportDefault(parser, enc, s, next); |
| 4645 | break; |
| 4646 | case XML_TOK_DATA_CHARS: { |
| 4647 | XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler; |
| 4648 | if (charDataHandler) { |
no test coverage detected
searching dependent graphs…