The liblttng-ctl API is not performance sensitive and normally adopts
a defensive stance with regards to supplied arguments. The session
destruction handle API introduced in 2.11 does not check user-supplied
arguments for NULLs which does not fit with existing liblttng-ctl API
conventions.
Add NULL checks for all arguments which cannot be legitimately left
NULL and return a suitable "invalid parameters" return code.
Moreover, note that lttng_destroy_session_ext() is now used by
lttng_destroy_session(), which previously checked for a NULL session
name. Not checking for this case in the new 'ext' version introduced a
change in behaviour.
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
const bool has_timeout = timeout_ms > 0;
struct timespec initial_time;
const bool has_timeout = timeout_ms > 0;
struct timespec initial_time;
+ if (!handle) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
+
if (handle->communication.state == COMMUNICATION_STATE_ERROR) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_ERROR;
goto end;
if (handle->communication.state == COMMUNICATION_STATE_ERROR) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_ERROR;
goto end;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
+ if (!handle || !rotation_state) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
+
if (!handle->rotation_state.is_set) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
if (!handle->rotation_state.is_set) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
+ if (!handle || !location) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
+
if (!handle->location) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
if (!handle->location) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
+ if (!handle || !result) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
+
if (!handle->destruction_return_code.is_set) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
if (!handle->destruction_return_code.is_set) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
int sessiond_socket = -1;
struct lttng_destruction_handle *handle = NULL;
int sessiond_socket = -1;
struct lttng_destruction_handle *handle = NULL;
+ if (!session_name || !handle) {
+ ret_code = LTTNG_ERR_INVALID;
+ goto error;
+ }
+
ret = lttng_strncpy(lsm.session.name, session_name,
sizeof(lsm.session.name));
if (ret) {
ret = lttng_strncpy(lsm.session.name, session_name,
sizeof(lsm.session.name));
if (ret) {