Fix: liblttng-ctl: unreported truncations when copying strings
[lttng-tools.git] / src / lib / lttng-ctl / load.c
index f89effed04b8b69b23e186dfee6237e8b8cfe10d..db9bfe0bf18bca0eaf3c6f2277bed6dda2f601d8 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2014 David Goulet <dgoulet@efficios.com>
+ * Copyright (C) 2014 David Goulet <dgoulet@efficios.com>
  *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License, version 2.1 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: LGPL-2.1-only
  *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #define _LGPL_SOURCE
@@ -47,6 +37,7 @@ void reset_load_session_attr_urls(struct lttng_load_session_attr *attr)
                free(attr->override_attr->path_url);
                free(attr->override_attr->ctrl_url);
                free(attr->override_attr->data_url);
+               free(attr->override_attr->session_name);
        }
 }
 
@@ -59,6 +50,32 @@ void lttng_load_session_attr_destroy(struct lttng_load_session_attr *attr)
        }
 }
 
+static int validate_attr(const struct lttng_load_session_attr *attr)
+{
+       int ret = 0;
+
+       if (!attr) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       if (!attr->override_attr) {
+               goto end;
+       }
+
+       /*
+        * Refuse override name if the objective is to load multiple session
+        * since this operation is ambiguous while loading multiple session.
+        */
+       if (attr->override_attr->session_name
+                       && attr->session_name[0] == '\0') {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+end:
+       return ret;
+}
+
 const char *lttng_load_session_attr_get_session_name(
        struct lttng_load_session_attr *attr)
 {
@@ -135,6 +152,20 @@ end:
        return ret;
 }
 
+const char *lttng_load_session_attr_get_override_session_name(
+               struct lttng_load_session_attr *attr)
+{
+       const char *ret = NULL;
+
+       if (!attr || !attr->override_attr) {
+               goto end;
+       }
+
+       ret = attr->override_attr->session_name;
+end:
+       return ret;
+}
+
 int lttng_load_session_attr_set_session_name(
        struct lttng_load_session_attr *attr, const char *session_name)
 {
@@ -154,7 +185,12 @@ int lttng_load_session_attr_set_session_name(
                        goto error;
                }
 
-               strncpy(attr->session_name, session_name, len);
+               ret = lttng_strncpy(attr->session_name, session_name,
+                               sizeof(attr->session_name));
+               if (ret) {
+                       ret = -LTTNG_ERR_INVALID;
+                       goto error;
+               }
        } else {
                attr->session_name[0] = '\0';
        }
@@ -194,8 +230,12 @@ int lttng_load_session_attr_set_input_url(
        }
 
        /* Copy string plus the NULL terminated byte. */
-       lttng_ctl_copy_string(attr->input_url, uris[0].dst.path,
+       ret = lttng_strncpy(attr->input_url, uris[0].dst.path,
                        sizeof(attr->input_url));
+       if (ret) {
+               ret = -LTTNG_ERR_INVALID;
+               goto error;
+       }
 
 end:
 error:
@@ -532,6 +572,42 @@ end:
        return ret;
 }
 
+int lttng_load_session_attr_set_override_session_name(
+       struct lttng_load_session_attr *attr, const char *session_name)
+{
+       int ret = 0;
+       size_t len;
+
+       if (!attr ||!session_name) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       if (!attr->override_attr) {
+               attr->override_attr = zmalloc(
+                       sizeof(struct config_load_session_override_attr));
+               if (!attr->override_attr) {
+                       ret = -LTTNG_ERR_NOMEM;
+                       goto end;
+               }
+       }
+
+       len = strlen(session_name);
+       if (len >= LTTNG_NAME_MAX) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       attr->override_attr->session_name = lttng_strndup(session_name,
+               len);
+       if (!attr->override_attr->session_name) {
+               ret = -LTTNG_ERR_NOMEM;
+               goto end;
+       }
+end:
+       return ret;
+}
+
 int lttng_load_session(struct lttng_load_session_attr *attr)
 {
        int ret;
@@ -542,6 +618,11 @@ int lttng_load_session(struct lttng_load_session_attr *attr)
                goto end;
        }
 
+       ret = validate_attr(attr);
+       if (ret) {
+               goto end;
+       }
+
        url = attr->input_url[0] != '\0' ? attr->input_url : NULL;
        session_name = attr->session_name[0] != '\0' ?
                        attr->session_name : NULL;
This page took 0.025236 seconds and 4 git commands to generate.