Fix: relayd: live: mishandled initial null trace chunk
[lttng-tools.git] / src / bin / lttng-relayd / backward-compatibility-group-by.c
index 8963dc2866b2944486e0ae10b5c5ba8ad7246d0f..9e144f9f52b1a68d4273f544196048d8f93eb70c 100644 (file)
@@ -5,7 +5,7 @@
  *
  */
 
-#include <assert.h>
+#include "common/time.h"
 #include <regex.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -17,7 +17,6 @@
 
 #include "backward-compatibility-group-by.h"
 
-#define DATETIME_STRING_SIZE 16
 #define DATETIME_REGEX \
        ".*-[1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9]-[0-2][0-9][0-5][0-9][0-5][0-9]$"
 
@@ -28,8 +27,9 @@
  *
  * Return the allocated string containing the new stream path or else NULL.
  */
-char *backward_compat_group_by_session(
-               const char *path, const char *local_session_name)
+char *backward_compat_group_by_session(const char *path,
+               const char *local_session_name,
+               time_t relay_session_creation_time)
 {
        int ret;
        size_t len;
@@ -43,9 +43,9 @@ char *backward_compat_group_by_session(
        const char *hostname_ptr;
        regex_t regex;
 
-       assert(path);
-       assert(local_session_name);
-       assert(local_session_name[0] != '\0');
+       LTTNG_ASSERT(path);
+       LTTNG_ASSERT(local_session_name);
+       LTTNG_ASSERT(local_session_name[0] != '\0');
 
        DBG("Parsing path \"%s\" of session \"%s\" to create a new path that is grouped by session",
                        path, local_session_name);
@@ -60,7 +60,7 @@ char *backward_compat_group_by_session(
        /*
         * The use of strtok with '/' as delimiter is valid since we refuse '/'
         * in session name and '/' is not a valid hostname character based on
-        * RFC-952 [1], RFC-921 [2] and refined in RFC-1123 [2].
+        * RFC-952 [1], RFC-921 [2] and refined in RFC-1123 [3].
         * [1] https://tools.ietf.org/html/rfc952
         * [2] https://tools.ietf.org/html/rfc921
         * [3] https://tools.ietf.org/html/rfc1123#page-13
@@ -162,17 +162,30 @@ char *backward_compat_group_by_session(
                ret = regexec(&regex, local_session_name, 0, NULL, 0);
                if (ret == 0) {
                        const ssize_t local_session_name_offset =
-                                       strlen(local_session_name) - DATETIME_STRING_SIZE + 1;
+                                       strlen(local_session_name) - DATETIME_STR_LEN + 1;
 
-                       assert(local_session_name_offset >= 0);
+                       LTTNG_ASSERT(local_session_name_offset >= 0);
                        datetime = strdup(local_session_name +
                                        local_session_name_offset);
                        if (!datetime) {
                                PERROR("Failed to parse session path: couldn't copy datetime on regex match");
                                goto error_regex;
                        }
+               } else {
+                       datetime = zmalloc(DATETIME_STR_LEN);
+                       if (!datetime) {
+                               PERROR("Failed to allocate DATETIME string");
+                               goto error;
+                       }
+
+                       ret = time_to_datetime_str(relay_session_creation_time,
+                                       datetime, DATETIME_STR_LEN);
+                       if (ret) {
+                               /* time_to_datetime_str already logs errors. */
+                               goto error;
+                       }
                }
-       } else if (len == DATETIME_STRING_SIZE &&
+       } else if (len == DATETIME_STR_LEN &&
                        !regexec(&regex, leftover_second_token_ptr, 0, NULL,
                                        0)) {
                /*
@@ -193,8 +206,8 @@ char *backward_compat_group_by_session(
                 * "name-<datetime>" format. Using the datetime from such a
                 * session would be invalid.
                 * */
-               assert(partial_base_path == NULL);
-               assert(datetime == NULL);
+               LTTNG_ASSERT(partial_base_path == NULL);
+               LTTNG_ASSERT(datetime == NULL);
 
                partial_base_path = strdup(second_token_ptr);
                if (!partial_base_path) {
This page took 0.028326 seconds and 4 git commands to generate.