Dylan Smith : richedit: Set error codes and stop parsing for some rtf syntax errors.
Alexandre Julliard
julliard at winehq.org
Fri Jun 27 07:41:49 CDT 2008
Module: wine
Branch: master
Commit: 632015dc626f85a61165eab89c976c0fef730a9c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=632015dc626f85a61165eab89c976c0fef730a9c
Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date: Thu Jun 26 16:17:25 2008 -0400
richedit: Set error codes and stop parsing for some rtf syntax errors.
Checks were added for hexadecimal values that did not have valid
characters, and for EOF received before the final closing brace of the
rich text stream. The error values were tested on richedit versions 1,
2, 3 & 4.1, and they were all the same for these cases.
---
dlls/riched20/editor.c | 7 +++++--
dlls/riched20/reader.c | 8 +++++---
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index f7e20e0..28850f9 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -969,11 +969,11 @@ static void ME_RTFReadHook(RTF_Info *info) {
{
ME_Style *s;
RTFFlushOutputBuffer(info);
- if (info->stackTop<=1) {
+ info->stackTop--;
+ if (info->stackTop<=0) {
info->rtfClass = rtfEOF;
return;
}
- info->stackTop--;
assert(info->stackTop >= 0);
if (info->styleChanged)
{
@@ -1101,6 +1101,9 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre
if (parser.lpRichEditOle)
IRichEditOle_Release(parser.lpRichEditOle);
+ if (!inStream.editstream->dwError && parser.stackTop > 0)
+ inStream.editstream->dwError = HRESULT_FROM_WIN32(ERROR_HANDLE_EOF);
+
/* Remove last line break, as mandated by tests. This is not affected by
CR/LF counters, since RTF streaming presents only \para tokens, which
are converted according to the standard rules: \r for 2.0, \r\n for 1.0
diff --git a/dlls/riched20/reader.c b/dlls/riched20/reader.c
index 5ee9fa2..760adec 100644
--- a/dlls/riched20/reader.c
+++ b/dlls/riched20/reader.c
@@ -638,14 +638,16 @@ static void _RTFGetToken2(RTF_Info *info)
{
int c2;
- if ((c = GetChar (info)) != EOF && (c2 = GetChar (info)) != EOF)
+ if ((c = GetChar (info)) != EOF && (c2 = GetChar (info)) != EOF
+ && isxdigit(c) && isxdigit(c2))
{
- /* should do isxdigit check! */
info->rtfClass = rtfText;
info->rtfMajor = RTFCharToHex (c) * 16 + RTFCharToHex (c2);
return;
}
- /* early eof, whoops (class is rtfUnknown) */
+ /* early eof, whoops */
+ info->rtfClass = rtfEOF;
+ info->stream->editstream->dwError = -14;
return;
}
More information about the wine-cvs
mailing list