diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-04-02 16:07:21 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-04-04 22:46:19 -0400 |
commit | d257f05a5f9710c9e6ca558fbabc77e504ca8668 (patch) | |
tree | d276866679f5cf5ca148094f4ba60a646508dd11 | |
parent | 917b5dc7075a15bded4948efba8e686dba4509f8 (diff) |
timedated: fix a few memory leaks
Contents of /etc/adjtime and more.
-rw-r--r-- | src/timedate/timedated.c | 51 |
1 files changed, 16 insertions, 35 deletions
diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index e068724903..4efa806c39 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -216,7 +216,7 @@ static int write_data_timezone(void) { static int write_data_local_rtc(void) { int r; - char *s, *w; + char _cleanup_free_ *s = NULL, *w = NULL; r = read_full_file("/etc/adjtime", &s, NULL); if (r < 0) { @@ -234,55 +234,42 @@ static int write_data_local_rtc(void) { size_t a, b; p = strchr(s, '\n'); - if (!p) { - free(s); + if (!p) return -EIO; - } p = strchr(p+1, '\n'); - if (!p) { - free(s); + if (!p) return -EIO; - } p++; e = strchr(p, '\n'); - if (!e) { - free(s); + if (!e) return -EIO; - } a = p - s; b = strlen(e); w = new(char, a + (tz.local_rtc ? 5 : 3) + b + 1); - if (!w) { - free(s); + if (!w) return -ENOMEM; - } *(char*) mempcpy(stpcpy(mempcpy(w, s, a), tz.local_rtc ? "LOCAL" : "UTC"), e, b) = 0; if (streq(w, NULL_ADJTIME_UTC)) { - free(w); - - if (unlink("/etc/adjtime") < 0) { + if (unlink("/etc/adjtime") < 0) if (errno != ENOENT) return -errno; - } return 0; } } label_init("/etc"); - r = write_string_file_atomic_label("/etc/adjtime", w); - free(w); - - return r; + return write_string_file_atomic_label("/etc/adjtime", w); } static char** get_ntp_services(void) { - char **r = NULL, **files, **i; + char _cleanup_strv_free_ **r = NULL, **files; + char **i; int k; k = conf_files_list(&files, ".list", NULL, @@ -295,14 +282,14 @@ static char** get_ntp_services(void) { return NULL; STRV_FOREACH(i, files) { - FILE *f; + FILE _cleanup_fclose_ *f; f = fopen(*i, "re"); if (!f) continue; for (;;) { - char line[PATH_MAX], *l, **q; + char line[PATH_MAX], *l; if (!fgets(line, sizeof(line), f)) { @@ -316,22 +303,16 @@ static char** get_ntp_services(void) { if (l[0] == 0 || l[0] == '#') continue; - q = strv_append(r, l); - if (!q) { + if (strv_extend(&r, l) < 0) log_oom(); - break; - } - - strv_free(r); - r = q; + return NULL; } - - fclose(f); } - strv_free(files); + i = r; + r = NULL; /* avoid cleanup */ - return strv_uniq(r); + return strv_uniq(i); } static int read_ntp(DBusConnection *bus) { |