diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index c22c99c2527..152307a0ce2 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -134,6 +134,8 @@ #include "nsIEditor.h" #include "nsNodeInfoManager.h" +#define NS_MAX_DOCUMENT_WRITE_DEPTH 20 + #define DETECTOR_CONTRACTID_MAX 127 static char g_detector_contractid[DETECTOR_CONTRACTID_MAX + 1]; static PRBool gInitDetector = PR_FALSE; @@ -2275,6 +2277,10 @@ nsresult nsHTMLDocument::WriteCommon(const nsAString& aText, PRBool aNewlineTerminate) { + mTooDeepWriteRecursion = + (mWriteLevel > NS_MAX_DOCUMENT_WRITE_DEPTH || mTooDeepWriteRecursion); + NS_ENSURE_STATE(!mTooDeepWriteRecursion); + if (IsXHTML()) { // No calling document.write*() on XHTML! @@ -2334,6 +2340,8 @@ nsHTMLDocument::WriteCommon(const nsAString& aText, --mWriteLevel; + mTooDeepWriteRecursion = (mWriteLevel != 0 && mTooDeepWriteRecursion); + return rv; } diff --git a/content/html/document/src/nsHTMLDocument.h b/content/html/document/src/nsHTMLDocument.h index f1c01f3ba48..80493f82f2e 100644 --- a/content/html/document/src/nsHTMLDocument.h +++ b/content/html/document/src/nsHTMLDocument.h @@ -325,6 +325,8 @@ protected: PRPackedBool mIsFrameset; + PRPackedBool mTooDeepWriteRecursion; + PRBool IdTableIsLive() const { // live if we've had over 63 misses return (mIdMissCount & 0x40) != 0;