riched20: Fix for EM_FINDTEXT input validation
leiz at ucla.edu
leiz at ucla.edu
Mon Feb 20 12:35:14 CST 2006
My name is Lei Zhang. I'm a resident of Los Angeles, CA, USA, and I
currently attend UCLA. I hereby certify that I wrote this code without
copying from anyone else's sources, and I've never seen any secret
Microsoft source code.
License: LGPL
---
ChangeLog:
Fixed the cpMin/cpMax validation code for EM_FINDTEXT.
Removed todo flag from affected EM_FINDTEXT tests.
---
editor.c | 26 ++++++++++++++++++--------
tests/editor.c | 10 +++++-----
2 files changed, 23 insertions(+), 13 deletions(-)
Index: dlls/riched20/editor.c
===================================================================
RCS file: /home/wine/wine/dlls/riched20/editor.c,v
retrieving revision 1.90
diff -u -r1.90 editor.c
--- dlls/riched20/editor.c 16 Feb 2006 20:07:51 -0000 1.90
+++ dlls/riched20/editor.c 20 Feb 2006 04:45:08 -0000
@@ -778,18 +778,28 @@
if (flags & ~(FR_DOWN | FR_MATCHCASE))
FIXME("Flags 0x%08lx not implemented\n", flags & ~(FR_DOWN | FR_MATCHCASE));
+ nMin = chrg->cpMin;
if (chrg->cpMax == -1)
- {
- nMin = chrg->cpMin;
nMax = ME_GetTextLength(editor);
- }
else
- {
- nMin = min(chrg->cpMin, chrg->cpMax);
- nMax = max(chrg->cpMin, chrg->cpMax);
- }
+ nMax = chrg->cpMax;
- if (!nLen || nMin < 0 || nMax < 0)
+ /* when searching up, if cpMin < cpMax, then instead of searching
+ * on [cpMin,cpMax], we search on [0,cpMin], otherwise, search on
+ * [cpMax, cpMin]
+ */
+ if (!(flags & FR_DOWN))
+ {
+ int nSwap = nMax;
+
+ nMax = nMin;
+ if (nMin < nSwap)
+ nMin = 0;
+ else
+ nMin = nSwap;
+ }
+
+ if (!nLen || nMin < 0 || nMax < 0 || nMax < nMin)
{
if (chrgText)
chrgText->cpMin = chrgText->cpMax = -1;
Index: dlls/riched20/tests/editor.c
===================================================================
RCS file: /home/wine/wine/dlls/riched20/tests/editor.c,v
retrieving revision 1.3
diff -u -r1.3 editor.c
--- dlls/riched20/tests/editor.c 16 Feb 2006 20:07:52 -0000 1.3
+++ dlls/riched20/tests/editor.c 20 Feb 2006 04:45:08 -0000
@@ -71,8 +71,8 @@
{24, 31, "Wine", FR_DOWN | FR_MATCHCASE, 27, 0},
/* Find backwards */
- {19, 20, "Wine", FR_MATCHCASE, 13, 1},
- {10, 20, "Wine", FR_MATCHCASE, 4, 1},
+ {19, 20, "Wine", FR_MATCHCASE, 13, 0},
+ {10, 20, "Wine", FR_MATCHCASE, 4, 0},
{20, 10, "Wine", FR_MATCHCASE, 13, 0},
/* Case-insensitive */
@@ -80,7 +80,7 @@
{1, 31, "Wine", FR_DOWN, 4, 0},
/* High-to-low ranges */
- {20, 5, "Wine", FR_DOWN, -1, 1},
+ {20, 5, "Wine", FR_DOWN, -1, 0},
{2, 1, "Wine", FR_DOWN, -1, 0},
{30, 29, "Wine", FR_DOWN, -1, 0},
{20, 5, "Wine", 0, 13, 0},
@@ -110,8 +110,8 @@
/* The backwards case of bug 4479; bounds look right
* Fails because backward find is wrong */
- {19, 20, "WINE", FR_MATCHCASE, 0, 1},
- {0, 20, "WINE", FR_MATCHCASE, -1, 1}
+ {19, 20, "WINE", FR_MATCHCASE, 0, 0},
+ {0, 20, "WINE", FR_MATCHCASE, -1, 0}
};
static void check_EM_FINDTEXT(HWND hwnd, char *name, struct find_s *f, int id) {
More information about the wine-patches
mailing list