瀏覽代碼

HPCC-9879 Fix cores with unicode find strength functions on null strings

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 12 年之前
父節點
當前提交
b16557c5d1
共有 3 個文件被更改,包括 77 次插入3 次删除
  1. 12 3
      plugins/unicodelib/unicodelib.cpp
  2. 20 0
      testing/ecl/issue9879.ecl
  3. 45 0
      testing/ecl/key/issue9879.xml

+ 12 - 3
plugins/unicodelib/unicodelib.cpp

@@ -744,6 +744,9 @@ UNICODELIB_API unsigned UNICODELIB_CALL ulUnicodeLocaleFind(unsigned srcLen, UCh
 
 UNICODELIB_API unsigned UNICODELIB_CALL ulUnicodeLocaleFindAtStrength(unsigned srcLen, UChar const * src, unsigned hitLen, UChar const * hit, unsigned instance, char const * localename, char strength)
 {
+    //Very strange behaviour - if source or pattern lengths are 0 search->getCollator() is invalid
+    if (srcLen == 0 || hitLen == 0)
+        return 0;
     UnicodeString const source(src, srcLen);
     UnicodeString const pattern(hit, hitLen);
     UErrorCode error = U_ZERO_ERROR;
@@ -976,9 +979,15 @@ UNICODELIB_API void UNICODELIB_CALL ulUnicodeLocaleFindReplace(unsigned & tgtLen
 UNICODELIB_API void UNICODELIB_CALL ulUnicodeLocaleFindAtStrengthReplace(unsigned & tgtLen, UChar * & tgt, unsigned srcLen, UChar const * src, unsigned stokLen, UChar const * stok, unsigned rtokLen, UChar const * rtok, char const * localename, char strength)
 {
     UnicodeString source(src, srcLen);
-    UnicodeString const pattern(stok, stokLen);
-    UnicodeString const replace(rtok, rtokLen);
-    doUnicodeLocaleFindAtStrengthReplace(source, pattern, replace, localename, strength);
+
+    //Very strange behaviour - if source or pattern lengths are 0 search->getCollator() is invalid
+    if (srcLen && stokLen)
+    {
+        UnicodeString const pattern(stok, stokLen);
+        UnicodeString const replace(rtok, rtokLen);
+        doUnicodeLocaleFindAtStrengthReplace(source, pattern, replace, localename, strength);
+    }
+
     tgtLen = source.length();
     tgt = (UChar *)CTXMALLOC(parentCtx, tgtLen*2);
     source.extract(0, tgtLen, tgt);

+ 20 - 0
testing/ecl/issue9879.ecl

@@ -0,0 +1,20 @@
+IMPORT Std;
+
+STD.Uni.LocaleFind(u'',u'abc',1,'');
+STD.Uni.LocaleFind(u'abc',u'',1,'');
+STD.Uni.LocaleFind(u'abc',u'b',1,'');
+
+STD.Uni.LocaleFindAtStrength(u'',u'abc',1,'',1);
+STD.Uni.LocaleFindAtStrength(u'abc',u'',1,'',1);
+STD.Uni.LocaleFindAtStrength(u'abc',u'b',1,'',1);
+
+STD.Uni.LocaleFindReplace(u'',u'abc',u'x','');
+STD.Uni.LocaleFindReplace(u'abc',u'',u'x','');
+STD.Uni.LocaleFindReplace(u'abc',u'B',u'x','');
+STD.Uni.LocaleFindReplace(u'abc',u'b',u'x','');
+
+STD.Uni.LocaleFindAtStrengthReplace(u'',u'abc',u'x','',1);
+STD.Uni.LocaleFindAtStrengthReplace(u'abc',u'',u'x','',1);
+STD.Uni.LocaleFindAtStrengthReplace(u'abc',u'B',u'x','',0);
+STD.Uni.LocaleFindAtStrengthReplace(u'abc',u'B',u'x','',1);
+STD.Uni.LocaleFindAtStrengthReplace(u'abc',u'B',u'x','',2);

+ 45 - 0
testing/ecl/key/issue9879.xml

@@ -0,0 +1,45 @@
+<Dataset name='Result 1'>
+ <Row><Result_1>0</Result_1></Row>
+</Dataset>
+<Dataset name='Result 2'>
+ <Row><Result_2>0</Result_2></Row>
+</Dataset>
+<Dataset name='Result 3'>
+ <Row><Result_3>2</Result_3></Row>
+</Dataset>
+<Dataset name='Result 4'>
+ <Row><Result_4>0</Result_4></Row>
+</Dataset>
+<Dataset name='Result 5'>
+ <Row><Result_5>0</Result_5></Row>
+</Dataset>
+<Dataset name='Result 6'>
+ <Row><Result_6>2</Result_6></Row>
+</Dataset>
+<Dataset name='Result 7'>
+ <Row><Result_7></Result_7></Row>
+</Dataset>
+<Dataset name='Result 8'>
+ <Row><Result_8>abc</Result_8></Row>
+</Dataset>
+<Dataset name='Result 9'>
+ <Row><Result_9>abc</Result_9></Row>
+</Dataset>
+<Dataset name='Result 10'>
+ <Row><Result_10>axc</Result_10></Row>
+</Dataset>
+<Dataset name='Result 11'>
+ <Row><Result_11></Result_11></Row>
+</Dataset>
+<Dataset name='Result 12'>
+ <Row><Result_12>abc</Result_12></Row>
+</Dataset>
+<Dataset name='Result 13'>
+ <Row><Result_13>abc</Result_13></Row>
+</Dataset>
+<Dataset name='Result 14'>
+ <Row><Result_14>axc</Result_14></Row>
+</Dataset>
+<Dataset name='Result 15'>
+ <Row><Result_15>axc</Result_15></Row>
+</Dataset>