commit systemd for openSUSE:Factory
Hello community, here is the log from the commit of package systemd for openSUSE:Factory checked in at 2014-08-29 17:43:00 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/systemd (Old) and /work/SRC/openSUSE:Factory/.systemd.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "systemd" Changes: -------- --- /work/SRC/openSUSE:Factory/systemd/systemd-mini.changes 2014-08-27 16:53:17.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.systemd.new/systemd-mini.changes 2014-08-29 17:43:05.000000000 +0200 @@ -1,0 +2,28 @@ +Thu Aug 28 10:07:10 UTC 2014 - werner@suse.de + +- Add upstream patches + 0001-login-fix-memory-leak-on-DropController.patch + 0002-util-fix-minimal-race-where-we-might-miss-SIGTERMs-w.patch + 0003-sd-journal-properly-convert-object-size-on-big-endia.patch + 0004-sd-journal-verify-that-object-start-with-the-field-n.patch +- Add upstream patch + 1064-udev-hwdb-do-not-look-at-usb_device-parents.patch + to avoid that hwdb ID's for unrecognised USB device are taken + from the USB hub. + +------------------------------------------------------------------- +Wed Aug 27 16:01:17 UTC 2014 - werner@suse.de + +- Add upstream patches + 0001-systemctl-Correct-error-message-printed-when-bus_pro.patch + 0002-units-order-systemd-fsck-.service-after-local-fs-pre.patch + 0003-keymap-Adjust-for-more-Samsung-900X4-series.patch + +------------------------------------------------------------------- +Wed Aug 27 12:52:09 UTC 2014 - werner@suse.de + +- Add patch use-rndaddentropy-ioctl-to-load-random-seed.patch to + use RNDADDENTROPY ioctl to load random-seed and to increase + entropy count as well (bnc#892096) + +------------------------------------------------------------------- systemd.changes: same change New: ---- 0001-login-fix-memory-leak-on-DropController.patch 0001-systemctl-Correct-error-message-printed-when-bus_pro.patch 0002-units-order-systemd-fsck-.service-after-local-fs-pre.patch 0002-util-fix-minimal-race-where-we-might-miss-SIGTERMs-w.patch 0003-keymap-Adjust-for-more-Samsung-900X4-series.patch 0003-sd-journal-properly-convert-object-size-on-big-endia.patch 0004-sd-journal-verify-that-object-start-with-the-field-n.patch 1064-udev-hwdb-do-not-look-at-usb_device-parents.patch use-rndaddentropy-ioctl-to-load-random-seed.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ systemd-mini.spec ++++++ --- /var/tmp/diff_new_pack.q0sB47/_old 2014-08-29 17:43:12.000000000 +0200 +++ /var/tmp/diff_new_pack.q0sB47/_new 2014-08-29 17:43:12.000000000 +0200 @@ -798,6 +798,22 @@ Patch384: 0004-hwdb-update-format-description-and-document-reloadin.patch # PATCH-FIX-UPSTREAM added at 2014/08/25 Patch385: 0008-hwdb-update.patch +# PATCH-FIX-SUSE Use RNDADDENTROPY ioctl to load random-seed and to increase entropy count as well (bnc#892096) +Patch386: use-rndaddentropy-ioctl-to-load-random-seed.patch +# PATCH-FIX-UPSTREAM added at 2014/08/27 +Patch387: 0001-systemctl-Correct-error-message-printed-when-bus_pro.patch +# PATCH-FIX-UPSTREAM added at 2014/08/27 +Patch388: 0002-units-order-systemd-fsck-.service-after-local-fs-pre.patch +# PATCH-FIX-UPSTREAM added at 2014/08/27 +Patch389: 0003-keymap-Adjust-for-more-Samsung-900X4-series.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch390: 0001-login-fix-memory-leak-on-DropController.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch391: 0002-util-fix-minimal-race-where-we-might-miss-SIGTERMs-w.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch392: 0003-sd-journal-properly-convert-object-size-on-big-endia.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch393: 0004-sd-journal-verify-that-object-start-with-the-field-n.patch # UDEV PATCHES # ============ @@ -931,6 +947,8 @@ Patch1062: 1062-rules-set-default-permissions-for-GenWQE-devices.patch # PATCH-FIX-UPSTREAM 1063-udev-path_id-suppress-ID_PATH-for-devices-with-an-un.patch Patch1063: 1063-udev-path_id-suppress-ID_PATH-for-devices-with-an-un.patch +# PATCH-FIX-UPSTREAM 1064-udev-hwdb-do-not-look-at-usb_device-parents.patch +Patch1064: 1064-udev-hwdb-do-not-look-at-usb_device-parents.patch %description Systemd is a system and service manager, compatible with SysV and LSB @@ -1475,6 +1493,14 @@ %patch383 -p0 %patch384 -p0 %patch385 -p0 +%patch386 -p1 +%patch387 -p0 +%patch388 -p0 +%patch389 -p0 +%patch390 -p0 +%patch391 -p0 +%patch392 -p0 +%patch393 -p0 # udev patches %patch1001 -p1 @@ -1561,6 +1587,7 @@ %patch1061 -p0 %patch1062 -p1 %patch1063 -p0 +%patch1064 -p0 # remove patch backups find -name '*.orig' -exec rm -f '{}' \+ ++++++ systemd.spec ++++++ --- /var/tmp/diff_new_pack.q0sB47/_old 2014-08-29 17:43:12.000000000 +0200 +++ /var/tmp/diff_new_pack.q0sB47/_new 2014-08-29 17:43:12.000000000 +0200 @@ -793,6 +793,22 @@ Patch384: 0004-hwdb-update-format-description-and-document-reloadin.patch # PATCH-FIX-UPSTREAM added at 2014/08/25 Patch385: 0008-hwdb-update.patch +# PATCH-FIX-SUSE Use RNDADDENTROPY ioctl to load random-seed and to increase entropy count as well (bnc#892096) +Patch386: use-rndaddentropy-ioctl-to-load-random-seed.patch +# PATCH-FIX-UPSTREAM added at 2014/08/27 +Patch387: 0001-systemctl-Correct-error-message-printed-when-bus_pro.patch +# PATCH-FIX-UPSTREAM added at 2014/08/27 +Patch388: 0002-units-order-systemd-fsck-.service-after-local-fs-pre.patch +# PATCH-FIX-UPSTREAM added at 2014/08/27 +Patch389: 0003-keymap-Adjust-for-more-Samsung-900X4-series.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch390: 0001-login-fix-memory-leak-on-DropController.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch391: 0002-util-fix-minimal-race-where-we-might-miss-SIGTERMs-w.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch392: 0003-sd-journal-properly-convert-object-size-on-big-endia.patch +# PATCH-FIX-UPSTREAM added at 2014/08/28 +Patch393: 0004-sd-journal-verify-that-object-start-with-the-field-n.patch # UDEV PATCHES # ============ @@ -926,6 +942,8 @@ Patch1062: 1062-rules-set-default-permissions-for-GenWQE-devices.patch # PATCH-FIX-UPSTREAM 1063-udev-path_id-suppress-ID_PATH-for-devices-with-an-un.patch Patch1063: 1063-udev-path_id-suppress-ID_PATH-for-devices-with-an-un.patch +# PATCH-FIX-UPSTREAM 1064-udev-hwdb-do-not-look-at-usb_device-parents.patch +Patch1064: 1064-udev-hwdb-do-not-look-at-usb_device-parents.patch %description Systemd is a system and service manager, compatible with SysV and LSB @@ -1470,6 +1488,14 @@ %patch383 -p0 %patch384 -p0 %patch385 -p0 +%patch386 -p1 +%patch387 -p0 +%patch388 -p0 +%patch389 -p0 +%patch390 -p0 +%patch391 -p0 +%patch392 -p0 +%patch393 -p0 # udev patches %patch1001 -p1 @@ -1556,6 +1582,7 @@ %patch1061 -p0 %patch1062 -p1 %patch1063 -p0 +%patch1064 -p0 # remove patch backups find -name '*.orig' -exec rm -f '{}' \+ ++++++ 0001-login-fix-memory-leak-on-DropController.patch ++++++
From 60240797a4ce464ec7a0537ccbec4c83f599251c Mon Sep 17 00:00:00 2001 From: David Herrmann <dh.herrmann@gmail.com> Date: Fri, 22 Aug 2014 14:57:11 +0200 Subject: [PATCH] login: fix memory-leak on DropController()
Our bus-name watch helpers only remove a bus-name if it's not a controller, anymore. If we call manager_drop_busname() before unregistering the controller, the busname will not be dropped. Therefore, first drop the controller, then drop the bus-name. --- src/login/logind-session.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git src/login/logind-session.c src/login/logind-session.c index 136bbce..0c6e425 100644 --- src/login/logind-session.c +++ src/login/logind-session.c @@ -1061,11 +1061,13 @@ bool session_is_controller(Session *s, const char *sender) { static void session_swap_controller(Session *s, char *name) { SessionDevice *sd; + char *c; if (s->controller) { - manager_drop_busname(s->manager, s->controller); - free(s->controller); + c = s->controller; s->controller = NULL; + manager_drop_busname(s->manager, c); + free(c); /* Drop all devices as they're now unused. Do that after the * controller is released to avoid sending out useles -- 1.7.9.2 ++++++ 0001-systemctl-Correct-error-message-printed-when-bus_pro.patch ++++++
From 498cfc230af8f83675be2e92057956f1792969e4 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons <sjoerd.simons@collabora.co.uk> Date: Sat, 23 Aug 2014 21:11:44 +0200 Subject: [PATCH] systemctl: Correct error message printed when bus_process_wait fails
Actually use the variable containing the return code of bus_process_wait when printing the error message as a result of it failing. --- src/systemctl/systemctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git src/systemctl/systemctl.c src/systemctl/systemctl.c index d9b8bee..6534819 100644 --- src/systemctl/systemctl.c +++ src/systemctl/systemctl.c @@ -2382,7 +2382,7 @@ static int wait_for_jobs(sd_bus *bus, Set *s) { while (!set_isempty(s)) { q = bus_process_wait(bus); if (q < 0) { - log_error("Failed to wait for response: %s", strerror(-r)); + log_error("Failed to wait for response: %s", strerror(-q)); return q; } -- 1.7.9.2 ++++++ 0002-units-order-systemd-fsck-.service-after-local-fs-pre.patch ++++++
From 66f311206e908a5b6f21e66fad73e1e5ea3e31d6 Mon Sep 17 00:00:00 2001 From: Ivan Shapovalov <intelfx100@gmail.com> Date: Wed, 27 Aug 2014 00:17:43 +0400 Subject: [PATCH] units: order systemd-fsck@.service after local-fs-pre.target.
With this change, it becomes possible to order a unit to activate before any modifications to the file systems. This is especially useful for supporting resume from hibernation. --- units/systemd-fsck@.service.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git units/systemd-fsck@.service.in units/systemd-fsck@.service.in index c12efa8..d2cda6a 100644 --- units/systemd-fsck@.service.in +++ units/systemd-fsck@.service.in @@ -10,7 +10,7 @@ Description=File System Check on %f Documentation=man:systemd-fsck@.service(8) DefaultDependencies=no BindsTo=%i.device -After=systemd-readahead-collect.service systemd-readahead-replay.service %i.device systemd-fsck-root.service +After=systemd-readahead-collect.service systemd-readahead-replay.service %i.device systemd-fsck-root.service local-fs-pre.target Before=shutdown.target [Service] -- 1.7.9.2 ++++++ 0002-util-fix-minimal-race-where-we-might-miss-SIGTERMs-w.patch ++++++ Based on 8a7c93d858c342744adf481565d8bb03b9713dcf Mon Sep 17 00:00:00 2001 From: Lennart Poettering <lennart@poettering.net> Date: Wed, 27 Aug 2014 21:42:20 +0200 Subject: [PATCH] util: fix minimal race where we might miss SIGTERMs when forking off an agent Before forking, block all signals, and unblock them afterwards. This way the child will have them blocked, and we won't lose them. --- src/shared/util.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) --- src/shared/util.c +++ src/shared/util.c 2014-08-28 10:32:06.442693437 +0000 @@ -894,6 +894,18 @@ int reset_all_signal_handlers(void) { return 0; } +static int reset_signal_mask(void) { + sigset_t ss; + + if (sigemptyset(&ss) < 0) + return -errno; + + if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0) + return -errno; + + return 0; +} + char *strstrip(char *s) { char *e; @@ -5119,9 +5131,9 @@ int fd_inc_rcvbuf(int fd, size_t n) { } int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...) { - pid_t parent_pid, agent_pid; - int fd; bool stdout_is_tty, stderr_is_tty; + pid_t parent_pid, agent_pid; + sigset_t ss, saved_ss; unsigned n, i; va_list ap; char **l; @@ -5129,16 +5141,25 @@ int fork_agent(pid_t *pid, const int exc assert(pid); assert(path); - parent_pid = getpid(); - /* Spawns a temporary TTY agent, making sure it goes away when * we go away */ + parent_pid = getpid(); + + /* First we temporarily block all signals, so that the new + * child has them blocked initially. This way, we can be sure + * that SIGTERMs are not lost we might send to the agent. */ + assert_se(sigfillset(&ss) >= 0); + assert_se(sigprocmask(SIG_SETMASK, &ss, &saved_ss) >= 0); + agent_pid = fork(); - if (agent_pid < 0) + if (agent_pid < 0) { + assert_se(sigprocmask(SIG_SETMASK, &saved_ss, NULL) >= 0); return -errno; + } if (agent_pid != 0) { + assert_se(sigprocmask(SIG_SETMASK, &saved_ss, NULL) >= 0); *pid = agent_pid; return 0; } @@ -5149,6 +5170,12 @@ int fork_agent(pid_t *pid, const int exc if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0) _exit(EXIT_FAILURE); + /* Make sure we actually can kill the agent, if we need to, in + * case somebody invoked us from a shell script that trapped + * SIGTERM or so... */ + reset_all_signal_handlers(); + reset_signal_mask(); + /* Check whether our parent died before we were able * to set the death signal */ if (getppid() != parent_pid) @@ -5161,6 +5188,8 @@ int fork_agent(pid_t *pid, const int exc stderr_is_tty = isatty(STDERR_FILENO); if (!stdout_is_tty || !stderr_is_tty) { + int fd; + /* Detach from stdout/stderr. and reopen * /dev/tty for them. This is important to * ensure that when systemctl is started via ++++++ 0003-keymap-Adjust-for-more-Samsung-900X4-series.patch ++++++
From e512e8a255ef29d5a8eb605f8849202ea3d3e4cb Mon Sep 17 00:00:00 2001 From: Martin Pitt <martin.pitt@ubuntu.com> Date: Wed, 27 Aug 2014 08:41:10 +0200 Subject: [PATCH] keymap: Adjust for more Samsung 900X4 series
Reportedly also applies to NP900X4B, so relax the match to apply to all models of this series. https://launchpad.net/bugs/902332 --- hwdb/60-keyboard.hwdb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git hwdb/60-keyboard.hwdb hwdb/60-keyboard.hwdb index ef0ebc5..0ffcb83 100644 --- hwdb/60-keyboard.hwdb +++ hwdb/60-keyboard.hwdb @@ -939,7 +939,7 @@ keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*550P*:pvr* # Series 7 / 9 keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*700Z*:pvr* keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*700G*:pvr* -keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*900X[34][CDEFG]*:pvr* +keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*900X[34]*:pvr* keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*940X3G*:pvr* KEYBOARD_KEY_ce=!prog1 # Fn+F1 launch settings KEYBOARD_KEY_a0=!mute # Fn+F6 mute -- 1.7.9.2 ++++++ 0003-sd-journal-properly-convert-object-size-on-big-endia.patch ++++++
From 57cd09acf2c63a414aa2131c00a2b3f600eb0133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> Date: Sat, 23 Aug 2014 22:35:03 -0400 Subject: [PATCH] sd-journal: properly convert object->size on big endian
mmap code crashes when attempting to map an object of zero size. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=758392 https://bugs.freedesktop.org/show_bug.cgi?id=82894 --- src/journal/journal-file.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git src/journal/journal-file.h src/journal/journal-file.h index 3d41682..da2ef3b 100644 --- src/journal/journal-file.h +++ src/journal/journal-file.h @@ -214,14 +214,15 @@ static unsigned type_to_context(int type) { static inline int journal_file_object_keep(JournalFile *f, Object *o, uint64_t offset) { unsigned context = type_to_context(o->object.type); + uint64_t s = le64toh(o->object.size); return mmap_cache_get(f->mmap, f->fd, f->prot, context, true, - offset, o->object.size, &f->last_stat, NULL); + offset, s, &f->last_stat, NULL); } static inline int journal_file_object_release(JournalFile *f, Object *o, uint64_t offset) { unsigned context = type_to_context(o->object.type); + uint64_t s = le64toh(o->object.size); - return mmap_cache_release(f->mmap, f->fd, f->prot, context, - offset, o->object.size); + return mmap_cache_release(f->mmap, f->fd, f->prot, context, offset, s); } -- 1.7.9.2 ++++++ 0004-sd-journal-verify-that-object-start-with-the-field-n.patch ++++++ Based on 0f99f74a14ef193c1ebde687c5cc76e1d67b85ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> Date: Tue, 26 Aug 2014 23:54:31 -0400 Subject: [PATCH] sd-journal: verify that object start with the field name If the journal is corrupted, we might return an object that does not start with the expected field name and/or is shorter than it should. --- src/journal/sd-journal.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git src/journal/sd-journal.c src/journal/sd-journal.c index 80ff8fe..693707c 100644 --- src/journal/sd-journal.c +++ src/journal/sd-journal.c @@ -2571,6 +2571,21 @@ _public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_ if (r < 0) return r; + /* Check if we have at least the field name and "=". */ + if (ol <= k) { + log_debug("%s:offset " OFSfmt ": object has size %zu, expected at least %zu", + j->unique_file->path, j->unique_offset, + ol, k + 1); + return -EBADMSG; + } + + if (memcmp(odata, j->unique_field, k) || ((const char*) odata)[k] != '=') { + log_debug("%s:offset " OFSfmt ": object does not start with \"%s=\"", + j->unique_file->path, j->unique_offset, + j->unique_field); + return -EBADMSG; + } + /* OK, now let's see if we already returned this data * object by checking if it exists in the earlier * traversed files. */ -- 1.7.9.2 ++++++ 1064-udev-hwdb-do-not-look-at-usb_device-parents.patch ++++++
From 77cf759ea05bea476cdcb8d0dcd04c4e6fb3b2ff Mon Sep 17 00:00:00 2001 From: Kay Sievers <kay@vrfy.org> Date: Tue, 26 Aug 2014 18:27:36 +0200 Subject: [PATCH] udev: hwdb - do not look at "usb_device" parents
Based on a patch from Simon McVittie <simon.mcvittie@collabora.co.uk>. Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=758050 --- src/udev/udev-builtin-hwdb.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git src/udev/udev-builtin-hwdb.c src/udev/udev-builtin-hwdb.c index cac97e7..695a31a 100644 --- src/udev/udev-builtin-hwdb.c +++ src/udev/udev-builtin-hwdb.c @@ -88,9 +88,10 @@ static int udev_builtin_hwdb_search(struct udev_device *dev, struct udev_device const char *filter, bool test) { struct udev_device *d; char s[16]; - int n = 0; + bool last = false; + int r = 0; - for (d = srcdev; d; d = udev_device_get_parent(d)) { + for (d = srcdev; d && !last; d = udev_device_get_parent(d)) { const char *dsubsys; const char *modalias = NULL; @@ -104,19 +105,24 @@ static int udev_builtin_hwdb_search(struct udev_device *dev, struct udev_device modalias = udev_device_get_property_value(d, "MODALIAS"); - /* the usb_device does not have a modalias, compose one */ - if (!modalias && streq(dsubsys, "usb")) - modalias = modalias_usb(d, s, sizeof(s)); + if (streq(dsubsys, "usb") && streq_ptr(udev_device_get_devtype(d), "usb_device")) { + /* if the usb_device does not have a modalias, compose one */ + if (!modalias) + modalias = modalias_usb(d, s, sizeof(s)); + + /* avoid looking at any parent device, they are usually just a USB hub */ + last = true; + } if (!modalias) continue; - n = udev_builtin_hwdb_lookup(dev, prefix, modalias, filter, test); - if (n > 0) + r = udev_builtin_hwdb_lookup(dev, prefix, modalias, filter, test); + if (r > 0) break; } - return n; + return r; } static int builtin_hwdb(struct udev_device *dev, int argc, char *argv[], bool test) { -- 1.7.9.2 ++++++ use-rndaddentropy-ioctl-to-load-random-seed.patch ++++++ Simply writing /var/lib/systemd/random-seed back to /dev/(u)random does not increase the entropy bit count. Therefore use the RNDADDENTROPY ioctl to write back the bytes and increase the entropy bit counter. Related to bnc#892096 --- systemd-210/src/random-seed/random-seed.c | 66 +++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 5 deletions(-) --- systemd-210/src/random-seed/random-seed.c +++ systemd-210/src/random-seed/random-seed.c 2014-08-27 11:58:59.022526580 +0000 @@ -22,7 +22,9 @@ #include <unistd.h> #include <fcntl.h> #include <errno.h> +#include <linux/random.h> #include <string.h> +#include <sys/ioctl.h> #include <sys/stat.h> #include "log.h" @@ -32,8 +34,9 @@ #define POOL_SIZE_MIN 512 int main(int argc, char *argv[]) { - _cleanup_close_ int seed_fd = -1, random_fd = -1; + _cleanup_close_ int seed_fd = -1, random_fd = -1, entropy_fd = -1; _cleanup_free_ void* buf = NULL; + size_t entropy_count = 0; size_t buf_size = 0; ssize_t k; int r; @@ -82,6 +85,23 @@ int main(int argc, char *argv[]) { if (streq(argv[1], "load")) { + entropy_fd = open(RANDOM_SEED_DIR "entropy_count", O_RDONLY|O_CLOEXEC|O_NOCTTY, 0600); + if (entropy_fd < 0) { + entropy_count = 0; + if (errno != ENOENT) { + log_error("Failed to open " RANDOM_SEED "/entropy_count: %m"); + r = -errno; + goto finish; + } + } else { + r = read(entropy_fd, &entropy_count, sizeof(entropy_count)); + if (r < 0) { + log_error("Failed to read entropy count file: %m"); + r = -errno; + goto finish; + } + } + seed_fd = open(RANDOM_SEED, O_RDWR|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600); if (seed_fd < 0) { seed_fd = open(RANDOM_SEED, O_RDONLY|O_CLOEXEC|O_NOCTTY); @@ -113,16 +133,37 @@ int main(int argc, char *argv[]) { } else { lseek(seed_fd, 0, SEEK_SET); - k = loop_write(random_fd, buf, (size_t) k, false); - if (k <= 0) { - log_error("Failed to write seed to /dev/urandom: %s", r < 0 ? strerror(-r) : "short write"); + if (entropy_count && (size_t) k == buf_size) { + struct rand_pool_info entropy = { + .entropy_count = entropy_count, + .buf_size = buf_size, + }; + entropy.buf[0] = ((__u32*)buf)[0]; + r = ioctl(random_fd, RNDADDENTROPY, &entropy); + if (r < 0) { + log_error("Failed to write seed to /dev/urandom: %m"); + r = -errno; + } + } else { + k = loop_write(random_fd, buf, (size_t) k, false); + if (k <= 0) { + log_error("Failed to write seed to /dev/urandom: %s", r < 0 ? strerror(-r) : "short write"); - r = k == 0 ? -EIO : (int) k; + r = k == 0 ? -EIO : (int) k; + } } } } else if (streq(argv[1], "save")) { + /* Read available entropy count, if possible */ + f = fopen("/proc/sys/kernel/random/entropy_avail", "re"); + if (f) { + if (fscanf(f, "%zu", &entropy_count) < 0) + entropy_count = 0; + fclose(f); + } + seed_fd = open(RANDOM_SEED, O_WRONLY|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600); if (seed_fd < 0) { log_error("Failed to open " RANDOM_SEED ": %m"); @@ -137,6 +178,21 @@ int main(int argc, char *argv[]) { goto finish; } + if (entropy_count) { + entropy_fd = open(RANDOM_SEED_DIR "entropy_count", O_WRONLY|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600); + if (seed_fd < 0) { + log_error("Failed to open " RANDOM_SEED_DIR "entropy_count: %m"); + r = -errno; + goto finish; + } + r = write(entropy_fd, &entropy_count, sizeof(entropy_count)); + if (r < 0) { + log_error("Failed to write entropy count file: %m"); + r = -errno; + goto finish; + } + } + } else { log_error("Unknown verb %s.", argv[1]); r = -EINVAL; -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de