aboutsummaryrefslogtreecommitdiffstats
path: root/funcs
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-16 17:38:50 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-16 17:38:50 +0000
commit66106444e580e020ac1590435df7a09699caef4a (patch)
treed99c0dadaf8cad8875abca2af0fafc2c5be62761 /funcs
parentba78c1a523431f09a9008e3e4640021348268527 (diff)
Merged revisions 182211,182278 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r182211 | tilghman | 2009-03-16 10:50:55 -0500 (Mon, 16 Mar 2009) | 14 lines Merged revisions 182208 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r182208 | tilghman | 2009-03-16 10:39:15 -0500 (Mon, 16 Mar 2009) | 7 lines Fixup glare detection, to fix a memory leak of a local pvt structure. (closes issue #14656) Reported by: caspy Patches: 20090313__bug14656__2.diff.txt uploaded by tilghman (license 14) Tested by: caspy ........ ................ r182278 | tilghman | 2009-03-16 12:33:38 -0500 (Mon, 16 Mar 2009) | 7 lines Fix an off-by-one error in the FILE() function, and extend FILE()'s length parameter to work like variable substitution. Previously, FILE() returned one less character than specified, due to the terminating NULL. Both the offset and length parameters now behave identically to the way variable substitution offsets and lengths also work. (closes issue #14670) Reported by: BMC ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@182280 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'funcs')
-rw-r--r--funcs/func_env.c57
1 files changed, 38 insertions, 19 deletions
diff --git a/funcs/func_env.c b/funcs/func_env.c
index 4eba211bb..095252b5a 100644
--- a/funcs/func_env.c
+++ b/funcs/func_env.c
@@ -113,40 +113,59 @@ static int file_read(struct ast_channel *chan, const char *cmd, char *data, char
AST_APP_ARG(offset);
AST_APP_ARG(length);
);
- int offset = 0, length;
+ int offset = 0, length, res = 0;
char *contents;
+ size_t contents_len;
AST_STANDARD_APP_ARGS(args, data);
- if (args.argc > 1)
+ if (args.argc > 1) {
offset = atoi(args.offset);
+ }
if (args.argc > 2) {
- if ((length = atoi(args.length)) < 1) {
- ast_log(LOG_WARNING, "Invalid length '%s'. Returning the max (%d)\n", args.length, (int)len);
- length = len;
- } else if (length > len) {
- ast_log(LOG_WARNING, "Length %d is greater than the max (%d). Truncating output.\n", length, (int)len);
+ /* The +1/-1 in this code section is to accomodate for the terminating NULL. */
+ if ((length = atoi(args.length) + 1) > len) {
+ ast_log(LOG_WARNING, "Length %d is greater than the max (%d). Truncating output.\n", length - 1, (int)len - 1);
length = len;
}
- } else
+ } else {
length = len;
+ }
- if (!(contents = ast_read_textfile(args.filename)))
+ if (!(contents = ast_read_textfile(args.filename))) {
return -1;
+ }
- if (offset >= 0)
- ast_copy_string(buf, &contents[offset], length);
- else {
- size_t tmp = strlen(contents);
- if (offset * -1 > tmp) {
- ast_log(LOG_WARNING, "Offset is larger than the file size.\n");
- offset = tmp * -1;
+ do {
+ contents_len = strlen(contents);
+ if (offset > contents_len) {
+ res = -1;
+ break;
}
- ast_copy_string(buf, &contents[tmp + offset], length);
- }
+
+ if (offset >= 0) {
+ if (length < 0) {
+ if (contents_len - offset + length < 0) {
+ /* Nothing left after trimming */
+ res = -1;
+ break;
+ }
+ ast_copy_string(buf, &contents[offset], contents_len + length);
+ } else {
+ ast_copy_string(buf, &contents[offset], length);
+ }
+ } else {
+ if (offset * -1 > contents_len) {
+ ast_log(LOG_WARNING, "Offset is larger than the file size.\n");
+ offset = contents_len * -1;
+ }
+ ast_copy_string(buf, &contents[contents_len + offset], length);
+ }
+ } while (0);
+
ast_free(contents);
- return 0;
+ return res;
}
static struct ast_custom_function env_function = {