X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Fconfig%2Fsession-config.c;h=799919d6a8a2e224551c1b4db783431237fc6ac3;hb=73bbfeee351ab85e3ce37d785c05b9e62e0b7b53;hp=5b5adbfc42afa3d761325cd1708ebf9c3e029b46;hpb=c1e83fb4cecbb43353e4e1d2092b0516b50a5c26;p=lttng-tools.git diff --git a/src/common/config/session-config.c b/src/common/config/session-config.c index 5b5adbfc4..799919d6a 100644 --- a/src/common/config/session-config.c +++ b/src/common/config/session-config.c @@ -90,16 +90,16 @@ const char * const config_element_symbol_name = "symbol_name"; const char * const config_element_address = "address"; const char * const config_element_offset = "offset"; -const char * const config_element_userspace_probe_lookup = "lookup_method"; -const char * const config_element_userspace_probe_lookup_function_default = "DEFAULT"; -const char * const config_element_userspace_probe_lookup_function_elf = "ELF"; -const char * const config_element_userspace_probe_lookup_tracepoint_sdt = "SDT"; -const char * const config_element_userspace_probe_location_binary_path = "binary_path"; -const char * const config_element_userspace_probe_function_attributes = "userspace_probe_function_attributes"; -const char * const config_element_userspace_probe_function_location_function_name = "function_name"; -const char * const config_element_userspace_probe_tracepoint_attributes = "userspace_probe_tracepoint_attributes"; -const char * const config_element_userspace_probe_tracepoint_location_provider_name = "provider_name"; -const char * const config_element_userspace_probe_tracepoint_location_probe_name = "probe_name"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_lookup = "lookup_method"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_lookup_function_default = "DEFAULT"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_lookup_function_elf = "ELF"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_lookup_tracepoint_sdt = "SDT"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_location_binary_path = "binary_path"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_function_attributes = "userspace_probe_function_attributes"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_function_location_function_name = "function_name"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_tracepoint_attributes = "userspace_probe_tracepoint_attributes"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_tracepoint_location_provider_name = "provider_name"; +LTTNG_HIDDEN const char * const config_element_userspace_probe_tracepoint_location_probe_name = "probe_name"; const char * const config_element_name = "name"; const char * const config_element_enabled = "enabled"; @@ -177,7 +177,7 @@ const char * const config_loglevel_type_single = "SINGLE"; const char * const config_event_type_all = "ALL"; const char * const config_event_type_tracepoint = "TRACEPOINT"; const char * const config_event_type_probe = "PROBE"; -const char * const config_event_type_userspace_probe = "USERSPACE_PROBE"; +LTTNG_HIDDEN const char * const config_event_type_userspace_probe = "USERSPACE_PROBE"; const char * const config_event_type_function = "FUNCTION"; const char * const config_event_type_function_entry = "FUNCTION_ENTRY"; const char * const config_event_type_noop = "NOOP"; @@ -250,7 +250,7 @@ int config_get_section_entries(const char *override_path, const char *section, config_entry_handler_cb handler, void *user_data) { int ret = 0; - char *path; + const char *path; FILE *config_file = NULL; struct handler_filter_args filter = { section, handler, user_data }; @@ -815,7 +815,7 @@ int parse_bool(xmlChar *str, int *val) } else if (!strcmp((const char *) str, config_xml_false)) { *val = 0; } else { - WARN("Invalid boolean value encoutered (%s).", + WARN("Invalid boolean value encountered (%s).", (const char *) str); ret = -1; } @@ -1479,9 +1479,8 @@ struct lttng_userspace_probe_location * process_userspace_probe_function_attribute_node( xmlNodePtr attribute_node) { - xmlChar *content; xmlNodePtr function_attribute_node; - char *function_name = NULL, *binary_path = NULL, *lookup_method_name; + char *function_name = NULL, *binary_path = NULL; struct lttng_userspace_probe_location *location = NULL; struct lttng_userspace_probe_location_lookup_method *lookup_method = NULL; @@ -1499,42 +1498,23 @@ process_userspace_probe_function_attribute_node( /* Handle function name, binary path and lookup method. */ if (!strcmp((const char *) function_attribute_node->name, config_element_userspace_probe_function_location_function_name)) { - content = xmlNodeGetContent(function_attribute_node); - if (!content) { - goto error; - } - - function_name = lttng_strndup((char *) content, LTTNG_SYMBOL_NAME_LEN); - free(content); + function_name = (char *) xmlNodeGetContent(function_attribute_node); if (!function_name) { - PERROR("Error duplicating function name"); goto error; } } else if (!strcmp((const char *) function_attribute_node->name, config_element_userspace_probe_location_binary_path)) { - content = xmlNodeGetContent(function_attribute_node); - if (!content) { - goto error; - } - - binary_path = lttng_strndup((char *) content, LTTNG_PATH_MAX); - free(content); + binary_path = (char *) xmlNodeGetContent(function_attribute_node); if (!binary_path) { - PERROR("Error duplicating binary path"); goto error; } } else if (!strcmp((const char *) function_attribute_node->name, config_element_userspace_probe_lookup)) { - content = xmlNodeGetContent(function_attribute_node); - if (!content) { - goto error; - } + char *lookup_method_name; - lookup_method_name = lttng_strndup((char *) content, - CONFIG_USERSPACE_PROBE_LOOKUP_METHOD_NAME_MAX_LEN); - free(content); + lookup_method_name = (char *) xmlNodeGetContent( + function_attribute_node); if (!lookup_method_name) { - PERROR("Error duplicating lookup method name"); goto error; } @@ -1547,12 +1527,13 @@ process_userspace_probe_function_attribute_node( lookup_method = lttng_userspace_probe_location_lookup_method_function_elf_create(); if (!lookup_method) { PERROR("Error creating function default/ELF lookup method"); - free(lookup_method_name); - goto error; } } else { - WARN("Unknown function lookup method."); - free(lookup_method_name); + WARN("Unknown function lookup method"); + } + + free(lookup_method_name); + if (!lookup_method) { goto error; } } else { @@ -1561,20 +1542,19 @@ process_userspace_probe_function_attribute_node( /* Check if all the necessary fields were found. */ if (binary_path && function_name && lookup_method) { + /* Ownership of lookup_method is transferred. */ location = lttng_userspace_probe_location_function_create( binary_path, function_name, lookup_method); - goto end; + lookup_method = NULL; + goto error; } } error: + lttng_userspace_probe_location_lookup_method_destroy(lookup_method); free(binary_path); free(function_name); - if (lookup_method) { - lttng_userspace_probe_location_lookup_method_destroy(lookup_method); - } -end: return location; } @@ -1583,9 +1563,7 @@ struct lttng_userspace_probe_location * process_userspace_probe_tracepoint_attribute_node( xmlNodePtr attribute_node) { - xmlChar *content; xmlNodePtr tracepoint_attribute_node; - char *lookup_method_name = NULL; char *probe_name = NULL, *provider_name = NULL, *binary_path = NULL; struct lttng_userspace_probe_location *location = NULL; struct lttng_userspace_probe_location_lookup_method *lookup_method = NULL; @@ -1602,58 +1580,29 @@ process_userspace_probe_tracepoint_attribute_node( tracepoint_attribute_node)) { if (!strcmp((const char *) tracepoint_attribute_node->name, config_element_userspace_probe_tracepoint_location_probe_name)) { - content = xmlNodeGetContent(tracepoint_attribute_node); - if (!content) { - goto error; - } - - probe_name = lttng_strndup((char*) content, LTTNG_SYMBOL_NAME_LEN); - free(content); + probe_name = (char *) xmlNodeGetContent(tracepoint_attribute_node); if (!probe_name) { - PERROR("Error duplicating probe name"); goto error; } } else if (!strcmp((const char *) tracepoint_attribute_node->name, config_element_userspace_probe_tracepoint_location_provider_name)) { - content = xmlNodeGetContent(tracepoint_attribute_node); - if (!content) { - goto error; - } - - provider_name = lttng_strndup((char*) content, LTTNG_SYMBOL_NAME_LEN); - free(content); + provider_name = (char *) xmlNodeGetContent(tracepoint_attribute_node); if (!provider_name) { - PERROR("Error duplicating provider name"); goto error; } } else if (!strcmp((const char *) tracepoint_attribute_node->name, config_element_userspace_probe_location_binary_path)) { - content = xmlNodeGetContent(tracepoint_attribute_node); - if (!content) { - goto error; - } - - binary_path = lttng_strndup((char*) content, LTTNG_PATH_MAX); - - free(content); - + binary_path = (char *) xmlNodeGetContent(tracepoint_attribute_node); if (!binary_path) { - PERROR("Error duplicating binary path"); goto error; } } else if (!strcmp((const char *) tracepoint_attribute_node->name, config_element_userspace_probe_lookup)) { - content = xmlNodeGetContent(tracepoint_attribute_node); - if (!content) { - goto error; - } - - lookup_method_name = lttng_strndup((char *) content, - CONFIG_USERSPACE_PROBE_LOOKUP_METHOD_NAME_MAX_LEN); - free(content); + char *lookup_method_name; + lookup_method_name = (char *) xmlNodeGetContent( + tracepoint_attribute_node); if (!lookup_method_name) { - PERROR("Error duplicating lookup method name"); goto error; } @@ -1663,35 +1612,36 @@ process_userspace_probe_tracepoint_attribute_node( lttng_userspace_probe_location_lookup_method_tracepoint_sdt_create(); if (!lookup_method) { PERROR("Error creating tracepoint SDT lookup method"); - free(lookup_method_name); - goto error; } } else { - WARN("Unknown tracepoint lookup method."); + WARN("Unknown tracepoint lookup method"); + } + + free(lookup_method_name); + if (!lookup_method) { goto error; } } else { - WARN("Unknown tracepoint attribute."); + WARN("Unknown tracepoint attribute"); goto error; } /* Check if all the necessary fields were found. */ if (binary_path && provider_name && probe_name && lookup_method) { + /* Ownership of lookup_method is transferred. */ location = lttng_userspace_probe_location_tracepoint_create( binary_path, provider_name, probe_name, lookup_method); - goto end; + lookup_method = NULL; + goto error; } } error: + lttng_userspace_probe_location_lookup_method_destroy(lookup_method); free(binary_path); - free(probe_name); free(provider_name); - if (lookup_method) { - lttng_userspace_probe_location_lookup_method_destroy(lookup_method); - } -end: + free(probe_name); return location; } @@ -2103,6 +2053,7 @@ end: free(exclusions[i]); } + lttng_event_destroy(event); free(exclusions); free(filter_expression); return ret; @@ -3358,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: @@ -3493,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 '/'. @@ -3581,7 +3563,7 @@ int config_load_session(const char *path, const char *session_name, } if (!path) { - char *home_path; + const char *home_path; const char *sys_path; /* Try home path */