summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Peeler <jpeeler@digium.com>2010-01-18 22:31:25 +0000
committerJeff Peeler <jpeeler@digium.com>2010-01-18 22:31:25 +0000
commit568c057c4c03452c86aa70dc4593accee963745f (patch)
tree07b772f4a93f6e959ccf10510fee364dd143f4f6
parentbbd290308f67cdaaf3a7cc80b40f09cbe104a112 (diff)
Extend max call limit duration from 24.8 days to 292+ million years.
If the limit was set past MAX_INT upon answering, the call was immediately hung up due to overflow from the return of ast_tvdiff_ms (in ast_check_hangup). The time calculation functions ast_tvdiff_sec and ast_tvdiff_ms have been changed to return an int64_t to prevent overflow. Also the reporter suggested adding a message indicating the reason for the call hanging up. Given that the new limit is so much higher, the message (which would only really be useful in the overflow scenario) has been made a debug message only. (closes issue #16006) Reported by: viraptor git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@241143 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_dahdi.c4
-rw-r--r--channels/sig_analog.c2
-rw-r--r--include/asterisk/time.h6
-rw-r--r--main/channel.c1
-rw-r--r--main/enum.c2
-rw-r--r--main/features.c8
-rw-r--r--main/timing.c2
-rw-r--r--pbx/pbx_dundi.c4
8 files changed, 15 insertions, 14 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 2e15b84cf..59e097d42 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -7791,7 +7791,7 @@ winkflashdone:
(p->polarity == POLARITY_REV) &&
((ast->_state == AST_STATE_UP) || (ast->_state == AST_STATE_RING)) ) {
/* Added log_debug information below to provide a better indication of what is going on */
- ast_debug(1, "Polarity Reversal event occured - DEBUG 1: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %d\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) );
+ ast_debug(1, "Polarity Reversal event occured - DEBUG 1: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64 "\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) );
if (ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) > p->polarityonanswerdelay) {
ast_debug(1, "Polarity Reversal detected and now Hanging up on channel %d\n", p->channel);
@@ -7805,7 +7805,7 @@ winkflashdone:
ast_debug(1, "Ignoring Polarity switch to IDLE on channel %d, state %d\n", p->channel, ast->_state);
}
/* Added more log_debug information below to provide a better indication of what is going on */
- ast_debug(1, "Polarity Reversal event occured - DEBUG 2: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %d\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) );
+ ast_debug(1, "Polarity Reversal event occured - DEBUG 2: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64 "\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) );
break;
default:
ast_debug(1, "Dunno what to do with event %d on channel %d\n", res, p->channel);
diff --git a/channels/sig_analog.c b/channels/sig_analog.c
index cf9d066b3..9542bacec 100644
--- a/channels/sig_analog.c
+++ b/channels/sig_analog.c
@@ -3137,7 +3137,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
}
/* Added more log_debug information below to provide a better indication of what is going on */
- ast_debug(1, "Polarity Reversal event occured - DEBUG 2: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %d\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) );
+ ast_debug(1, "Polarity Reversal event occured - DEBUG 2: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64 "\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) );
break;
default:
ast_debug(1, "Dunno what to do with event %d on channel %d\n", res, p->channel);
diff --git a/include/asterisk/time.h b/include/asterisk/time.h
index 895d6df50..2ffc691b8 100644
--- a/include/asterisk/time.h
+++ b/include/asterisk/time.h
@@ -43,9 +43,9 @@ typedef typeof(tv.tv_usec) ast_suseconds_t;
* \return the difference in seconds
*/
AST_INLINE_API(
-int ast_tvdiff_sec(struct timeval end, struct timeval start),
+int64_t ast_tvdiff_sec(struct timeval end, struct timeval start),
{
- int result = end.tv_sec - start.tv_sec;
+ int64_t result = end.tv_sec - start.tv_sec;
if (result > 0 && end.tv_usec < start.tv_usec)
result--;
else if (result < 0 && end.tv_usec > start.tv_usec)
@@ -76,7 +76,7 @@ int64_t ast_tvdiff_us(struct timeval end, struct timeval start),
* \return the difference in milliseconds
*/
AST_INLINE_API(
-int ast_tvdiff_ms(struct timeval end, struct timeval start),
+int64_t ast_tvdiff_ms(struct timeval end, struct timeval start),
{
/* the offset by 1,000,000 below is intentional...
it avoids differences in the way that division
diff --git a/main/channel.c b/main/channel.c
index 657b05353..0f39510b3 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -479,6 +479,7 @@ int ast_check_hangup(struct ast_channel *chan)
return 0;
if (ast_tvdiff_ms(chan->whentohangup, ast_tvnow()) > 0) /* no if hangup time has not come yet. */
return 0;
+ ast_debug(4, "Hangup time has come: %" PRIi64 "\n", ast_tvdiff_ms(chan->whentohangup, ast_tvnow()));
chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
return 1;
}
diff --git a/main/enum.c b/main/enum.c
index 416bb9072..1d65152df 100644
--- a/main/enum.c
+++ b/main/enum.c
@@ -851,7 +851,7 @@ int ast_get_enum(struct ast_channel *chan, const char *number, char *dst, int ds
ret = ast_search_dns(context, tmp, C_IN, T_NAPTR, enum_callback);
time_end = ast_tvnow();
- ast_verb(2, "ast_get_enum() profiling: %s, %s, %d ms\n",
+ ast_verb(2, "ast_get_enum() profiling: %s, %s, %" PRIi64 " ms\n",
(ret == 0) ? "OK" : "FAIL", tmp, ast_tvdiff_ms(time_end, time_start));
if (ret < 0) {
diff --git a/main/features.c b/main/features.c
index 3e8255de6..36c90dadb 100644
--- a/main/features.c
+++ b/main/features.c
@@ -4923,12 +4923,12 @@ int ast_bridge_timelimit(struct ast_channel *chan, struct ast_bridge_config *con
config->timelimit = play_to_caller = play_to_callee =
config->play_warning = config->warning_freq = 0;
} else {
- ast_verb(3, "Limit Data for this call:\n");
- ast_verb(4, "timelimit = %ld\n", config->timelimit);
- ast_verb(4, "play_warning = %ld\n", config->play_warning);
+ ast_verb(4, "Limit Data for this call:\n");
+ ast_verb(4, "timelimit = %ld ms (%.3lf s)\n", config->timelimit, config->timelimit / 1000.0);
+ ast_verb(4, "play_warning = %ld ms (%.3lf s)\n", config->play_warning, config->play_warning / 1000.0);
ast_verb(4, "play_to_caller = %s\n", play_to_caller ? "yes" : "no");
ast_verb(4, "play_to_callee = %s\n", play_to_callee ? "yes" : "no");
- ast_verb(4, "warning_freq = %ld\n", config->warning_freq);
+ ast_verb(4, "warning_freq = %ld ms (%.3lf s)\n", config->warning_freq, config->warning_freq / 1000.0);
ast_verb(4, "start_sound = %s\n", S_OR(config->start_sound, ""));
ast_verb(4, "warning_sound = %s\n", config->warning_sound);
ast_verb(4, "end_sound = %s\n", S_OR(config->end_sound, ""));
diff --git a/main/timing.c b/main/timing.c
index 751008ecf..d15024b32 100644
--- a/main/timing.c
+++ b/main/timing.c
@@ -270,7 +270,7 @@ static char *timing_test(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
ast_timer_close(timer);
- ast_cli(a->fd, "It has been %d milliseconds, and we got %d timer ticks\n",
+ ast_cli(a->fd, "It has been %" PRIi64 " milliseconds, and we got %d timer ticks\n",
ast_tvdiff_ms(end, start), count);
return CLI_SUCCESS;
diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c
index 68050a8ed..2b57002f3 100644
--- a/pbx/pbx_dundi.c
+++ b/pbx/pbx_dundi.c
@@ -2393,7 +2393,7 @@ static char *dundi_do_lookup(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
ast_cli(a->fd, "%3d. %5d %s/%s (%s)\n", x + 1, dr[x].weight, dr[x].tech, dr[x].dest, dundi_flags2str(fs, sizeof(fs), dr[x].flags));
ast_cli(a->fd, " from %s, expires in %d s\n", dr[x].eid_str, dr[x].expiration);
}
- ast_cli(a->fd, "DUNDi lookup completed in %d ms\n", ast_tvdiff_ms(ast_tvnow(), start));
+ ast_cli(a->fd, "DUNDi lookup completed in %" PRIi64 " ms\n", ast_tvdiff_ms(ast_tvnow(), start));
return CLI_SUCCESS;
}
@@ -2430,7 +2430,7 @@ static char *dundi_do_precache(struct ast_cli_entry *e, int cmd, struct ast_cli_
ast_cli(a->fd, "DUNDi precache returned error.\n");
else if (!res)
ast_cli(a->fd, "DUNDi precache returned no error.\n");
- ast_cli(a->fd, "DUNDi lookup completed in %d ms\n", ast_tvdiff_ms(ast_tvnow(), start));
+ ast_cli(a->fd, "DUNDi lookup completed in %" PRIi64 " ms\n", ast_tvdiff_ms(ast_tvnow(), start));
return CLI_SUCCESS;
}