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