]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Extend max call limit duration from 24.8 days to 292+ million years.
authorJeff Peeler <jpeeler@digium.com>
Mon, 18 Jan 2010 22:31:25 +0000 (22:31 +0000)
committerJeff Peeler <jpeeler@digium.com>
Mon, 18 Jan 2010 22:31:25 +0000 (22:31 +0000)
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

channels/chan_dahdi.c
channels/sig_analog.c
include/asterisk/time.h
main/channel.c
main/enum.c
main/features.c
main/timing.c
pbx/pbx_dundi.c

index 2e15b84cf081fa568f7856d09b52b3b147c3d53c..59e097d424be79914b4221bf81302cc359dcc36f 100644 (file)
@@ -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);
index cf9d066b3e319912c7f48c29e6f62b0bb0c1a116..9542bacec87e713362e586dd78dfd79dec0b35d5 100644 (file)
@@ -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);
index 895d6df50357815b0d158f135a8eef8ed6b73a0a..2ffc691b8456bac32bac4fa6ef6948a1721ca62e 100644 (file)
@@ -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
index 657b0535352f2275714fbc8ee5d57eed060ec4d9..0f39510b3d7067979493755340a92e58513c121c 100644 (file)
@@ -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;
 }
index 416bb90722029dd0c12386c8249ac15314d8e1e4..1d65152df9a161b65fdb92c74ae7b689cc7ea771 100644 (file)
@@ -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) {
index 3e8255de6ad2ffbcae53a7770fbcea15bfc98681..36c90dadbb72d7d4f3b39c087d8504ed9fe9abce 100644 (file)
@@ -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, ""));
index 751008ecf96fe8522582ffefc523d4564f353dd9..d15024b32e638ffedca58df9321e1365e187a22f 100644 (file)
@@ -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;
index 68050a8edd2ff30fad5f567382a3c29c78d548d9..2b57002f3fbd2269703c408d9f2019d57e4c0f54 100644 (file)
@@ -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;
 }