GCC12: Fixes for 16+

Most issues were in stringfields and had to do with comparing
a pointer to an constant/interned string with NULL.  Since the
string was a constant, a pointer to it could never be NULL so
the comparison was always "true".  gcc now complains about that.

There were also a few issues where determining if there was
enough space for a memcpy or s(n)printf which were fixed
by defining some of the involved variables as "volatile".

There were also a few other miscellaneous fixes.

ASTERISK-30044

Change-Id: Ia081ca1bcfb329df6487c4660aaf1944309eb570
This commit is contained in:
George Joseph
2022-05-03 06:57:58 -06:00
committed by Joshua Colp
parent 49108810d1
commit 4aa541683b
12 changed files with 74 additions and 46 deletions

View File

@@ -1652,6 +1652,7 @@ static const char *get_pattern_node(struct pattern_node *node, const char *src,
#undef INC_DST_OVERFLOW_CHECK
}
#define MAX_EXTENBUF_SIZE 512
static struct match_char *add_exten_to_pattern_tree(struct ast_context *con, struct ast_exten *e1, int findonly)
{
struct match_char *m1 = NULL;
@@ -1662,11 +1663,13 @@ static struct match_char *add_exten_to_pattern_tree(struct ast_context *con, str
int pattern = 0;
int idx_cur;
int idx_next;
char extenbuf[512];
char extenbuf[MAX_EXTENBUF_SIZE];
volatile size_t required_space = strlen(e1->exten) + 1;
struct pattern_node pat_node[2];
if (e1->matchcid) {
if (sizeof(extenbuf) < strlen(e1->exten) + strlen(e1->cidmatch) + 2) {
required_space += (strlen(e1->cidmatch) + 2 /* '/' + NULL */);
if (required_space > MAX_EXTENBUF_SIZE) {
ast_log(LOG_ERROR,
"The pattern %s/%s is too big to deal with: it will be ignored! Disaster!\n",
e1->exten, e1->cidmatch);
@@ -1674,7 +1677,13 @@ static struct match_char *add_exten_to_pattern_tree(struct ast_context *con, str
}
sprintf(extenbuf, "%s/%s", e1->exten, e1->cidmatch);/* Safe. We just checked. */
} else {
ast_copy_string(extenbuf, e1->exten, sizeof(extenbuf));
if (required_space > MAX_EXTENBUF_SIZE) {
ast_log(LOG_ERROR,
"The pattern %s/%s is too big to deal with: it will be ignored! Disaster!\n",
e1->exten, e1->cidmatch);
return NULL;
}
ast_copy_string(extenbuf, e1->exten, required_space);
}
#ifdef NEED_DEBUG

View File

@@ -370,7 +370,13 @@ int ast_stun_handle_packet(int s, struct sockaddr_in *src, unsigned char *data,
st.username ? st.username : "<none>");
if (st.username) {
append_attr_string(&attr, STUN_USERNAME, st.username, &resplen, &respleft);
snprintf(combined, sizeof(combined), "%16s%16s", st.username + 16, st.username);
/*
* For Google Voice, the stun username is made up of the local
* and remote usernames, each being fixed at 16 bytes. We have
* to swap the two at this point.
*/
snprintf(combined, 17, "%16s", st.username + 16);
snprintf(combined + 16, 17, "%16s", st.username);
} else {
combined[0] = '\0';
}