[commit] r9985 - in freeswitch/trunk/src: . include mod/applications/mod_dptools mod/applications/mod_fifo mod/applications/mod_rss mod/applications/mod_voicemail mod/endpoints/mod_sofia mod/event_handlers/mod_cdr_csv mod/loggers/mod_logfile
Author: mikej Date: Sun Oct 12 17:51:51 2008 New Revision: 9985 Modified: freeswitch/trunk/src/include/switch_apr.h freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c freeswitch/trunk/src/mod/loggers/mod_logfile/mod_logfile.c freeswitch/trunk/src/switch_apr.c freeswitch/trunk/src/switch_channel.c freeswitch/trunk/src/switch_console.c freeswitch/trunk/src/switch_event.c freeswitch/trunk/src/switch_log.c freeswitch/trunk/src/switch_time.c Log: validate strftime format string input (when necessary) Modified: freeswitch/trunk/src/include/switch_apr.h ============================================================================== --- freeswitch/trunk/src/include/switch_apr.h (original) +++ freeswitch/trunk/src/include/switch_apr.h Sun Oct 12 17:51:51 2008 @@ -271,6 +271,16 @@ SWITCH_DECLARE(switch_status_t) switch_strftime(char *s, switch_size_t *retsize, switch_size_t max, const char *format, switch_time_exp_t *tm); /** + * formats the exploded time according to the format specified (does not validate format string) + * @param s string to write to + * @param retsize The length of the returned string + * @param max The maximum length of the string + * @param format The format for the time string + * @param tm The time to convert + */ +SWITCH_DECLARE(switch_status_t) switch_strftime_nocheck(char *s, switch_size_t *retsize, switch_size_t max, const char *format, switch_time_exp_t *tm); + +/** * switch_rfc822_date formats dates in the RFC822 * format in an efficient manner. It is a fixed length * format which requires the indicated amount of storage, Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c (original) +++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c Sun Oct 12 17:51:51 2008 @@ -1022,7 +1022,11 @@ thetime = switch_timestamp_now(); } switch_time_exp_lt(&tm, thetime); - switch_strftime(date, &retsize, sizeof(date), switch_strlen_zero(cmd) ? "%Y-%m-%d %T" : cmd, &tm); + if (switch_strlen_zero(cmd)) { + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + } else { + switch_strftime(date, &retsize, sizeof(date), cmd, &tm); + } stream->write_function(stream, "%s", date); return SWITCH_STATUS_SUCCESS; Modified: freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c (original) +++ freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c Sun Oct 12 17:51:51 2008 @@ -520,7 +520,7 @@ ts = switch_timestamp_now(); switch_time_exp_lt(&tm, ts); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); switch_channel_set_variable(channel, "fifo_status", "WAITING"); switch_channel_set_variable(channel, "fifo_timestamp", date); @@ -613,7 +613,7 @@ } else { ts = switch_timestamp_now(); switch_time_exp_lt(&tm, ts); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); switch_channel_set_variable(channel, "fifo_status", cd.do_orbit ? "TIMEOUT" : "ABORTED"); switch_channel_set_variable(channel, "fifo_timestamp", date); @@ -709,7 +709,7 @@ ts = switch_timestamp_now(); switch_time_exp_lt(&tm, ts); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); switch_channel_set_variable(channel, "fifo_status", "WAITING"); switch_channel_set_variable(channel, "fifo_timestamp", date); @@ -883,7 +883,7 @@ ts = switch_timestamp_now(); switch_time_exp_lt(&tm, ts); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); switch_channel_set_variable(channel, "fifo_status", "TALKING"); switch_channel_set_variable(channel, "fifo_target", uuid); switch_channel_set_variable(channel, "fifo_timestamp", date); @@ -910,7 +910,7 @@ ts = switch_timestamp_now(); switch_time_exp_lt(&tm, ts); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); switch_channel_set_variable(channel, "fifo_status", "WAITING"); switch_channel_set_variable(channel, "fifo_timestamp", date); Modified: freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c (original) +++ freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c Sun Oct 12 17:51:51 2008 @@ -480,7 +480,7 @@ char dtmf[5] = ""; switch_time_exp_lt(&tm, switch_timestamp_now()); - switch_strftime(date, &retsize, sizeof(date), "%I:%M %p", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%I:%M %p", &tm); switch_snprintf(buf, sizeof(buf), Modified: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c (original) +++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c Sun Oct 12 17:51:51 2008 @@ -2728,7 +2728,7 @@ free(dbuf); switch_time_exp_lt(&tm, ts); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); switch_channel_set_variable(channel, "RECORD_DATE", date); switch_channel_set_variable(channel, "RECORD_SOFTWARE", "FreeSWITCH"); switch_channel_set_variable(channel, "RECORD_TITLE", profile->record_title); @@ -3176,13 +3176,13 @@ if (l_created) { switch_time_exp_lt(&tm, l_created); - switch_strftime(create_date, &retsize, sizeof(create_date), fmt, &tm); - switch_strftime(rss_date, &retsize, sizeof(create_date), "%D %T", &tm); + switch_strftime_nocheck(create_date, &retsize, sizeof(create_date), fmt, &tm); + switch_strftime_nocheck(rss_date, &retsize, sizeof(create_date), "%D %T", &tm); } if (l_read) { switch_time_exp_lt(&tm, l_read); - switch_strftime(read_date, &retsize, sizeof(read_date), fmt, &tm); + switch_strftime_nocheck(read_date, &retsize, sizeof(read_date), fmt, &tm); } switch_snprintf(heard, sizeof(heard), *read_date == '\0' ? "never" : read_date); @@ -3256,13 +3256,13 @@ if (l_created) { switch_time_exp_lt(&tm, l_created); - switch_strftime(create_date, &retsize, sizeof(create_date), fmt, &tm); - switch_strftime(rss_date, &retsize, sizeof(create_date), fmt, &tm); + switch_strftime_nocheck(create_date, &retsize, sizeof(create_date), fmt, &tm); + switch_strftime_nocheck(rss_date, &retsize, sizeof(create_date), fmt, &tm); } if (l_read) { switch_time_exp_lt(&tm, l_read); - switch_strftime(read_date, &retsize, sizeof(read_date), fmt, &tm); + switch_strftime_nocheck(read_date, &retsize, sizeof(read_date), fmt, &tm); } holder->x_item = switch_xml_add_child_d(holder->x_channel, "item", holder->items++); Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c Sun Oct 12 17:51:51 2008 @@ -1251,7 +1251,7 @@ switch_size_t retsize; switch_time_exp_lt(&tm, switch_time_from_sec(etime)); - switch_strftime(exp_buf, &retsize, sizeof(exp_buf), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(exp_buf, &retsize, sizeof(exp_buf), "%Y-%m-%d %T", &tm); } cb->stream->write_function(cb->stream, Modified: freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c ============================================================================== --- freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c (original) +++ freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c Sun Oct 12 17:51:51 2008 @@ -100,7 +100,7 @@ if (globals.rotate) { switch_time_exp_lt(&tm, switch_timestamp_now()); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d-%H-%M-%S", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d-%H-%M-%S", &tm); len = strlen(fd->path) + strlen(date) + 2; p = switch_mprintf("%s.%s", fd->path, date); Modified: freeswitch/trunk/src/mod/loggers/mod_logfile/mod_logfile.c ============================================================================== --- freeswitch/trunk/src/mod/loggers/mod_logfile/mod_logfile.c (original) +++ freeswitch/trunk/src/mod/loggers/mod_logfile/mod_logfile.c Sun Oct 12 17:51:51 2008 @@ -125,7 +125,7 @@ switch_mutex_lock(globals.mutex); switch_time_exp_lt(&tm, switch_timestamp_now()); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d-%H-%M-%S", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d-%H-%M-%S", &tm); profile->log_size = 0; Modified: freeswitch/trunk/src/switch_apr.c ============================================================================== --- freeswitch/trunk/src/switch_apr.c (original) +++ freeswitch/trunk/src/switch_apr.c Sun Oct 12 17:51:51 2008 @@ -104,6 +104,57 @@ SWITCH_DECLARE(switch_status_t) switch_strftime(char *s, switch_size_t *retsize, switch_size_t max, const char *format, switch_time_exp_t *tm) { + const char *p = format; + + if (!p) return SWITCH_STATUS_FALSE; + + while (*p) { + if (*p == '%') { + switch (*(++p)) { + case 'C': + case 'D': + case 'r': + case 'R': + case 'T': + case 'e': + case 'a': + case 'A': + case 'b': + case 'B': + case 'c': + case 'd': + case 'H': + case 'I': + case 'j': + case 'm': + case 'M': + case 'p': + case 'S': + case 'U': + case 'w': + case 'W': + case 'x': + case 'X': + case 'y': + case 'Y': + case 'z': + case 'Z': + case '%': + p++; + continue; + case '\0': + default: + return SWITCH_STATUS_FALSE; + } + } + p++; + } + + return apr_strftime(s, retsize, max, format, (apr_time_exp_t *) tm); +} + +SWITCH_DECLARE(switch_status_t) switch_strftime_nocheck(char *s, switch_size_t *retsize, switch_size_t max, const char *format, switch_time_exp_t *tm) +{ return apr_strftime(s, retsize, max, format, (apr_time_exp_t *) tm); } Modified: freeswitch/trunk/src/switch_channel.c ============================================================================== --- freeswitch/trunk/src/switch_channel.c (original) +++ freeswitch/trunk/src/switch_channel.c Sun Oct 12 17:51:51 2008 @@ -2105,40 +2105,39 @@ cid_buf = caller_profile->caller_id_number; } - if (caller_profile->times) { switch_time_exp_t tm; switch_size_t retsize; const char *fmt = "%Y-%m-%d %T"; switch_time_exp_lt(&tm, caller_profile->times->created); - switch_strftime(start, &retsize, sizeof(start), fmt, &tm); + switch_strftime_nocheck(start, &retsize, sizeof(start), fmt, &tm); switch_channel_set_variable(channel, "start_stamp", start); switch_time_exp_lt(&tm, caller_profile->times->profile_created); - switch_strftime(profile_start, &retsize, sizeof(profile_start), fmt, &tm); + switch_strftime_nocheck(profile_start, &retsize, sizeof(profile_start), fmt, &tm); switch_channel_set_variable(channel, "profile_start_stamp", profile_start); if (caller_profile->times->answered) { switch_time_exp_lt(&tm, caller_profile->times->answered); - switch_strftime(answer, &retsize, sizeof(answer), fmt, &tm); + switch_strftime_nocheck(answer, &retsize, sizeof(answer), fmt, &tm); switch_channel_set_variable(channel, "answer_stamp", answer); } if (caller_profile->times->progress) { switch_time_exp_lt(&tm, caller_profile->times->progress); - switch_strftime(progress, &retsize, sizeof(progress), fmt, &tm); + switch_strftime_nocheck(progress, &retsize, sizeof(progress), fmt, &tm); switch_channel_set_variable(channel, "progress_stamp", progress); } if (caller_profile->times->progress_media) { switch_time_exp_lt(&tm, caller_profile->times->progress_media); - switch_strftime(progress_media, &retsize, sizeof(progress_media), fmt, &tm); + switch_strftime_nocheck(progress_media, &retsize, sizeof(progress_media), fmt, &tm); switch_channel_set_variable(channel, "progress_media_stamp", progress_media); } switch_time_exp_lt(&tm, caller_profile->times->hungup); - switch_strftime(end, &retsize, sizeof(end), fmt, &tm); + switch_strftime_nocheck(end, &retsize, sizeof(end), fmt, &tm); switch_channel_set_variable(channel, "end_stamp", end); tt_created = (time_t) (caller_profile->times->created / 1000000); Modified: freeswitch/trunk/src/switch_console.c ============================================================================== --- freeswitch/trunk/src/switch_console.c (original) +++ freeswitch/trunk/src/switch_console.c Sun Oct 12 17:51:51 2008 @@ -289,7 +289,7 @@ } switch_time_exp_lt(&tm, switch_timestamp_now()); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); if (channel == SWITCH_CHANNEL_ID_LOG) { fprintf(handle, "[%d] %s %s:%d %s() %s", (int) getpid(), date, filep, line, func, data); Modified: freeswitch/trunk/src/switch_event.c ============================================================================== --- freeswitch/trunk/src/switch_event.c (original) +++ freeswitch/trunk/src/switch_event.c Sun Oct 12 17:51:51 2008 @@ -1008,7 +1008,7 @@ switch_event_add_header_string(*event, SWITCH_STACK_BOTTOM, "FreeSWITCH-IPv6", guess_ip_v6); switch_time_exp_lt(&tm, ts); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); switch_event_add_header_string(*event, SWITCH_STACK_BOTTOM, "Event-Date-Local", date); switch_rfc822_date(date, ts); switch_event_add_header_string(*event, SWITCH_STACK_BOTTOM, "Event-Date-GMT", date); Modified: freeswitch/trunk/src/switch_log.c ============================================================================== --- freeswitch/trunk/src/switch_log.c (original) +++ freeswitch/trunk/src/switch_log.c Sun Oct 12 17:51:51 2008 @@ -265,7 +265,7 @@ switch_time_exp_t tm; switch_time_exp_lt(&tm, now); - switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); + switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); len = (uint32_t) (strlen(extra_fmt) + strlen(date) + strlen(filep) + 32 + strlen(funcp) + strlen(fmt)); new_fmt = malloc(len + 1); Modified: freeswitch/trunk/src/switch_time.c ============================================================================== --- freeswitch/trunk/src/switch_time.c (original) +++ freeswitch/trunk/src/switch_time.c Sun Oct 12 17:51:51 2008 @@ -571,7 +571,7 @@ if (tzdef) { /* The lookup of the zone may fail. */ tztime( &timep, tzdef, &tm ); tm2switchtime( &tm, &stm ); - switch_strftime(date, &retsize, len, switch_strlen_zero(format) ? "%Y-%m-%d %T" : format, &stm); + switch_strftime_nocheck(date, &retsize, len, switch_strlen_zero(format) ? "%Y-%m-%d %T" : format, &stm); if (!switch_strlen_zero_buf(date)) { return SWITCH_STATUS_SUCCESS; }
participants (1)
-
Freeswitch SVN