aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_iax2.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 0d46d7937..62370c7eb 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -9171,6 +9171,7 @@ static int socket_process(struct iax2_thread *thread)
int updatehistory=1;
int new = NEW_PREVENT;
int dcallno = 0;
+ char decrypted = 0;
struct ast_iax2_full_hdr *fh = (struct ast_iax2_full_hdr *)thread->buf;
struct ast_iax2_mini_hdr *mh = (struct ast_iax2_mini_hdr *)thread->buf;
struct ast_iax2_meta_hdr *meta = (struct ast_iax2_meta_hdr *)thread->buf;
@@ -9232,6 +9233,25 @@ static int socket_process(struct iax2_thread *thread)
/* Get the destination call number */
dcallno = ntohs(fh->dcallno) & ~IAX_FLAG_RETRANS;
+
+
+ /* check to make sure this full frame isn't encrypted before we attempt
+ * to look inside of it. If it is encrypted, decrypt it first. Its ok if the
+ * callno is not found here, that just means one hasn't been allocated for
+ * this connection yet. */
+ if ((dcallno != 1) && (fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, NEW_PREVENT, fd, 1))) {
+ ast_mutex_lock(&iaxsl[fr->callno]);
+ if (ast_test_flag(iaxs[fr->callno], IAX_ENCRYPTED)) {
+ if (decrypt_frame(fr->callno, fh, &f, &res)) {
+ ast_log(LOG_NOTICE, "Packet Decrypt Failed!\n");
+ ast_mutex_unlock(&iaxsl[fr->callno]);
+ return 1;
+ }
+ decrypted = 1;
+ }
+ ast_mutex_unlock(&iaxsl[fr->callno]);
+ }
+
/* Retrieve the type and subclass */
f.frametype = fh->type;
if (f.frametype == AST_FRAME_VIDEO) {
@@ -9343,17 +9363,18 @@ static int socket_process(struct iax2_thread *thread)
ast_mutex_unlock(&iaxsl[fr->callno]);
return 1;
}
- if (ast_test_flag(iaxs[fr->callno], IAX_ENCRYPTED)) {
+ if (ast_test_flag(iaxs[fr->callno], IAX_ENCRYPTED) && !decrypted) {
if (decrypt_frame(fr->callno, fh, &f, &res)) {
ast_log(LOG_NOTICE, "Packet Decrypt Failed!\n");
ast_mutex_unlock(&iaxsl[fr->callno]);
return 1;
}
+ decrypted = 1;
+ }
#ifdef DEBUG_SUPPORT
- else if (iaxdebug)
- iax_showframe(NULL, fh, 3, &sin, res - sizeof(*fh));
+ if (decrypted && iaxdebug)
+ iax_showframe(NULL, fh, 3, &sin, res - sizeof(*fh));
#endif
- }
/* count this frame */
iaxs[fr->callno]->frames_received++;