From 52c296b2b56751899e9d9fb8772135a5073d7168 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Mon, 14 Dec 2015 11:42:26 +0100 Subject: [PATCH] Fix crash calling RINDEX with a zero needle length Also add a test and correct the documentation. --- doc/expressions.texi | 4 ++-- src/language/expressions/operations.def | 2 +- tests/language/expressions/evaluate.at | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/expressions.texi b/doc/expressions.texi index 7180bf8793..7226116bd1 100644 --- a/doc/expressions.texi +++ b/doc/expressions.texi @@ -621,7 +621,7 @@ format for @var{format}, system-missing is returned. @end deftypefn @cindex strings, searching backwards -@deftypefn {Function} {} RINDEX (@var{string}, @var{format}) +@deftypefn {Function} {} RINDEX (@var{haystack}, @var{needle}) Returns a positive integer indicating the position of the last occurrence of @var{needle} in @var{haystack}. Returns 0 if @var{haystack} does not contain @var{needle}. Returns system-missing if @@ -634,7 +634,7 @@ Searches @var{haystack} for the last occurrence of each part, and returns the largest value. Returns 0 if @var{haystack} does not contain any part in @var{needle}. It is an error if @var{needle_len} does not evenly divide the length of @var{needle}. Returns system-missing -if @var{needle} is an empty string. +if @var{needle} is an empty string or if needle_len is less than 1. @end deftypefn @cindex padding strings diff --git a/src/language/expressions/operations.def b/src/language/expressions/operations.def index 60ed2eac20..471fa1d30d 100644 --- a/src/language/expressions/operations.def +++ b/src/language/expressions/operations.def @@ -417,7 +417,7 @@ function RINDEX (string haystack, string needle) function RINDEX (string haystack, string needles, needle_len_d) { - if (needle_len_d <= INT_MIN || needle_len_d >= INT_MAX + if (needle_len_d <= 0 || needle_len_d >= INT_MAX || (int) needle_len_d != needle_len_d || needles.length == 0) return SYSMIS; diff --git a/tests/language/expressions/evaluate.at b/tests/language/expressions/evaluate.at index 846eee482b..43d6b0b877 100644 --- a/tests/language/expressions/evaluate.at +++ b/tests/language/expressions/evaluate.at @@ -770,6 +770,7 @@ CHECK_EXPR_EVAL([concat index rindex length lower], [[rindex('abcbcde', 'abc', 1)], [5.00]], [[rindex('abcbcde', 'bccb', 2)], [4.00]], [[rindex('abcbcde', 'bcbc', 2)], [4.00]], + [[rindex('abcbcde', 'bcbc', 0)], [sysmis]], [[rindex('abcbcde', 'bcbc', $sysmis)], [sysmis]], [[rindex('abcbcde', 'bcbcg', 2)], [sysmis]], [[rindex('abcbcde', 'bcbcg', $sysmis)], [sysmis]], -- 2.30.2