[systemd-devel] Various bug fixes
Lennart Poettering
lennart at poettering.net
Fri Sep 21 07:30:44 PDT 2012
On Fri, 21.09.12 15:25, Václav Pavlín (vpavlin at redhat.com) wrote:
> You can find few patches for various bugs in attachement.
Thanks!
I'll let Kay merge the udev related patches. The rest I merged, with a
few exceptions:
> + r = 0;
> if (!isempty(cvtnr))
> - safe_atou32(cvtnr, &vtnr);
> + r = safe_atou32(cvtnr, &vtnr);
>
> - if (!isempty(display) && vtnr <= 0) {
> + if (!isempty(display) && !r && vtnr <= 0) {
> if (isempty(seat))
> get_seat_from_display(display, &seat, &vtnr);
> else if (streq(seat, "seat0"))
vtnr here is actually initialized to zero anyway, so if safe_atou32()
fails it will still be 0, and we'll detect this. With other words: the
missing error checking is not actually missing, I simply folded the
parse error check into the range check... To clarify this I have now
commited a patch explaining this.
> - if (mount("/etc/localtime", where, "bind", MS_BIND, NULL) >= 0)
> - mount("/etc/localtime", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL);
> + if (mount("/etc/localtime", where, "bind", MS_BIND, NULL) >= 0) {
> + if (mount("/etc/localtime", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL) < 0)
> + log_warning("mount(%s) failed, file will be writable: %m", where);
> + } else {
> + log_error("mount(%s) failed: %m", where);
> + return -errno;
> + }
Not sure about this. /etc/localtime mounting is really not that
important. Basically we do it here just to be nice, which is why I am
not generating any error messages for it.
That all said this entire function is now broken, and should be fixed,
as /etc/localtime is now a symlink and we cannot bind mount
symlinks. I'll change it to simply sync the symlink by creating it anew.
> - if (mount("/etc/resolv.conf", where, "bind", MS_BIND, NULL) >= 0)
> - mount("/etc/resolv.conf", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL);
> + if (mount("/etc/resolv.conf", where, "bind", MS_BIND, NULL) >= 0) {
> + if (mount("/etc/resolv.conf", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL) < 0)
> + log_warning("mount(%s) failed, file will be writable: %m", where);
> + } else {
> + log_error("mount(%s) failed: %m", where);
> + return -errno;
> + }
Overmounting /etc/resolv.conf is another one of these cases where's it's
just nice to do this, but doesn't really matter, which is why we fail silently.
> +++ b/src/shared/hwclock.c
> @@ -78,7 +78,7 @@ static int rtc_open(int flags) {
> p = strjoin("/sys/class/rtc/", de->d_name, "/hctosys", NULL);
> if (!p) {
> closedir(d);
> - return -ENOMEM;
> + return log_oom();
> }
Hmm, so, I don't think we should invoke log_oom() here. "Library-style" calls
like this one should probably not generate messages on their own, but
leave that to their callers. Returning ENOMEM is hence the right thing
here.
log_oom() is something for actual program code. The lines between
"library code" and "program code" are a bit blurry, admittedly, and
there are a couple of occasion where this currently not handled
correctly in the codebase, but we still should try to follow this rule
wherever applicable.
> r = read_one_line_file(p, &v);
> @@ -94,6 +94,12 @@ static int rtc_open(int flags) {
> continue;
>
> p = strappend("/dev/", de->d_name);
> +
> + if (!p) {
> + closedir(d);
> + return log_oom();
> + }
This part is important however. so I canged this to -ENOMEM and commited
it.
> >From 4f9408af71ff55aeac3b51d2fe6208c1cb8e2417 Mon Sep 17 00:00:00 2001
> From: Lukas Nykryn <lnykryn at redhat.com>
> Date: Fri, 21 Sep 2012 12:59:15 +0200
> Subject: [PATCH 16/18] journal: free JournalFile when *ret is null
Hmm, we shouldn't allow passing in a NULL ret here anyway. I have now
changed the sources to ensure this.
Thanks a ton for the thorough review! Much appreciated!
Lennart
--
Lennart Poettering - Red Hat, Inc.
More information about the systemd-devel
mailing list