Fix: check reference counts for overflow
[lttng-modules.git] / lttng-events.c
index c1dc1acbc5124fde9369b6045adb0f3c12ffa01f..f0f5d0f80dbe340bf1e4663681ff621acd25f504 100644 (file)
@@ -1085,17 +1085,22 @@ int lttng_session_list_tracker_pids(struct lttng_session *session)
                ret = PTR_ERR(tracker_pids_list_file);
                goto file_error;
        }
+       if (atomic_long_add_unless(&session->file->f_count,
+               1, INT_MAX) == INT_MAX) {
+               goto refcount_error;
+       }
        ret = lttng_tracker_pids_list_fops.open(NULL, tracker_pids_list_file);
        if (ret < 0)
                goto open_error;
        m = tracker_pids_list_file->private_data;
        m->private = session;
        fd_install(file_fd, tracker_pids_list_file);
-       atomic_long_inc(&session->file->f_count);
 
        return file_fd;
 
 open_error:
+       atomic_long_dec(&session->file->f_count);
+refcount_error:
        fput(tracker_pids_list_file);
 file_error:
        put_unused_fd(file_fd);
@@ -1695,6 +1700,14 @@ int _lttng_field_statedump(struct lttng_session *session,
                const struct lttng_basic_type *elem_type;
 
                elem_type = &field->type.u.array.elem_type;
+               if (field->type.u.array.elem_alignment) {
+                       ret = lttng_metadata_printf(session,
+                       "               struct { } align(%u) _%s_padding;\n",
+                                       field->type.u.array.elem_alignment * CHAR_BIT,
+                                       field->name);
+                       if (ret)
+                               return ret;
+               }
                ret = lttng_metadata_printf(session,
                        "               integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[%u];\n",
                        elem_type->u.basic.integer.size,
@@ -1741,6 +1754,14 @@ int _lttng_field_statedump(struct lttng_session *session,
                if (ret)
                        return ret;
 
+               if (field->type.u.sequence.elem_alignment) {
+                       ret = lttng_metadata_printf(session,
+                       "               struct { } align(%u) _%s_padding;\n",
+                                       field->type.u.sequence.elem_alignment * CHAR_BIT,
+                                       field->name);
+                       if (ret)
+                               return ret;
+               }
                ret = lttng_metadata_printf(session,
                        "               integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[ __%s_length ];\n",
                        elem_type->u.basic.integer.size,
This page took 0.025713 seconds and 4 git commands to generate.