From: Corey Farrell Date: Fri, 23 Feb 2018 16:09:46 +0000 (-0500) Subject: core: Fix handling of maximum length lines in config files. X-Git-Tag: 13.21.0-rc1~97^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=caad0c09cd9e2ab002baebc159c92c82bb0712fd;p=thirdparty%2Fasterisk.git core: Fix handling of maximum length lines in config files. When a line is the maximum length "\n" is found at sizeof(buf) - 2 since the last character is actually the null terminator. In addition if a line was exactly 8190 plus a multiple of 8192 characters long the config parser would skip the following line. Additionally fix comment in voicemail.conf sample config. It previously stated that emailbody can only contain up to 512 characters which is always wrong. The buffer is normally 8192 characters unless LOW_MEMORY is enabled then it is 512 characters. The updated comment states that the line can be up to 8190 or 510 characters since the line feed and NULL terminator each use a character. ASTERISK-26688 #close Change-Id: I80864a0d40d2e2d8cd79d72af52a8f0a3a99c015 --- diff --git a/configs/samples/voicemail.conf.sample b/configs/samples/voicemail.conf.sample index c90f8513c8..e4130d356f 100644 --- a/configs/samples/voicemail.conf.sample +++ b/configs/samples/voicemail.conf.sample @@ -145,8 +145,9 @@ maxlogins=3 ; You can select between two variables by using dialplan functions, e.g. ; ${IF(${ISNULL(${ORIG_VM_DATE})}?${VM_DATE}:${ORIG_VM_DATE})} ; -; Note: The emailbody config row can only be up to 512 characters due to a -; limitation in the Asterisk configuration subsystem. +; Note: The emailbody config row can only be up to 8190 characters due to a +; limitation in the Asterisk configuration subsystem. If compiled with +; LOW_MEMORY the limit is 510 characters. ;emailsubject=[PBX]: New message ${VM_MSGNUM} in mailbox ${VM_MAILBOX} ; The following definition is very close to the default, but the default shows ; just the CIDNAME, if it is not null, otherwise just the CIDNUM, or "an unknown diff --git a/main/config.c b/main/config.c index 3b56c03870..eec6c0260b 100644 --- a/main/config.c +++ b/main/config.c @@ -2197,10 +2197,10 @@ static struct ast_config *config_text_file_load(const char *database, const char lineno++; if (fgets(buf, sizeof(buf), f)) { /* Skip lines that are too long */ - if (strlen(buf) == sizeof(buf) - 1 && buf[sizeof(buf) - 1] != '\n') { + if (strlen(buf) == sizeof(buf) - 1 && buf[sizeof(buf) - 2] != '\n') { ast_log(LOG_WARNING, "Line %d too long, skipping. It begins with: %.32s...\n", lineno, buf); while (fgets(buf, sizeof(buf), f)) { - if (strlen(buf) != sizeof(buf) - 1 || buf[sizeof(buf) - 1] == '\n') { + if (strlen(buf) != sizeof(buf) - 1 || buf[sizeof(buf) - 2] == '\n') { break; } }