diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-01-11 22:07:35 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-01-11 22:08:33 +0100 |
commit | fdcad0c25579a60061b1fda956686e878a80faef (patch) | |
tree | 7da98d56a4a9aac0a291440bca837243c9a99d88 /src | |
parent | 52beb2c379674e066d6cf50d59874478403e4da4 (diff) |
tmpfiles: fix parsing of /proc/net/unix on 32Bit machines
Tracked down by Michael Meeks
Diffstat (limited to 'src')
-rw-r--r-- | src/tmpfiles.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/tmpfiles.c b/src/tmpfiles.c index 19a7c08c40..44e5c9d28d 100644 --- a/src/tmpfiles.c +++ b/src/tmpfiles.c @@ -117,41 +117,50 @@ static void load_unix_sockets(void) { /* We maintain a cache of the sockets we found in * /proc/net/unix to speed things up a little. */ - if (!(unix_sockets = set_new(string_hash_func, string_compare_func))) + unix_sockets = set_new(string_hash_func, string_compare_func); + if (!unix_sockets) return; - if (!(f = fopen("/proc/net/unix", "re"))) + f = fopen("/proc/net/unix", "re"); + if (!f) return; - if (!(fgets(line, sizeof(line), f))) + /* Skip header */ + if (!fgets(line, sizeof(line), f)) goto fail; for (;;) { char *p, *s; int k; - if (!(fgets(line, sizeof(line), f))) + if (!fgets(line, sizeof(line), f)) break; truncate_nl(line); - if (strlen(line) < 53) + p = strchr(line, ':'); + if (!p) + continue; + + if (strlen(p) < 37) continue; - p = line + 53; + p += 37; p += strspn(p, WHITESPACE); - p += strcspn(p, WHITESPACE); + p += strcspn(p, WHITESPACE); /* skip one more word */ p += strspn(p, WHITESPACE); if (*p != '/') continue; - if (!(s = strdup(p))) + s = strdup(p); + if (!s) goto fail; path_kill_slashes(s); - if ((k = set_put(unix_sockets, s)) < 0) { + k = set_put(unix_sockets, s); + if (k < 0) { free(s); if (k != -EEXIST) @@ -1059,7 +1068,8 @@ int main(int argc, char *argv[]) { Item *i; Iterator iterator; - if ((r = parse_argv(argc, argv)) <= 0) + r = parse_argv(argc, argv); + if (r <= 0) return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; log_set_target(LOG_TARGET_AUTO); |