mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-16 14:58:25 +00:00
Merge "pbx.c: Fix crash from malformed exten pattern."
This commit is contained in:
55
main/pbx.c
55
main/pbx.c
@@ -657,7 +657,7 @@ static int ast_add_extension2_lockopt(struct ast_context *con,
|
||||
static struct ast_context *find_context_locked(const char *context);
|
||||
static struct ast_context *find_context(const char *context);
|
||||
static void get_device_state_causing_channels(struct ao2_container *c);
|
||||
static int ext_strncpy(char *dst, const char *src, int len, int nofluff);
|
||||
static unsigned int ext_strncpy(char *dst, const char *src, size_t dst_size, int nofluff);
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
@@ -6980,32 +6980,51 @@ int ast_async_goto_by_name(const char *channame, const char *context, const char
|
||||
return res;
|
||||
}
|
||||
|
||||
/*! \brief copy a string skipping whitespace and dashes */
|
||||
static int ext_strncpy(char *dst, const char *src, int len, int nofluff)
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Copy a string skipping whitespace and optionally dashes.
|
||||
*
|
||||
* \param dst Destination buffer to copy src string.
|
||||
* \param src Null terminated string to copy.
|
||||
* \param dst_size Number of bytes in the dst buffer.
|
||||
* \param nofluf Nonzero if '-' chars are not copied.
|
||||
*
|
||||
* \return Number of bytes written to dst including null terminator.
|
||||
*/
|
||||
static unsigned int ext_strncpy(char *dst, const char *src, size_t dst_size, int nofluff)
|
||||
{
|
||||
int count = 0;
|
||||
int insquares = 0;
|
||||
unsigned int count;
|
||||
unsigned int insquares;
|
||||
unsigned int is_pattern;
|
||||
|
||||
while (*src && (count < len - 1)) {
|
||||
if (!dst_size--) {
|
||||
/* There really is no dst buffer */
|
||||
return 0;
|
||||
}
|
||||
|
||||
count = 0;
|
||||
insquares = 0;
|
||||
is_pattern = *src == '_';
|
||||
while (*src && count < dst_size) {
|
||||
if (*src == '[') {
|
||||
insquares = 1;
|
||||
if (is_pattern) {
|
||||
insquares = 1;
|
||||
}
|
||||
} else if (*src == ']') {
|
||||
insquares = 0;
|
||||
} else if (*src == ' ' && !insquares) {
|
||||
src++;
|
||||
++src;
|
||||
continue;
|
||||
} else if (*src == '-' && !insquares && nofluff) {
|
||||
src++;
|
||||
++src;
|
||||
continue;
|
||||
}
|
||||
*dst = *src;
|
||||
dst++;
|
||||
src++;
|
||||
count++;
|
||||
*dst++ = *src++;
|
||||
++count;
|
||||
}
|
||||
*dst = '\0';
|
||||
|
||||
return count;
|
||||
return count + 1;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -7322,10 +7341,10 @@ static int ast_add_extension2_lockopt(struct ast_context *con,
|
||||
p += strlen(label) + 1;
|
||||
}
|
||||
tmp->name = p;
|
||||
p += ext_strncpy(p, extension, strlen(extension) + 1, 0) + 1;
|
||||
p += ext_strncpy(p, extension, strlen(extension) + 1, 0);
|
||||
if (exten_fluff) {
|
||||
tmp->exten = p;
|
||||
p += ext_strncpy(p, extension, strlen(extension) + 1, 1) + 1;
|
||||
p += ext_strncpy(p, extension, strlen(extension) + 1 - exten_fluff, 1);
|
||||
} else {
|
||||
/* no fluff, we don't need a copy. */
|
||||
tmp->exten = tmp->name;
|
||||
@@ -7335,10 +7354,10 @@ static int ast_add_extension2_lockopt(struct ast_context *con,
|
||||
|
||||
/* Blank callerid and NULL callerid are two SEPARATE things. Do NOT confuse the two!!! */
|
||||
if (callerid) {
|
||||
p += ext_strncpy(p, callerid, strlen(callerid) + 1, 0) + 1;
|
||||
p += ext_strncpy(p, callerid, strlen(callerid) + 1, 0);
|
||||
if (callerid_fluff) {
|
||||
tmp->cidmatch = p;
|
||||
p += ext_strncpy(p, callerid, strlen(callerid) + 1, 1) + 1;
|
||||
p += ext_strncpy(p, callerid, strlen(callerid) + 1 - callerid_fluff, 1);
|
||||
}
|
||||
tmp->matchcid = AST_EXT_MATCHCID_ON;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user