From 627cc16a8d4c3fa40144b8f4ec1fe511cbf783a3 Mon Sep 17 00:00:00 2001 From: Matthew Jordan <mjordan@digium.com> Date: Thu, 19 Mar 2015 19:20:21 +0000 Subject: [PATCH] funcs/func_env: Fix regression caused in FILE read operation When r432935 was merged, it did correctly fix a situation where a FILE read operation on the middle of a file buffer would not read the requested length in the parameters passed to the FILE function. Unfortunately, it would also allow the FILE function to append more bytes than what was available in the buffer if the length exceeded the end of the buffer length. This patch takes the minimum of the remaining bytes in the buffer along with the calculated length to append provided by the original patch, and uses that as the length to append in the return result. This patch also updates the unit tests with the scenarios that were originally pointed out in ASTERISK-21765 that the original implementation treated incorrectly. ASTERISK-21765 ........ Merged revisions 433173 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 433174 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@433175 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- funcs/func_env.c | 2 +- tests/test_func_file.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/funcs/func_env.c b/funcs/func_env.c index 0daa7f48d1..26bd09c139 100644 --- a/funcs/func_env.c +++ b/funcs/func_env.c @@ -561,7 +561,7 @@ static int file_read(struct ast_channel *chan, const char *cmd, char *data, stru /* Don't go past the length requested */ if (off_i + toappend > offset + length) { - toappend = offset + length - off_i; + toappend = MIN(offset + length - off_i, flength - off_i); } ast_str_append_substr(buf, len, fbuf, toappend); diff --git a/tests/test_func_file.c b/tests/test_func_file.c index 4ebc87cafd..834907578a 100644 --- a/tests/test_func_file.c +++ b/tests/test_func_file.c @@ -63,6 +63,12 @@ static struct { /* No length */ { "123456789", "-5", "56789" }, { "123456789", "4", "56789" }, + /* Passed file length */ + { "123456789", "8,10", "9" }, + { "123456789", "10,1", "" }, + /* Middle of file */ + { "123456789", "2,5", "34567" }, + { "123456789", "-7,5", "34567" }, /* Line mode, 4 ways of specifying the first character */ { "123\n456\n789\n", "0,1,l", "123\n" }, { "123\n456\n789\n", "-3,1,l", "123\n" }, -- GitLab