Fix: parse_prob_opts return the actual success of the function
authorJonathan Rajotte Julien <jonathan.r.julien@gmail.com>
Wed, 27 Aug 2014 19:46:57 +0000 (15:46 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Wed, 3 Sep 2014 18:45:34 +0000 (14:45 -0400)
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>
src/bin/lttng/commands/enable_events.c

index f62dadbf08321dd5995d2f2ae4581deab5700c91..3263c588ad9bf83c8c79bef5c4abc091f044e5d2 100644 (file)
@@ -247,26 +247,27 @@ static void usage(FILE *ofp)
  */
 static int parse_probe_opts(struct lttng_event *ev, char *opt)
 {
-       int ret;
+       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) {
-               ret = -1;
+               ret = CMD_ERROR;
                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);
-       if (ret == 2) {
+       if (match == 2) {
                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);
-                       ret = -1;
+                       ret = CMD_ERROR;
                        goto end;
                }
                ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
@@ -277,9 +278,9 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt)
 
        /* 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",
                        name);
-               if (ret == 1) {
+               if (match == 1) {
                        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);
@@ -291,11 +292,11 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt)
        }
 
        /* 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);
-                       ret = -1;
+                       ret = CMD_ERROR;
                        goto end;
                }
                ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
@@ -306,7 +307,7 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt)
        }
 
        /* No match */
-       ret = -1;
+       ret = CMD_ERROR;
 
 end:
        return ret;
@@ -906,7 +907,7 @@ static int enable_events(char *session_name)
                                break;
                        case LTTNG_EVENT_PROBE:
                                ret = parse_probe_opts(&ev, opt_probe);
-                               if (ret < 0) {
+                               if (ret) {
                                        ERR("Unable to parse probe options");
                                        ret = 0;
                                        goto error;
@@ -914,7 +915,7 @@ static int enable_events(char *session_name)
                                break;
                        case LTTNG_EVENT_FUNCTION:
                                ret = parse_probe_opts(&ev, opt_function);
-                               if (ret < 0) {
+                               if (ret) {
                                        ERR("Unable to parse function probe options");
                                        ret = 0;
                                        goto error;
This page took 0.037616 seconds and 4 git commands to generate.