manager: simplify error handling in manager_deserialize()

If a memory error occurred, we would still go through the path which sets the
error on ferror(). It is unlikely that ferror() returns true, but it's seems
cleaner to just propagate the error we already have.

The handling of fgets() returning NULL is also simplified: according to the man
page, it returns NULL only on EOF or error. So if feof() returns true, I don't
think we should call ferror() again.

While at it, let's set errno to 0 and check that it is set before returning it
as an error. The man pages for fgets() and feof() do not say anything about
setting errno.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2018-10-10 13:54:13 +02:00
parent 4df7d537c8
commit 05067c3c1f
1 changed files with 17 additions and 34 deletions

View File

@ -3223,13 +3223,11 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
char line[LINE_MAX];
const char *val, *l;
errno = 0;
if (!fgets(line, sizeof(line), f)) {
if (feof(f))
r = 0;
else
r = -errno;
goto finish;
if (!feof(f))
return -errno ?: -EIO;
return 0;
}
char_array_0(line);
@ -3328,7 +3326,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
} else if (startswith(l, "env=")) {
r = deserialize_environment(&m->environment, l);
if (r == -ENOMEM)
goto finish;
return r;
if (r < 0)
log_notice_errno(r, "Failed to parse environment entry: \"%s\", ignoring: %m", l);
@ -3344,16 +3342,9 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
}
} else if ((val = startswith(l, "notify-socket="))) {
char *n;
n = strdup(val);
if (!n) {
r = -ENOMEM;
goto finish;
}
free(m->notify_socket);
m->notify_socket = n;
r = free_and_strdup(&m->notify_socket, val);
if (r < 0)
return r;
} else if ((val = startswith(l, "cgroups-agent-fd="))) {
int fd;
@ -3388,10 +3379,8 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
exec_runtime_deserialize_one(m, val, fds);
else if ((val = startswith(l, "subscribed="))) {
if (strv_extend(&m->deserialized_subscribed, val) < 0) {
r = -ENOMEM;
goto finish;
}
if (strv_extend(&m->deserialized_subscribed, val) < 0)
return -ENOMEM;
} else {
ManagerTimestamp q;
@ -3419,13 +3408,11 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
const char* unit_name;
/* Start marker */
errno = 0;
if (!fgets(name, sizeof(name), f)) {
if (feof(f))
r = 0;
else
r = -errno;
goto finish;
if (!feof(f))
return -errno ?: -EIO;
return 0;
}
char_array_0(name);
@ -3434,7 +3421,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
r = manager_load_unit(m, unit_name, NULL, NULL, &u);
if (r < 0) {
if (r == -ENOMEM)
goto finish;
return r;
log_notice_errno(r, "Failed to load unit \"%s\", skipping deserialization: %m", unit_name);
unit_deserialize_skip(f);
@ -3444,17 +3431,13 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
r = unit_deserialize(u, f, fds);
if (r < 0) {
if (r == -ENOMEM)
goto finish;
return r;
log_notice_errno(r, "Failed to deserialize unit \"%s\": %m", unit_name);
}
}
finish:
if (ferror(f))
r = -EIO;
return r;
return 0;
}
static void manager_flush_finished_jobs(Manager *m) {