Fix: lttng: leak of userspace probe path on listing
[lttng-tools.git] / src / common / payload-view.c
CommitLineData
c0a66c84
JG
1/*
2 * Copyright (C) 2020 Jérémie Galarneau <jeremie.galarneau@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
5a2f5f00 8#include <common/dynamic-array.h>
c0a66c84
JG
9#include <common/buffer-view.h>
10#include "payload-view.h"
11#include "payload.h"
12#include <stddef.h>
13
14LTTNG_HIDDEN
15struct lttng_payload_view lttng_payload_view_from_payload(
16 const struct lttng_payload *payload, size_t offset,
17 ptrdiff_t len)
18{
19 return (struct lttng_payload_view) {
20 .buffer = lttng_buffer_view_from_dynamic_buffer(
21 &payload->buffer, offset, len),
22 ._fds = payload->_fds,
23 };
24}
25
26LTTNG_HIDDEN
27struct lttng_payload_view lttng_payload_view_from_view(
28 struct lttng_payload_view *view, size_t offset,
29 ptrdiff_t len)
30{
31 return (struct lttng_payload_view) {
32 .buffer = lttng_buffer_view_from_view(
33 &view->buffer, offset, len),
34 ._fds = view->_fds,
35 ._iterator.p_fds_position = &view->_iterator.fds_position,
36 };
37}
38
39LTTNG_HIDDEN
40struct lttng_payload_view lttng_payload_view_from_dynamic_buffer(
41 const struct lttng_dynamic_buffer *buffer, size_t offset,
42 ptrdiff_t len)
43{
44 return (struct lttng_payload_view) {
45 .buffer = lttng_buffer_view_from_dynamic_buffer(
46 buffer, offset, len)
47 };
48}
49
5a2f5f00
JG
50LTTNG_HIDDEN
51struct lttng_payload_view lttng_payload_view_from_buffer_view(
52 const struct lttng_buffer_view *view, size_t offset,
53 ptrdiff_t len)
54{
55 return (struct lttng_payload_view) {
56 .buffer = lttng_buffer_view_from_view(
57 view, offset, len)
58 };
59}
60
61LTTNG_HIDDEN
62int lttng_payload_view_get_fd_count(struct lttng_payload_view *payload_view)
63{
64 int ret;
65 size_t position;
66
67 if (!payload_view) {
68 ret = -1;
69 goto end;
70 }
71
72 ret = lttng_dynamic_array_get_count(&payload_view->_fds);
73 if (ret < 0) {
74 goto end;
75 }
76
77 position = payload_view->_iterator.p_fds_position ?
78 *payload_view->_iterator.p_fds_position :
79 payload_view->_iterator.fds_position;
80 ret = ret - (int) position;
81end:
82 return ret;
83}
84
c0a66c84
JG
85LTTNG_HIDDEN
86int lttng_payload_view_pop_fd(struct lttng_payload_view *view)
87{
88 int ret = 0;
89 size_t fd_count;
90 size_t *pos;
91
92 if (!view) {
93 ret = -1;
94 goto end;
95 }
96
97 fd_count = lttng_dynamic_array_get_count(&view->_fds);
98 pos = view->_iterator.p_fds_position ? view->_iterator.p_fds_position :
99 &view->_iterator.fds_position;
100
101 if (*pos >= fd_count) {
102 ret = -1;
103 goto end;
104 }
105
106 ret = *((int *) lttng_dynamic_array_get_element(
107 &view->_fds, *pos));
108 (*pos)++;
109end:
110 return ret;
111}
This page took 0.028339 seconds and 5 git commands to generate.