[Libreoffice-commits] core.git: i18npool/source

Eike Rathke erack at redhat.com
Wed Nov 25 07:06:05 PST 2015


 i18npool/source/search/textsearch.cxx |   36 ++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

New commits:
commit 4dd2d40673299966ad639d799e925e64ae5560cf
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Nov 25 15:58:01 2015 +0100

    regex result offsets can be negative if a group was not matched, tdf#94810
    
    "(abc)|(def)" matches "def" with result offset sequences
    {0,-1,0},{3,-1,3}
    
    And thus the assert() calls introduced with
    4cf1d290bab29e18e1312b63ff862f5102e00387 and
    ce91f3c1292f3e9b84157acf10b67ad9ca16719d were hit.
    
    Change-Id: I571b6c7d47349a2cc7b1d1e34193b2865012a49f

diff --git a/i18npool/source/search/textsearch.cxx b/i18npool/source/search/textsearch.cxx
index ded626a..6e80233 100644
--- a/i18npool/source/search/textsearch.cxx
+++ b/i18npool/source/search/textsearch.cxx
@@ -301,18 +301,22 @@ SearchResult TextSearch::searchForward( const OUString& searchStr, sal_Int32 sta
             for ( sal_Int32 k = 0; k < nGroups; k++ )
             {
                 const sal_Int32 nStart = sres.startOffset[k] - nExtraOffset;
-                assert(nStart >= 0);
-                sres.startOffset[k] = (nStart < nOffsets ? offset[nStart] : (offset[nOffsets - 1] + 1));
+                // Result offsets are negative (-1) if a group expression was
+                // not matched.
+                if (nStart >= 0)
+                    sres.startOffset[k] = (nStart < nOffsets ? offset[nStart] : (offset[nOffsets - 1] + 1));
                 // JP 20.6.2001: end is ever exclusive and then don't return
                 //               the position of the next character - return the
                 //               next position behind the last found character!
                 //               "a b c" find "b" must return 2,3 and not 2,4!!!
                 const sal_Int32 nStop = sres.endOffset[k] - nExtraOffset;
-                assert(nStop >= 0);
-                if (nStop > 0)
-                    sres.endOffset[k] = offset[(nStop <= nOffsets ? nStop : nOffsets) - 1] + 1;
-                else
-                    sres.endOffset[k] = offset[0];
+                if (nStop >= 0)
+                {
+                    if (nStop > 0)
+                        sres.endOffset[k] = offset[(nStop <= nOffsets ? nStop : nOffsets) - 1] + 1;
+                    else
+                        sres.endOffset[k] = offset[0];
+                }
             }
         }
     }
@@ -404,18 +408,22 @@ SearchResult TextSearch::searchBackward( const OUString& searchStr, sal_Int32 st
             for ( sal_Int32 k = 0; k < nGroups; k++ )
             {
                 const sal_Int32 nStart = sres.startOffset[k];
-                assert(nStart >= 0);
-                if (nStart > 0)
-                    sres.startOffset[k] = offset[(nStart <= nOffsets ? nStart : nOffsets) - 1] + 1;
-                else
-                    sres.startOffset[k] = offset[0];
+                // Result offsets are negative (-1) if a group expression was
+                // not matched.
+                if (nStart >= 0)
+                {
+                    if (nStart > 0)
+                        sres.startOffset[k] = offset[(nStart <= nOffsets ? nStart : nOffsets) - 1] + 1;
+                    else
+                        sres.startOffset[k] = offset[0];
+                }
                 // JP 20.6.2001: end is ever exclusive and then don't return
                 //               the position of the next character - return the
                 //               next position behind the last found character!
                 //               "a b c" find "b" must return 2,3 and not 2,4!!!
                 const sal_Int32 nStop = sres.endOffset[k];
-                assert(nStop >= 0);
-                sres.endOffset[k] = (nStop < nOffsets ? offset[nStop] : (offset[nOffsets - 1] + 1));
+                if (nStop >= 0)
+                    sres.endOffset[k] = (nStop < nOffsets ? offset[nStop] : (offset[nOffsets - 1] + 1));
             }
         }
     }


More information about the Libreoffice-commits mailing list