diff options
author | Kinsey Moore <kmoore@digium.com> | 2012-07-31 20:21:43 +0000 |
---|---|---|
committer | Kinsey Moore <kmoore@digium.com> | 2012-07-31 20:21:43 +0000 |
commit | 9b16c8b0f6c3b6310e303411421bfcb16b26c3c4 (patch) | |
tree | 273c31a834a21bd2239ec6b83cd35c602ea25d26 /channels | |
parent | 6c23a60f802e7708389b1a6463a40dc0500512bd (diff) |
Clean up and ensure proper usage of alloca()
This replaces all calls to alloca() with ast_alloca() which calls gcc's
__builtin_alloca() to avoid BSD semantics and removes all NULL checks
on memory allocated via ast_alloca() and ast_strdupa().
(closes issue ASTERISK-20125)
Review: https://reviewboard.asterisk.org/r/2032/
Patch-by: Walter Doekes (wdoekes)
........
Merged revisions 370642 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 370643 from http://svn.asterisk.org/svn/asterisk/branches/10
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@370655 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_alsa.c | 4 | ||||
-rw-r--r-- | channels/chan_dahdi.c | 2 | ||||
-rw-r--r-- | channels/chan_gtalk.c | 20 | ||||
-rw-r--r-- | channels/chan_iax2.c | 23 | ||||
-rw-r--r-- | channels/chan_jingle.c | 18 | ||||
-rw-r--r-- | channels/chan_sip.c | 13 | ||||
-rw-r--r-- | channels/sig_analog.c | 2 | ||||
-rw-r--r-- | channels/sig_pri.c | 2 | ||||
-rw-r--r-- | channels/sig_ss7.c | 2 |
9 files changed, 42 insertions, 44 deletions
diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c index e535a3adc..71d51adf4 100644 --- a/channels/chan_alsa.c +++ b/channels/chan_alsa.c @@ -182,7 +182,7 @@ static snd_pcm_t *alsa_card_init(char *dev, snd_pcm_stream_t stream) ast_debug(1, "Opening device %s in %s mode\n", dev, (stream == SND_PCM_STREAM_CAPTURE) ? "read" : "write"); } - hwparams = alloca(snd_pcm_hw_params_sizeof()); + hwparams = ast_alloca(snd_pcm_hw_params_sizeof()); memset(hwparams, 0, snd_pcm_hw_params_sizeof()); snd_pcm_hw_params_any(handle, hwparams); @@ -223,7 +223,7 @@ static snd_pcm_t *alsa_card_init(char *dev, snd_pcm_stream_t stream) if (err < 0) ast_log(LOG_ERROR, "Couldn't set the new hw params: %s\n", snd_strerror(err)); - swparams = alloca(snd_pcm_sw_params_sizeof()); + swparams = ast_alloca(snd_pcm_sw_params_sizeof()); memset(swparams, 0, snd_pcm_sw_params_sizeof()); snd_pcm_sw_params_current(handle, swparams); diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 28212e5ee..c0afc576a 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -4181,7 +4181,7 @@ static void dahdi_r2_on_call_disconnect(openr2_chan_t *r2chan, openr2_call_disco snprintf(cause_str, sizeof(cause_str), "R2 DISCONNECT (%s)", openr2_proto_get_disconnect_string(cause)); datalen += strlen(cause_str); - cause_code = alloca(datalen); + cause_code = ast_alloca(datalen); cause_code->ast_cause = dahdi_r2_cause_to_ast_cause(cause); ast_copy_string(cause_code->chan_name, ast_channel_name(p->owner), AST_CHANNEL_NAME); ast_copy_string(cause_code->code, cause_str, datalen + 1 - sizeof(*cause_code)); diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index e1d3ab491..9864f7884 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -1908,15 +1908,17 @@ static struct ast_channel *gtalk_request(const char *type, struct ast_format_cap if (data) { s = ast_strdupa(data); - if (s) { - sender = strsep(&s, "/"); - if (sender && (sender[0] != '\0')) { - to = strsep(&s, "/"); - } - if (!to) { - ast_log(LOG_ERROR, "Bad arguments in Gtalk Dialstring: %s\n", data); - return NULL; - } + sender = strsep(&s, "/"); + if (sender && (sender[0] != '\0')) { + to = strsep(&s, "/"); + } + if (!to) { + ast_log(LOG_ERROR, "Bad arguments in Gtalk Dialstring: %s\n", data); + return NULL; + } + if (!to) { + ast_log(LOG_ERROR, "Bad arguments in Gtalk Dialstring: %s\n", (char*) data); + return NULL; } } diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 70318a14c..51e777cd0 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -3084,10 +3084,7 @@ static int try_firmware(char *s) unsigned char sum[16], buf[1024]; char *s2, *last; - if (!(s2 = alloca(strlen(s) + 100))) { - ast_log(LOG_WARNING, "Alloca failed!\n"); - return -1; - } + s2 = ast_alloca(strlen(s) + 100); last = strrchr(s, '/'); if (last) @@ -6340,7 +6337,7 @@ static int decode_frame(ast_aes_decrypt_key *dcx, struct ast_iax2_full_hdr *fh, int padding; unsigned char *workspace; - workspace = alloca(*datalen); + workspace = ast_alloca(*datalen); memset(f, 0, sizeof(*f)); if (ntohs(fh->scallno) & IAX_FLAG_FULL) { struct ast_iax2_full_enc_hdr *efh = (struct ast_iax2_full_enc_hdr *)fh; @@ -6386,9 +6383,7 @@ static int encrypt_frame(ast_aes_encrypt_key *ecx, struct ast_iax2_full_hdr *fh, { int padding; unsigned char *workspace; - workspace = alloca(*datalen + 32); - if (!workspace) - return -1; + workspace = ast_alloca(*datalen + 32); if (ntohs(fh->scallno) & IAX_FLAG_FULL) { struct ast_iax2_full_enc_hdr *efh = (struct ast_iax2_full_enc_hdr *)fh; if (iaxdebug) @@ -10016,9 +10011,9 @@ static int socket_process_helper(struct iax2_thread *thread) char *using_prefs = "mine"; /* allocate an iax_frame with 4096 bytes of data buffer */ - fr = alloca(sizeof(*fr) + 4096); + fr = ast_alloca(sizeof(*fr) + 4096); memset(fr, 0, sizeof(*fr)); - fr->afdatalen = 4096; /* From alloca() above */ + fr->afdatalen = 4096; /* From ast_alloca() above */ /* Copy frequently used parameters to the stack */ res = thread->buf_len; @@ -10236,7 +10231,7 @@ static int socket_process_helper(struct iax2_thread *thread) /* add length of subclass */ data_size += strlen(subclass); - cause_code = alloca(data_size); + cause_code = ast_alloca(data_size); ast_copy_string(cause_code->chan_name, ast_channel_name(iaxs[fr->callno]->owner), AST_CHANNEL_NAME); cause_code->ast_cause = ies.causecode; @@ -12470,9 +12465,7 @@ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr) char *host; char *portstr; - if (!(tmp = ast_strdupa(srcaddr))) - return -1; - + tmp = ast_strdupa(srcaddr); ast_sockaddr_split_hostport(tmp, &host, &portstr, 0); if (portstr) { @@ -12935,7 +12928,7 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, st ast_append_acl(v->name, v->value, &user->acl, NULL, &subscribe_acl_change); } else if (!strcasecmp(v->name, "setvar")) { varname = ast_strdupa(v->value); - if (varname && (varval = strchr(varname,'='))) { + if ((varval = strchr(varname, '='))) { *varval = '\0'; varval++; if((tmpvar = ast_variable_new(varname, varval, ""))) { diff --git a/channels/chan_jingle.c b/channels/chan_jingle.c index 4f4af23fc..a3adb653a 100644 --- a/channels/chan_jingle.c +++ b/channels/chan_jingle.c @@ -1553,14 +1553,16 @@ static struct ast_channel *jingle_request(const char *type, struct ast_format_ca if (data) { s = ast_strdupa(data); - if (s) { - sender = strsep(&s, "/"); - if (sender && (sender[0] != '\0')) - to = strsep(&s, "/"); - if (!to) { - ast_log(LOG_ERROR, "Bad arguments in Jingle Dialstring: %s\n", data); - return NULL; - } + sender = strsep(&s, "/"); + if (sender && (sender[0] != '\0')) + to = strsep(&s, "/"); + if (!to) { + ast_log(LOG_ERROR, "Bad arguments in Jingle Dialstring: %s\n", data); + return NULL; + } + if (!to) { + ast_log(LOG_ERROR, "Bad arguments in Jingle Dialstring: %s\n", (char*) data); + return NULL; } } diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 6c2ff43fd..367aeee8e 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -5657,7 +5657,7 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer) /* Change the dialog callid. */ callid_size = strlen(tmpcall) + strlen(peer->fromdomain) + 2; - new_callid = alloca(callid_size); + new_callid = ast_alloca(callid_size); snprintf(new_callid, callid_size, "%s@%s", tmpcall, peer->fromdomain); change_callid_pvt(dialog, new_callid); } @@ -13829,7 +13829,7 @@ static void state_notify_build_xml(struct state_notify_data *data, int full, con cid_num = S_COR(ast_channel_caller(caller)->id.number.valid, ast_channel_caller(caller)->id.number.str, ""); need = strlen(cid_num) + strlen(p->fromdomain) + sizeof("sip:@"); - remote_target = alloca(need); + remote_target = ast_alloca(need); snprintf(remote_target, need, "sip:%s@%s", cid_num, p->fromdomain); remote_display = ast_strdupa(S_COR(ast_channel_caller(caller)->id.name.valid, @@ -13838,7 +13838,7 @@ static void state_notify_build_xml(struct state_notify_data *data, int full, con connected_num = S_COR(ast_channel_connected(caller)->id.number.valid, ast_channel_connected(caller)->id.number.str, ""); need = strlen(connected_num) + strlen(p->fromdomain) + sizeof("sip:@"); - local_target = alloca(need); + local_target = ast_alloca(need); snprintf(local_target, need, "sip:%s@%s", connected_num, p->fromdomain); local_display = ast_strdupa(S_COR(ast_channel_connected(caller)->id.name.valid, @@ -25025,7 +25025,8 @@ static int local_attended_transfer(struct sip_pvt *transferer, struct sip_dual * payload_size = ast_connected_line_build_data(connected_line_data, sizeof(connected_line_data), &connected_to_target, NULL); frame_size = payload_size + sizeof(*frame_payload); - if (payload_size != -1 && (frame_payload = alloca(frame_size))) { + if (payload_size != -1) { + frame_payload = ast_alloca(frame_size); frame_payload->payload_size = payload_size; memcpy(frame_payload->payload, connected_line_data, payload_size); frame_payload->action = AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO; @@ -27037,7 +27038,7 @@ static int handle_incoming(struct sip_pvt *p, struct sip_request *req, struct as int data_size = sizeof(*cause_code); /* size of the string making up the cause code is "SIP " + cause length */ data_size += 4 + strlen(REQ_OFFSET_TO_STR(req, rlpart2)); - cause_code = alloca(data_size); + cause_code = ast_alloca(data_size); ast_copy_string(cause_code->chan_name, ast_channel_name(p->owner), AST_CHANNEL_NAME); @@ -31734,7 +31735,7 @@ static int sip_addheader(struct ast_channel *chan, const char *data) } if (ok) { size_t len = strlen(inbuf); - subbuf = alloca(len + 1); + subbuf = ast_alloca(len + 1); ast_get_encoded_str(inbuf, subbuf, len + 1); pbx_builtin_setvar_helper(chan, varbuf, subbuf); if (sipdebug) { diff --git a/channels/sig_analog.c b/channels/sig_analog.c index 608f82b27..2b81eb460 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -2734,7 +2734,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_ data_size += 7; subclass = analog_event2str(res); data_size += strlen(subclass); - cause_code = alloca(data_size); + cause_code = ast_alloca(data_size); cause_code->ast_cause = AST_CAUSE_NORMAL_CLEARING; ast_copy_string(cause_code->chan_name, ast_channel_name(ast), AST_CHANNEL_NAME); snprintf(cause_code->code, data_size - sizeof(*cause_code) + 1, "ANALOG %s", subclass); diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 30d11e755..4bb4066e7 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -1286,7 +1286,7 @@ static void pri_queue_pvt_cause_data(struct sig_pri_span *pri, int chanpos, cons chan = pri->pvts[chanpos]->owner; if (chan) { int datalen = sizeof(*cause_code) + strlen(cause); - cause_code = alloca(datalen); + cause_code = ast_alloca(datalen); cause_code->ast_cause = ast_cause; ast_copy_string(cause_code->chan_name, ast_channel_name(chan), AST_CHANNEL_NAME); ast_copy_string(cause_code->code, cause, datalen + 1 - sizeof(*cause_code)); diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c index 810a0d5f2..1e4e7f308 100644 --- a/channels/sig_ss7.c +++ b/channels/sig_ss7.c @@ -389,7 +389,7 @@ static void ss7_queue_pvt_cause_data(struct ast_channel *owner, const char *caus struct ast_control_pvt_cause_code *cause_code; int datalen = sizeof(*cause_code) + strlen(cause); - cause_code = alloca(datalen); + cause_code = ast_alloca(datalen); cause_code->ast_cause = ast_cause; ast_copy_string(cause_code->chan_name, ast_channel_name(owner), AST_CHANNEL_NAME); ast_copy_string(cause_code->code, cause, datalen + 1 - sizeof(*cause_code)); |