aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2019-07-11 07:08:51 +0100
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2019-07-11 07:08:51 +0100
commit42f5e2da418c8ff0154e4acee38cb64a4c56a7d7 (patch)
treec124d2452eb4b59c74482f86389e8a30ce03c6f8
parentfdb6bab27312d18ee6fb6206248d3cb1a40415e5 (diff)
parent841d4b5fb9ca42e697faf28148abe2bcd7230da5 (diff)
downloadswig-42f5e2da418c8ff0154e4acee38cb64a4c56a7d7.tar.gz
Merge branch 'doxy/segfault'
* doxy/segfault: Add iterator safety check in DoxygenParser::parse Doxygen comment parsing fix for empty lines in code/verbatim blocks
-rw-r--r--Examples/test-suite/doxygen_basic_translate.i2
-rw-r--r--Examples/test-suite/doxygen_basic_translate_style2.i2
-rw-r--r--Examples/test-suite/java/doxygen_basic_translate_runme.java2
-rw-r--r--Examples/test-suite/java/doxygen_basic_translate_style2_runme.java2
-rw-r--r--Examples/test-suite/python/doxygen_basic_translate_runme.py2
-rw-r--r--Examples/test-suite/python/doxygen_basic_translate_style2_runme.py2
-rw-r--r--Source/Doxygen/doxyparser.cxx20
-rw-r--r--Source/Include/swigwarn.h1
8 files changed, 32 insertions, 1 deletions
diff --git a/Examples/test-suite/doxygen_basic_translate.i b/Examples/test-suite/doxygen_basic_translate.i
index 0a8b0474f..da4d80909 100644
--- a/Examples/test-suite/doxygen_basic_translate.i
+++ b/Examples/test-suite/doxygen_basic_translate.i
@@ -57,6 +57,8 @@ void function3(int a, int b)
* \warning This may not work as expected
* \code
* int main() { while(true); }
+ *
+ * // Test blank line in code block
* \endcode
* \endif
*/
diff --git a/Examples/test-suite/doxygen_basic_translate_style2.i b/Examples/test-suite/doxygen_basic_translate_style2.i
index 23e8de4f7..32e3cfcbe 100644
--- a/Examples/test-suite/doxygen_basic_translate_style2.i
+++ b/Examples/test-suite/doxygen_basic_translate_style2.i
@@ -55,6 +55,8 @@ void function3(int a, int b)
* \warning This may not work as expected
* \code
* int main() { while(true); }
+ *
+ * // Test blank line in code block
* \endcode
* \endif
*/
diff --git a/Examples/test-suite/java/doxygen_basic_translate_runme.java b/Examples/test-suite/java/doxygen_basic_translate_runme.java
index f307b3abc..ab343b560 100644
--- a/Examples/test-suite/java/doxygen_basic_translate_runme.java
+++ b/Examples/test-suite/java/doxygen_basic_translate_runme.java
@@ -54,6 +54,8 @@ public class doxygen_basic_translate_runme {
" \n" +
" {@code \n" +
"int main() { while(true); } \n" +
+ "\n" +
+ "// Test blank line in code block \n" +
" }\n" +
" }\n" +
" \n" +
diff --git a/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java b/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java
index aa015eeac..05e51cff8 100644
--- a/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java
+++ b/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java
@@ -54,6 +54,8 @@ public class doxygen_basic_translate_style2_runme {
" \n" +
" {@code \n" +
"int main() { while(true); } \n" +
+ "\n" +
+ "// Test blank line in code block \n" +
" }\n" +
" }\n" +
" \n" +
diff --git a/Examples/test-suite/python/doxygen_basic_translate_runme.py b/Examples/test-suite/python/doxygen_basic_translate_runme.py
index b6023224d..9ef8dbd52 100644
--- a/Examples/test-suite/python/doxygen_basic_translate_runme.py
+++ b/Examples/test-suite/python/doxygen_basic_translate_runme.py
@@ -50,6 +50,8 @@ Warning: This may not work as expected
.. code-block:: c++
int main() { while(true); }
+
+ // Test blank line in code block
}"""
)
comment_verifier.check(inspect.getdoc(doxygen_basic_translate.function5),
diff --git a/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py b/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py
index 2d62eecbd..b75045d59 100644
--- a/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py
+++ b/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py
@@ -48,6 +48,8 @@ Warning: This may not work as expected
.. code-block:: c++
int main() { while(true); }
+
+ // Test blank line in code block
}"""
)
comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style2.function5),
diff --git a/Source/Doxygen/doxyparser.cxx b/Source/Doxygen/doxyparser.cxx
index 3f413bcaa..2e826b265 100644
--- a/Source/Doxygen/doxyparser.cxx
+++ b/Source/Doxygen/doxyparser.cxx
@@ -289,6 +289,18 @@ DoxygenParser::TokenListCIt DoxygenParser::getEndOfParagraph(const TokenList &to
TokenListCIt endOfParagraph = m_tokenListIt;
while (endOfParagraph != tokList.end()) {
+ // If \code or \verbatim is encountered within a paragraph, then
+ // go all the way to the end of that command, since the content
+ // could contain empty lines that would appear to be paragraph
+ // ends:
+ if (endOfParagraph->m_tokenType == COMMAND &&
+ (endOfParagraph->m_tokenString == "code" ||
+ endOfParagraph->m_tokenString == "verbatim")) {
+ const string theCommand = endOfParagraph->m_tokenString;
+ endOfParagraph = getEndCommand("end" + theCommand, tokList);
+ endOfParagraph++; // Move after the end command
+ return endOfParagraph;
+ }
if (endOfParagraph->m_tokenType == END_LINE) {
endOfParagraph++;
if (endOfParagraph != tokList.end()
@@ -959,7 +971,9 @@ DoxygenEntityList DoxygenParser::parse(TokenListCIt endParsingIndex, const Token
std::string currPlainstringCommandType = root ? "partofdescription" : "plainstd::string";
DoxygenEntityList aNewList;
- while (m_tokenListIt != endParsingIndex) {
+ // Less than check (instead of not equal) is a safeguard in case the
+ // iterator is incremented past the end
+ while (m_tokenListIt < endParsingIndex) {
Token currToken = *m_tokenListIt;
@@ -976,6 +990,10 @@ DoxygenEntityList DoxygenParser::parse(TokenListCIt endParsingIndex, const Token
addCommand(currPlainstringCommandType, tokList, aNewList);
}
+ // If addCommand above misbehaves, it can move the iterator past endParsingIndex
+ if (m_tokenListIt > endParsingIndex)
+ printListError(WARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE, "Unexpected iterator value in DoxygenParser::parse");
+
if (endParsingIndex != tokList.end() && m_tokenListIt == tokList.end()) {
// this could happen if we can't reach the original endParsingIndex
printListError(WARN_DOXYGEN_UNEXPECTED_END_OF_COMMENT, "Unexpected end of Doxygen comment encountered.");
diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h
index fbcea4dbd..a08693ac8 100644
--- a/Source/Include/swigwarn.h
+++ b/Source/Include/swigwarn.h
@@ -221,6 +221,7 @@
#define WARN_DOXYGEN_HTML_ERROR 563
#define WARN_DOXYGEN_COMMAND_ERROR 564
#define WARN_DOXYGEN_UNKNOWN_CHARACTER 565
+#define WARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE 566
/* -- Reserved (600-799) -- */