Found by Coverity:
2. var_compare_op: Comparing arg to null implies that arg might be null.
CID
1256137 (#1 of 9): Dereference after null check (FORWARD_NULL)14.
var_deref_model: Passing null pointer arg to strdup, which dereferences
it.
[... same for #2 through #9 ]
This should not really be an issue since
1) options that use the "arg" parameter will not be set by popt if one
is not provided,
2) the configuration file parser will never invoke set_option with
a NULL argument; if no "value" is provided in the file, an empty
string is passed.
The second point is the reason for the "arg && arg[0] == '\0'" check;
we already know that the argument is invalid since an empty string
is never a valid argument for the supported options.
Nonetheless, it makes sense for Coverity to flag this and moving
the check to individual cases, although very verbose, is clear.
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
- if (arg && arg[0] == '\0') {
- /*
- * This only happens if the value is read from daemon config
- * file. This means the option requires an argument and the
- * configuration file contains a line such as:
- * my_option =
- */
- ret = -EINVAL;
- goto end;
- }
-
if (string_match(optname, "client-sock") || opt == 'c') {
if (string_match(optname, "client-sock") || opt == 'c') {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-c, --client-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-c, --client-sock");
snprintf(client_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "apps-sock") || opt == 'a') {
snprintf(client_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "apps-sock") || opt == 'a') {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-a, --apps-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-a, --apps-sock");
} else if (string_match(optname, "background") || opt == 'b') {
opt_background = 1;
} else if (string_match(optname, "group") || opt == 'g') {
} else if (string_match(optname, "background") || opt == 'b') {
opt_background = 1;
} else if (string_match(optname, "group") || opt == 'g') {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-g, --group");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-g, --group");
} else if (string_match(optname, "sig-parent") || opt == 'S') {
opt_sig_parent = 1;
} else if (string_match(optname, "kconsumerd-err-sock")) {
} else if (string_match(optname, "sig-parent") || opt == 'S') {
opt_sig_parent = 1;
} else if (string_match(optname, "kconsumerd-err-sock")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--kconsumerd-err-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--kconsumerd-err-sock");
snprintf(kconsumer_data.err_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "kconsumerd-cmd-sock")) {
snprintf(kconsumer_data.err_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "kconsumerd-cmd-sock")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--kconsumerd-cmd-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--kconsumerd-cmd-sock");
snprintf(kconsumer_data.cmd_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd64-err-sock")) {
snprintf(kconsumer_data.cmd_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd64-err-sock")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd64-err-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd64-err-sock");
snprintf(ustconsumer64_data.err_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd64-cmd-sock")) {
snprintf(ustconsumer64_data.err_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd64-cmd-sock")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd64-cmd-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd64-cmd-sock");
snprintf(ustconsumer64_data.cmd_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd32-err-sock")) {
snprintf(ustconsumer64_data.cmd_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd32-err-sock")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd32-err-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd32-err-sock");
snprintf(ustconsumer32_data.err_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd32-cmd-sock")) {
snprintf(ustconsumer32_data.err_unix_sock_path, PATH_MAX, "%s", arg);
}
} else if (string_match(optname, "ustconsumerd32-cmd-sock")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd32-cmd-sock");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--ustconsumerd32-cmd-sock");
opt_verbose_consumer += 1;
}
} else if (string_match(optname, "consumerd32-path")) {
opt_verbose_consumer += 1;
}
} else if (string_match(optname, "consumerd32-path")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd32-path");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd32-path");
consumerd32_bin_override = 1;
}
} else if (string_match(optname, "consumerd32-libdir")) {
consumerd32_bin_override = 1;
}
} else if (string_match(optname, "consumerd32-libdir")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd32-libdir");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd32-libdir");
consumerd32_libdir_override = 1;
}
} else if (string_match(optname, "consumerd64-path")) {
consumerd32_libdir_override = 1;
}
} else if (string_match(optname, "consumerd64-path")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd64-path");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd64-path");
consumerd64_bin_override = 1;
}
} else if (string_match(optname, "consumerd64-libdir")) {
consumerd64_bin_override = 1;
}
} else if (string_match(optname, "consumerd64-libdir")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd64-libdir");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--consumerd64-libdir");
consumerd64_libdir_override = 1;
}
} else if (string_match(optname, "pidfile") || opt == 'p') {
consumerd64_libdir_override = 1;
}
} else if (string_match(optname, "pidfile") || opt == 'p') {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-p, --pidfile");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-p, --pidfile");
}
}
} else if (string_match(optname, "agent-tcp-port")) {
}
}
} else if (string_match(optname, "agent-tcp-port")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--agent-tcp-port");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--agent-tcp-port");
DBG3("Agent TCP port set to non default: %u", agent_tcp_port);
}
} else if (string_match(optname, "load") || opt == 'l') {
DBG3("Agent TCP port set to non default: %u", agent_tcp_port);
}
} else if (string_match(optname, "load") || opt == 'l') {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-l, --load");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"-l, --load");
}
}
} else if (string_match(optname, "kmod-probes")) {
}
}
} else if (string_match(optname, "kmod-probes")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--kmod-probes");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--kmod-probes");
}
}
} else if (string_match(optname, "extra-kmod-probes")) {
}
}
} else if (string_match(optname, "extra-kmod-probes")) {
+ if (!arg || *arg == '\0') {
+ ret = -EINVAL;
+ goto end;
+ }
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--extra-kmod-probes");
if (lttng_is_setuid_setgid()) {
WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
"--extra-kmod-probes");