summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Beller <stefanbeller@googlemail.com>2013-12-30 17:43:52 +0100
committerKay Sievers <kay@vrfy.org>2013-12-30 19:10:22 +0100
commit34a3baa4dbd8a4032ae74cb5947b9494bf3ec106 (patch)
tree8d8d79ad89227f478ca903a7cc08a18694c87af9 /src
parent226b735a745c1e9bbab24b47460d7304def9d38f (diff)
sleep-config: Dereference pointer before check for NULL
This fixes a bug pointed out by http://css.csail.mit.edu/stack/ (Optimization-unstable code) It is a similar fix as f146f5e159 (2013-12-30, core: Forgot to dereference pointer when checking for NULL) To explain this bug consider the following similar, but simpler code: if (!p) free(*p) Assume the if condition evaluates to true, then we will access *p, which means the compiler can assume p is a valid pointer, so it could dereference p and use the value *p. Assuming p as a valid pointer, !p will be false. But initally we assumed the condition evaluates to true. By this reasoning the optimizing compiler can deduce, we have dead code. ("The if will never be taken, as *p must be valid, because otherwise accessing *p inside the if would segfault") This led to an error message of the static code checker, so I checked the code in question. As we access *modes and *states before the check in the changed line of this patch, I assume the line to be wrong and we actually wanted to check for *modes and *states being both non null.
Diffstat (limited to 'src')
-rw-r--r--src/shared/sleep-config.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/shared/sleep-config.c b/src/shared/sleep-config.c
index d76e3ad03..b2a078784 100644
--- a/src/shared/sleep-config.c
+++ b/src/shared/sleep-config.c
@@ -94,7 +94,7 @@ int parse_sleep_config(const char *verb, char ***modes, char ***states) {
} else
assert_not_reached("what verb");
- if (!modes || !states) {
+ if (!*modes || !*states) {
strv_free(*modes);
strv_free(*states);
return log_oom();