From: David Herrmann Date: Fri, 12 Dec 2014 08:43:54 +0000 (+0100) Subject: hwdb: fix dangling 'else' ambuguity X-Git-Tag: v219~1043 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=bff686e2a981ccd0888cdf1981977d24320f1770;hp=0b9315719154fa7ea1a075e1b3785713f5acc3a1 hwdb: fix dangling 'else' ambuguity Imagine the following use of hwdb: if (condition_A) SD_HWDB_FOREACH_PROPERTY(hwdb, modalias, key, value) operation_A(key, value); else log_error("..."); This should work just fine, but but definitely does not what you would expect. Due to how SD_HWDB_FOREACH_PROPERTY is defined, the dangling 'else' is linked to the hidden 'if' statement in the macro instead of the outer 'if (condition_A)'. This is unexpected and really annoying to debug. Fix this by never leaving un-finished if-statements in SD_HWDB_FOREACH_PROPERTY(). We simply inverse the if() statement and explicitly add an 'else'-branch. This way, the statement is closed and all ambuguities are resolved. --- diff --git a/src/systemd/sd-hwdb.h b/src/systemd/sd-hwdb.h index f41555df7..3c44b981d 100644 --- a/src/systemd/sd-hwdb.h +++ b/src/systemd/sd-hwdb.h @@ -39,8 +39,9 @@ int sd_hwdb_get(sd_hwdb *hwdb, const char *modalias, const char *key, const char int sd_hwdb_seek(sd_hwdb *hwdb, const char *modalias); int sd_hwdb_enumerate(sd_hwdb *hwdb, const char **key, const char **value); +/* the inverse condition avoids ambiguity of danling 'else' after the macro */ #define SD_HWDB_FOREACH_PROPERTY(hwdb, modalias, key, value) \ - if (sd_hwdb_seek(hwdb, modalias) >= 0) \ - while (sd_hwdb_enumerate(hwdb, &(key), &(value)) > 0) + if (sd_hwdb_seek(hwdb, modalias) < 0) { } \ + else while (sd_hwdb_enumerate(hwdb, &(key), &(value)) > 0) #endif