<p>Kevin Harwell <strong>submitted</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/18013">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Joshua Colp: Looks good to me, but someone else must approve
  Kevin Harwell: Looks good to me, approved; Approved for Submit

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">time: add support for time64 libcs<br><br>Treat time_t's as entirely unique and use the POSIX API's for<br>converting to/from strings.<br><br>Lastly, a 64-bit integer formats as 20 digits at most in base10.<br>Don't need to have any 100 byte buffers to hold that.<br><br>ASTERISK-29674 #close<br><br>Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com><br>Change-Id: Id7b25bdca8f92e34229f6454f6c3e500f2cd6f56<br>---<br>M include/asterisk/time.h<br>M main/Makefile<br>M main/time.c<br>M res/res_calendar_caldav.c<br>M res/res_calendar_icalendar.c<br>M res/res_http_media_cache.c<br>M res/res_odbc.c<br>M res/res_pjsip/location.c<br>M res/res_pjsip/pjsip_options.c<br>M res/res_pjsip_history.c<br>M res/res_pjsip_pubsub.c<br>M res/res_pjsip_registrar.c<br>M res/res_stir_shaken.c<br>13 files changed, 94 insertions(+), 26 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/time.h b/include/asterisk/time.h</span><br><span>index e2ab513..3e0c064 100644</span><br><span>--- a/include/asterisk/time.h</span><br><span>+++ b/include/asterisk/time.h</span><br><span>@@ -35,6 +35,13 @@</span><br><span> </span><br><span> #include "asterisk/inline_api.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* A time_t can be represented as an unsigned long long (or uint64_t).</span><br><span style="color: hsl(120, 100%, 40%);">+ * Formatted in base 10, UINT64_MAX is 20 digits long, plus one for NUL.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This should be the size of the receiving char buffer for calls to</span><br><span style="color: hsl(120, 100%, 40%);">+ * ast_time_t_to_string().</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AST_TIME_T_LEN               21</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* We have to let the compiler learn what types to use for the elements of a</span><br><span>    struct timeval since on linux, it's time_t and suseconds_t, but on *BSD,</span><br><span>    they are just a long.</span><br><span>@@ -316,4 +323,17 @@</span><br><span>  */</span><br><span> struct timeval ast_time_create_by_unit_str(unsigned long val, const char *unit);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Converts to a string representation of a time_t as decimal</span><br><span style="color: hsl(120, 100%, 40%);">+ * seconds since the epoch. Returns -1 on failure, zero otherwise.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The buffer should be at least 22 bytes long.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_time_t_to_string(time_t time, char *buf, size_t length);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Returns a time_t from a string containing seconds since the epoch.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+time_t ast_string_to_time_t(const char *str);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _ASTERISK_TIME_H */</span><br><span>diff --git a/main/Makefile b/main/Makefile</span><br><span>index 299998c..9f31a3a 100644</span><br><span>--- a/main/Makefile</span><br><span>+++ b/main/Makefile</span><br><span>@@ -169,6 +169,7 @@</span><br><span> tcptls.o: _ASTCFLAGS+=$(OPENSSL_INCLUDE) -Wno-deprecated-declarations</span><br><span> uuid.o: _ASTCFLAGS+=$(UUID_INCLUDE)</span><br><span> stasis.o: _ASTCFLAGS+=$(call get_menuselect_cflags,AO2_DEBUG)</span><br><span style="color: hsl(120, 100%, 40%);">+time.o: _ASTCFLAGS+=-D_XOPEN_SOURCE=700</span><br><span> </span><br><span> </span><br><span> OBJS:=$(sort $(OBJS))</span><br><span>diff --git a/main/time.c b/main/time.c</span><br><span>index 266c5cf..7babafe 100644</span><br><span>--- a/main/time.c</span><br><span>+++ b/main/time.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> </span><br><span> #include <inttypes.h></span><br><span> #include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <strings.h></span><br><span> #include <time.h></span><br><span> </span><br><span> #include "asterisk/time.h"</span><br><span>@@ -143,3 +144,31 @@</span><br><span> {</span><br><span>       return ast_time_create_by_unit(val, ast_time_str_to_unit(unit));</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Returns a string representation of a time_t as decimal seconds</span><br><span style="color: hsl(120, 100%, 40%);">+ * since the epoch.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_time_t_to_string(time_t time, char *buf, size_t length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct tm tm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       localtime_r(&time, &tm);</span><br><span style="color: hsl(120, 100%, 40%);">+      return (strftime(buf, length, "%s", &tm) == 0) ? -1 : 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Returns a time_t from a string containing seconds since the epoch.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+time_t ast_string_to_time_t(const char *str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct tm tm = { 0, };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* handle leading spaces */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (strptime(str, " %s", &tm) == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return (time_t)-1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     tm.tm_isdst = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     return mktime(&tm);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/res/res_calendar_caldav.c b/res/res_calendar_caldav.c</span><br><span>index 9bdde0e..a5266f3 100644</span><br><span>--- a/res/res_calendar_caldav.c</span><br><span>+++ b/res/res_calendar_caldav.c</span><br><span>@@ -404,8 +404,8 @@</span><br><span>          if (!ast_strlen_zero(event->summary)) {</span><br><span>                   ast_string_field_set(event, uid, event->summary);</span><br><span>                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        char tmp[100];</span><br><span style="color: hsl(0, 100%, 40%);">-                  snprintf(tmp, sizeof(tmp), "%ld", event->start);</span><br><span style="color: hsl(120, 100%, 40%);">+                 char tmp[AST_TIME_T_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+                     ast_time_t_to_string(event->start, tmp, sizeof(tmp));</span><br><span>                     ast_string_field_set(event, uid, tmp);</span><br><span>               }</span><br><span>    }</span><br><span>diff --git a/res/res_calendar_icalendar.c b/res/res_calendar_icalendar.c</span><br><span>index 999cf0e..cab8cf6 100644</span><br><span>--- a/res/res_calendar_icalendar.c</span><br><span>+++ b/res/res_calendar_icalendar.c</span><br><span>@@ -245,8 +245,8 @@</span><br><span>                 if (!ast_strlen_zero(event->summary)) {</span><br><span>                   ast_string_field_set(event, uid, event->summary);</span><br><span>                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        char tmp[100];</span><br><span style="color: hsl(0, 100%, 40%);">-                  snprintf(tmp, sizeof(tmp), "%ld", event->start);</span><br><span style="color: hsl(120, 100%, 40%);">+                 char tmp[AST_TIME_T_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+                     ast_time_t_to_string(event->start, tmp, sizeof(tmp));</span><br><span>                     ast_string_field_set(event, uid, tmp);</span><br><span>               }</span><br><span>    }</span><br><span>diff --git a/res/res_http_media_cache.c b/res/res_http_media_cache.c</span><br><span>index 2bace1e..cd5fe42 100644</span><br><span>--- a/res/res_http_media_cache.c</span><br><span>+++ b/res/res_http_media_cache.c</span><br><span>@@ -116,7 +116,7 @@</span><br><span> static void bucket_file_set_expiration(struct ast_bucket_file *bucket_file)</span><br><span> {</span><br><span>     struct ast_bucket_metadata *metadata;</span><br><span style="color: hsl(0, 100%, 40%);">-   char time_buf[32];</span><br><span style="color: hsl(120, 100%, 40%);">+    char time_buf[32], secs[AST_TIME_T_LEN];</span><br><span>     struct timeval actual_expires = ast_tvnow();</span><br><span> </span><br><span>     metadata = ast_bucket_file_metadata_get(bucket_file, "cache-control");</span><br><span>@@ -150,7 +150,8 @@</span><br><span>       }</span><br><span> </span><br><span>        /* Use 'now' if we didn't get an expiration time */</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(time_buf, sizeof(time_buf), "%30lu", actual_expires.tv_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_time_t_to_string(actual_expires.tv_sec, secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+      snprintf(time_buf, sizeof(time_buf), "%30s", secs);</span><br><span> </span><br><span>    ast_bucket_file_metadata_set(bucket_file, "__actual_expires", time_buf);</span><br><span> }</span><br><span>@@ -304,7 +305,7 @@</span><br><span>                return 1;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (sscanf(metadata->value, "%lu", &expires.tv_sec) != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if ((expires.tv_sec = ast_string_to_time_t(metadata->value)) == -1) {</span><br><span>             return 1;</span><br><span>    }</span><br><span> </span><br><span>diff --git a/res/res_odbc.c b/res/res_odbc.c</span><br><span>index 63fdf37..54037f9 100644</span><br><span>--- a/res/res_odbc.c</span><br><span>+++ b/res/res_odbc.c</span><br><span>@@ -1029,7 +1029,9 @@</span><br><span>   /* Dont connect while server is marked as unreachable via negative_connection_cache */</span><br><span>       negative_cache_expiration = obj->parent->last_negative_connect.tv_sec + obj->parent->negative_connection_cache.tv_sec;</span><br><span>   if (time(NULL) < negative_cache_expiration) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_WARNING, "Not connecting to %s. Negative connection cache for %ld seconds\n", obj->parent->name, negative_cache_expiration - time(NULL));</span><br><span style="color: hsl(120, 100%, 40%);">+         char secs[AST_TIME_T_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+            ast_time_t_to_string(negative_cache_expiration - time(NULL), secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_log(LOG_WARNING, "Not connecting to %s. Negative connection cache for %s seconds\n", obj->parent->name, secs);</span><br><span>           return ODBC_FAIL;</span><br><span>    }</span><br><span> </span><br><span>diff --git a/res/res_pjsip/location.c b/res/res_pjsip/location.c</span><br><span>index bae8a2d..a507b89 100644</span><br><span>--- a/res/res_pjsip/location.c</span><br><span>+++ b/res/res_pjsip/location.c</span><br><span>@@ -489,7 +489,10 @@</span><br><span> static int expiration_struct2str(const void *obj, const intptr_t *args, char **buf)</span><br><span> {</span><br><span>        const struct ast_sip_contact *contact = obj;</span><br><span style="color: hsl(0, 100%, 40%);">-    return (ast_asprintf(buf, "%ld", contact->expiration_time.tv_sec) < 0) ? -1 : 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      char secs[AST_TIME_T_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_time_t_to_string(contact->expiration_time.tv_sec, secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+ return (ast_asprintf(buf, "%s", secs) < 0) ? -1 : 0;</span><br><span> }</span><br><span> </span><br><span> static int permanent_uri_sort_fn(const void *obj_left, const void *obj_right, int flags)</span><br><span>diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c</span><br><span>index e1f048e..14013ad 100644</span><br><span>--- a/res/res_pjsip/pjsip_options.c</span><br><span>+++ b/res/res_pjsip/pjsip_options.c</span><br><span>@@ -2722,6 +2722,7 @@</span><br><span>      struct ast_sip_contact_status *status;</span><br><span>       struct ast_str *buf;</span><br><span>         const struct ast_sip_endpoint *endpoint = ami->arg;</span><br><span style="color: hsl(120, 100%, 40%);">+        char secs[AST_TIME_T_LEN];</span><br><span> </span><br><span>       buf = ast_sip_create_ami_event("ContactStatusDetail", ami);</span><br><span>        if (!buf) {</span><br><span>@@ -2733,7 +2734,8 @@</span><br><span>  ast_str_append(&buf, 0, "AOR: %s\r\n", wrapper->aor_id);</span><br><span>    ast_str_append(&buf, 0, "URI: %s\r\n", contact->uri);</span><br><span>       ast_str_append(&buf, 0, "UserAgent: %s\r\n", contact->user_agent);</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_str_append(&buf, 0, "RegExpire: %ld\r\n", contact->expiration_time.tv_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_time_t_to_string(contact->expiration_time.tv_sec, secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_str_append(&buf, 0, "RegExpire: %s\r\n", secs);</span><br><span>    if (!ast_strlen_zero(contact->via_addr)) {</span><br><span>                ast_str_append(&buf, 0, "ViaAddress: %s", contact->via_addr);</span><br><span>               if (contact->via_port) {</span><br><span>diff --git a/res/res_pjsip_history.c b/res/res_pjsip_history.c</span><br><span>index de1063b..9da0af4 100644</span><br><span>--- a/res/res_pjsip_history.c</span><br><span>+++ b/res/res_pjsip_history.c</span><br><span>@@ -199,7 +199,7 @@</span><br><span>   {</span><br><span>            struct timeval right = { 0, };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              if (sscanf(op_right->field, "%ld", &right.tv_sec) != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if ((right.tv_sec = ast_string_to_time_t(op_right->field)) == -1) {</span><br><span>                       ast_log(LOG_WARNING, "Unable to extract field '%s': not a timestamp\n", op_right->field);</span><br><span>                       return -1;</span><br><span>           }</span><br><span>@@ -270,7 +270,7 @@</span><br><span>      {</span><br><span>            struct timeval right = { 0, };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              if (sscanf(op_right->field, "%ld", &right.tv_sec) != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if ((right.tv_sec = ast_string_to_time_t(op_right->field)) == -1) {</span><br><span>                       ast_log(LOG_WARNING, "Unable to extract field '%s': not a timestamp\n", op_right->field);</span><br><span>                       return -1;</span><br><span>           }</span><br><span>@@ -319,7 +319,7 @@</span><br><span>      {</span><br><span>            struct timeval right = { 0, };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              if (sscanf(op_right->field, "%ld", &right.tv_sec) != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if ((right.tv_sec = ast_string_to_time_t(op_right->field)) == -1) {</span><br><span>                       ast_log(LOG_WARNING, "Unable to extract field '%s': not a timestamp\n", op_right->field);</span><br><span>                       return -1;</span><br><span>           }</span><br><span>@@ -656,7 +656,7 @@</span><br><span> /*! \brief Format single line history entry */</span><br><span> static void sprint_list_entry(struct pjsip_history_entry *entry, char *line, int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char addr[64];</span><br><span style="color: hsl(120, 100%, 40%);">+        char addr[64], secs[AST_TIME_T_LEN];</span><br><span> </span><br><span>     if (entry->transmitted) {</span><br><span>                 pj_sockaddr_print(&entry->dst, addr, sizeof(addr), 3);</span><br><span>@@ -664,22 +664,24 @@</span><br><span>                pj_sockaddr_print(&entry->src, addr, sizeof(addr), 3);</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ ast_time_t_to_string(entry->timestamp.tv_sec, secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      if (entry->msg->type == PJSIP_REQUEST_MSG) {</span><br><span>           char uri[128];</span><br><span> </span><br><span>           pjsip_uri_print(PJSIP_URI_IN_REQ_URI, entry->msg->line.req.uri, uri, sizeof(uri));</span><br><span style="color: hsl(0, 100%, 40%);">-                snprintf(line, len, "%-5.5d %-10.10ld %-5.5s %-24.24s %.*s %s SIP/2.0",</span><br><span style="color: hsl(120, 100%, 40%);">+             snprintf(line, len, "%-5.5d %-10.10s %-5.5s %-24.24s %.*s %s SIP/2.0",</span><br><span>                     entry->number,</span><br><span style="color: hsl(0, 100%, 40%);">-                       entry->timestamp.tv_sec,</span><br><span style="color: hsl(120, 100%, 40%);">+                   secs,</span><br><span>                        entry->transmitted ? "* ==>" : "* <==",</span><br><span>                         addr,</span><br><span>                        (int)pj_strlen(&entry->msg->line.req.method.name),</span><br><span>                         pj_strbuf(&entry->msg->line.req.method.name),</span><br><span>                      uri);</span><br><span>        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                snprintf(line, len, "%-5.5d %-10.10ld %-5.5s %-24.24s SIP/2.0 %u %.*s",</span><br><span style="color: hsl(120, 100%, 40%);">+             snprintf(line, len, "%-5.5d %-10.10s %-5.5s %-24.24s SIP/2.0 %u %.*s",</span><br><span>                     entry->number,</span><br><span style="color: hsl(0, 100%, 40%);">-                       entry->timestamp.tv_sec,</span><br><span style="color: hsl(120, 100%, 40%);">+                   secs,</span><br><span>                        entry->transmitted ? "* ==>" : "* <==",</span><br><span>                         addr,</span><br><span>                        entry->msg->line.status.code,</span><br><span>@@ -1149,7 +1151,7 @@</span><br><span> /*! \brief Print a detailed view of a single entry in the history to the CLI */</span><br><span> static void display_single_entry(struct ast_cli_args *a, struct pjsip_history_entry *entry)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      char addr[64];</span><br><span style="color: hsl(120, 100%, 40%);">+        char addr[64], secs[AST_TIME_T_LEN];</span><br><span>         char *buf;</span><br><span> </span><br><span>       buf = ast_calloc(1, PJSIP_MAX_PKT_LEN * sizeof(char));</span><br><span>@@ -1169,11 +1171,12 @@</span><br><span>             pj_sockaddr_print(&entry->src, addr, sizeof(addr), 3);</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   ast_cli(a->fd, "<--- History Entry %d %s %s at %-10.10ld --->\n",</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_time_t_to_string(entry->timestamp.tv_sec, secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_cli(a->fd, "<--- History Entry %d %s %s at %-10.10s --->\n",</span><br><span>          entry->number,</span><br><span>            entry->transmitted ? "Sent to" : "Received from",</span><br><span>             addr,</span><br><span style="color: hsl(0, 100%, 40%);">-           entry->timestamp.tv_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+          secs);</span><br><span>       ast_cli(a->fd, "%s\n", buf);</span><br><span> </span><br><span>        ast_free(buf);</span><br><span>diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c</span><br><span>index 1d13695..5cccdcc 100644</span><br><span>--- a/res/res_pjsip_pubsub.c</span><br><span>+++ b/res/res_pjsip_pubsub.c</span><br><span>@@ -4879,7 +4879,11 @@</span><br><span> static int persistence_expires_struct2str(const void *obj, const intptr_t *args, char **buf)</span><br><span> {</span><br><span>    const struct subscription_persistence *persistence = obj;</span><br><span style="color: hsl(0, 100%, 40%);">-       return (ast_asprintf(buf, "%ld", persistence->expires.tv_sec) < 0) ? -1 : 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  char secs[AST_TIME_T_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_time_t_to_string(persistence->expires.tv_sec, secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return (ast_asprintf(buf, "%s", secs) < 0) ? -1 : 0;</span><br><span> }</span><br><span> </span><br><span> #define RESOURCE_LIST_INIT_SIZE 4</span><br><span>diff --git a/res/res_pjsip_registrar.c b/res/res_pjsip_registrar.c</span><br><span>index 9c999c1..f2b785b 100644</span><br><span>--- a/res/res_pjsip_registrar.c</span><br><span>+++ b/res/res_pjsip_registrar.c</span><br><span>@@ -1365,12 +1365,13 @@</span><br><span> {</span><br><span>      struct ao2_container *contacts;</span><br><span>      struct ast_variable *var;</span><br><span style="color: hsl(0, 100%, 40%);">-       char *time = alloca(64);</span><br><span style="color: hsl(120, 100%, 40%);">+      char time[AST_TIME_T_LEN];</span><br><span> </span><br><span>       while (check_interval) {</span><br><span>             sleep(check_interval);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              sprintf(time, "%ld", ast_tvnow().tv_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_time_t_to_string(ast_tvnow().tv_sec, time, sizeof(time));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>              var = ast_variable_new("expiration_time <=", time, "");</span><br><span> </span><br><span>           ast_debug(4, "Woke up at %s  Interval: %d\n", time, check_interval);</span><br><span>diff --git a/res/res_stir_shaken.c b/res/res_stir_shaken.c</span><br><span>index 373a1a1..19e2654 100644</span><br><span>--- a/res/res_stir_shaken.c</span><br><span>+++ b/res/res_stir_shaken.c</span><br><span>@@ -351,7 +351,7 @@</span><br><span>  */</span><br><span> static void set_public_key_expiration(const char *public_cert_url, const struct curl_cb_data *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        char time_buf[32];</span><br><span style="color: hsl(120, 100%, 40%);">+    char time_buf[32], secs[AST_TIME_T_LEN];</span><br><span>     char *value;</span><br><span>         struct timeval actual_expires = ast_tvnow();</span><br><span>         char hash[41];</span><br><span>@@ -389,7 +389,9 @@</span><br><span>                 actual_expires.tv_sec += EXPIRATION_BUFFER;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   snprintf(time_buf, sizeof(time_buf), "%30lu", actual_expires.tv_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_time_t_to_string(actual_expires.tv_sec, secs, sizeof(secs));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    snprintf(time_buf, sizeof(time_buf), "%30s", secs);</span><br><span> </span><br><span>    ast_db_put(hash, "expiration", time_buf);</span><br><span> }</span><br><span></span><br></pre><div style="white-space:pre-wrap"></div><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/18013">change 18013</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/18013"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id7b25bdca8f92e34229f6454f6c3e500f2cd6f56 </div>
<div style="display:none"> Gerrit-Change-Number: 18013 </div>
<div style="display:none"> Gerrit-PatchSet: 11 </div>
<div style="display:none"> Gerrit-Owner: Philip Prindeville <philipp@redfish-solutions.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-Reviewer: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-CC: Sebastian Kemper <sebastian_ml@gmx.net> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>