summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
4aa5f66)
This bug have been triggered by the mi merging and the use of a
command_ret in enable_events functions. Previously, enable_events was
reusing the ret variable for another operation and always replacing ret.
Parse_probe_event returned the last output of sscanf which represent
the number of match and not the success of the operation.
Fixes #830
Signed-off-by: Jonathan Rajotte Julien <jonathan.r.julien@gmail.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
*/
static int parse_probe_opts(struct lttng_event *ev, char *opt)
{
*/
static int parse_probe_opts(struct lttng_event *ev, char *opt)
{
+ int ret = CMD_SUCCESS;
+ int match;
char s_hex[19];
#define S_HEX_LEN_SCANF_IS_A_BROKEN_API "18" /* 18 is (19 - 1) (\0 is extra) */
char name[LTTNG_SYMBOL_NAME_LEN];
if (opt == NULL) {
char s_hex[19];
#define S_HEX_LEN_SCANF_IS_A_BROKEN_API "18" /* 18 is (19 - 1) (\0 is extra) */
char name[LTTNG_SYMBOL_NAME_LEN];
if (opt == NULL) {
goto end;
}
/* Check for symbol+offset */
goto end;
}
/* Check for symbol+offset */
- ret = sscanf(opt, "%" LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API
+ match = sscanf(opt, "%" LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API
"[^'+']+%" S_HEX_LEN_SCANF_IS_A_BROKEN_API "s", name, s_hex);
"[^'+']+%" S_HEX_LEN_SCANF_IS_A_BROKEN_API "s", name, s_hex);
strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
ev->attr.probe.symbol_name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
DBG("probe symbol %s", ev->attr.probe.symbol_name);
if (*s_hex == '\0') {
ERR("Invalid probe offset %s", s_hex);
strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
ev->attr.probe.symbol_name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
DBG("probe symbol %s", ev->attr.probe.symbol_name);
if (*s_hex == '\0') {
ERR("Invalid probe offset %s", s_hex);
goto end;
}
ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
goto end;
}
ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
/* Check for symbol */
if (isalpha(name[0])) {
/* Check for symbol */
if (isalpha(name[0])) {
- ret = sscanf(opt, "%" LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API "s",
+ match = sscanf(opt, "%" LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API "s",
strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
ev->attr.probe.symbol_name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
DBG("probe symbol %s", ev->attr.probe.symbol_name);
strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
ev->attr.probe.symbol_name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
DBG("probe symbol %s", ev->attr.probe.symbol_name);
}
/* Check for address */
}
/* Check for address */
- ret = sscanf(opt, "%" S_HEX_LEN_SCANF_IS_A_BROKEN_API "s", s_hex);
- if (ret > 0) {
+ match = sscanf(opt, "%" S_HEX_LEN_SCANF_IS_A_BROKEN_API "s", s_hex);
+ if (match > 0) {
if (*s_hex == '\0') {
ERR("Invalid probe address %s", s_hex);
if (*s_hex == '\0') {
ERR("Invalid probe address %s", s_hex);
goto end;
}
ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
goto end;
}
ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
break;
case LTTNG_EVENT_PROBE:
ret = parse_probe_opts(&ev, opt_probe);
break;
case LTTNG_EVENT_PROBE:
ret = parse_probe_opts(&ev, opt_probe);
ERR("Unable to parse probe options");
ret = 0;
goto error;
ERR("Unable to parse probe options");
ret = 0;
goto error;
break;
case LTTNG_EVENT_FUNCTION:
ret = parse_probe_opts(&ev, opt_function);
break;
case LTTNG_EVENT_FUNCTION:
ret = parse_probe_opts(&ev, opt_function);
ERR("Unable to parse function probe options");
ret = 0;
goto error;
ERR("Unable to parse function probe options");
ret = 0;
goto error;