From 92dbeff150951f4827c209028cacd035caf15288 Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Tue, 7 Apr 2020 16:27:05 -0400 Subject: [PATCH] Fix: load: incomplete error handling for load_session_from_file MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Observed issue ============== lttng-ivc test fails to fail. test_save_load_blocking_timeout[lttng-tools-2.12-lttng-tools-2.11-False] Here we load a xml created by lttng-tools-2.12 and try to load it using lttng-tools 2.11. We expect this to fail on the load. The command report an error on the stderr but the command return code value is zero. From lttng-ivc test runtime.log: Command #0 Return value: 0 Command: lttng load --input-path=/home/joraj/lttng/lttng-ivc/.tox/py3/tmp/test_save_load_blocking_timeou0/save_load saved_trace STDOUT: Session saved_trace has been loaded successfully STDERR: XML Error: Element 'process_attr_trackers': This element is not expected. Error: Session configuration file validation failed Cause ============== The error coming from load_session_from_file is not handled correctly. Solution ======== Rework error handling in load_session_from_path and load_session_from_file. LTTNG_ERR_LOAD_SESSION_NOENT is NOT an error when session_name is specified in load_session_from_path. In this scenario, we are actively looking for the configuration of the session. Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau Change-Id: I0fea474045b718664e70ffe169e4e4fa125791a8 --- src/common/config/session-config.c | 45 +++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/common/config/session-config.c b/src/common/config/session-config.c index b1fa992fe..86afc2439 100644 --- a/src/common/config/session-config.c +++ b/src/common/config/session-config.c @@ -3309,10 +3309,24 @@ int load_session_from_file(const char *path, const char *session_name, xmlNextElementSibling(session_node)) { ret = process_session_node(session_node, session_name, overwrite, overrides); - if (session_name && ret == 0) { - /* Target session found and loaded */ - session_found = 1; - break; + if (!session_name && ret) { + /* Loading error occurred. */ + goto end; + } else if (session_name) { + if (ret == 0) { + /* Target session found and loaded */ + session_found = 1; + break; + } else if (ret == -LTTNG_ERR_NO_SESSION) { + /* + * Ignore this error, we are looking for the + * session. + */ + ret = 0; + } else { + /* Loading error occurred. */ + goto end; + } } } end: @@ -3444,10 +3458,27 @@ int load_session_from_path(const char *path, const char *session_name, ret = load_session_from_file(file_path.data, session_name, validation_ctx, overwrite, overrides); - if (session_name && !ret) { - session_found = 1; - break; + if (!session_name && ret) { + /* Loading error occured. */ + goto end; + } else if (session_name) { + if (ret == 0) { + /* Target session found and loaded */ + session_found = 1; + break; + } else if (ret == + -LTTNG_ERR_LOAD_SESSION_NOENT) { + /* + * Ignore this error, we are looking for + * the session. + */ + ret = 0; + } else { + /* Loading error occured. */ + goto end; + } } + /* * Reset the buffer's size to the location of the * path's trailing '/'. -- 2.34.1