Fix: possible null dereference
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.c
index c5fd30b7ead925f106cfe4d3c1164c6bc21fd5c8..4ee4bea64ff630abae9617624f86ce21cc87950d 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #define _LGPL_SOURCE
@@ -707,8 +697,7 @@ int kernel_track_id(enum lttng_tracker_type tracker_type,
 {
        int ret, value;
        struct lttng_tracker_list *tracker_list;
-       struct lttng_tracker_id **saved_ids;
-       ssize_t saved_ids_count;
+       struct lttng_tracker_ids *saved_ids;
 
        ret = lttng_tracker_id_lookup_string(tracker_type, id, &value);
        if (ret != LTTNG_OK) {
@@ -721,8 +710,8 @@ int kernel_track_id(enum lttng_tracker_type tracker_type,
        }
 
        /* Save list for restore on error. */
-       saved_ids_count = lttng_tracker_id_get_list(tracker_list, &saved_ids);
-       if (saved_ids_count < 0) {
+       ret = lttng_tracker_id_get_list(tracker_list, &saved_ids);
+       if (ret != LTTNG_OK) {
                return LTTNG_ERR_INVALID;
        }
 
@@ -808,13 +797,11 @@ int kernel_track_id(enum lttng_tracker_type tracker_type,
                break;
        }
 
-       if (lttng_tracker_id_set_list(tracker_list, saved_ids,
-                           saved_ids_count) != LTTNG_OK) {
+       if (lttng_tracker_id_set_list(tracker_list, saved_ids) != LTTNG_OK) {
                ERR("Error on tracker add error handling.\n");
        }
 end:
-       lttng_tracker_ids_destroy(saved_ids, saved_ids_count);
-       free(saved_ids);
+       lttng_tracker_ids_destroy(saved_ids);
        return ret;
 }
 
@@ -824,8 +811,7 @@ int kernel_untrack_id(enum lttng_tracker_type tracker_type,
 {
        int ret, value;
        struct lttng_tracker_list *tracker_list;
-       struct lttng_tracker_id **saved_ids;
-       ssize_t saved_ids_count;
+       struct lttng_tracker_ids *saved_ids;
 
        ret = lttng_tracker_id_lookup_string(tracker_type, id, &value);
        if (ret != LTTNG_OK) {
@@ -837,8 +823,8 @@ int kernel_untrack_id(enum lttng_tracker_type tracker_type,
                return LTTNG_ERR_INVALID;
        }
        /* Save list for restore on error. */
-       saved_ids_count = lttng_tracker_id_get_list(tracker_list, &saved_ids);
-       if (saved_ids_count < 0) {
+       ret = lttng_tracker_id_get_list(tracker_list, &saved_ids);
+       if (ret != LTTNG_OK) {
                return LTTNG_ERR_INVALID;
        }
        /* Remove from list. */
@@ -926,30 +912,38 @@ int kernel_untrack_id(enum lttng_tracker_type tracker_type,
                break;
        }
 
-       if (lttng_tracker_id_set_list(tracker_list, saved_ids,
-                           saved_ids_count) != LTTNG_OK) {
+       if (lttng_tracker_id_set_list(tracker_list, saved_ids) != LTTNG_OK) {
                ERR("Error on tracker remove error handling.\n");
        }
 end:
-       lttng_tracker_ids_destroy(saved_ids, saved_ids_count);
-       free(saved_ids);
+       lttng_tracker_ids_destroy(saved_ids);
        return ret;
 }
 
 /*
  * Called with session lock held.
  */
-ssize_t kernel_list_tracker_ids(enum lttng_tracker_type tracker_type,
+int kernel_list_tracker_ids(enum lttng_tracker_type tracker_type,
                struct ltt_kernel_session *session,
-               struct lttng_tracker_id ***_ids)
+               struct lttng_tracker_id**_ids)
 {
+       int ret = 0;
        struct lttng_tracker_list *tracker_list;
 
        tracker_list = get_id_tracker_list(session, tracker_type);
        if (!tracker_list) {
-               return -LTTNG_ERR_INVALID;
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       ret = lttng_tracker_id_get_list(tracker_list, _ids);
+       if (ret != LTTNG_OK) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
        }
-       return lttng_tracker_id_get_list(tracker_list, _ids);
+
+end:
+       return ret;
 }
 
 /*
This page took 0.024748 seconds and 4 git commands to generate.