diff --git a/0001-sd-rtnl-message-append-fix-uninitialized-memory.patch b/0001-sd-rtnl-message-append-fix-uninitialized-memory.patch new file mode 100644 index 00000000..cde6a3da --- /dev/null +++ b/0001-sd-rtnl-message-append-fix-uninitialized-memory.patch @@ -0,0 +1,111 @@ +Backport of 7ca1d31964a2553f7bd011bc10ac42e0ebc1f975 Mon Sep 17 00:00:00 2001 +From: Tom Gundersen +Date: Fri, 2 May 2014 22:29:18 +0200 +Subject: [PATCH] sd-rtnl-message: append - fix uninitialized memory + +We were not properly clearing the padding at the front of some containers. +--- + src/libsystemd/sd-rtnl/rtnl-message.c | 42 +++++++++++++++++++++------------- + 1 file changed, 27 insertions(+), 15 deletions(-) + +--- src/libsystemd/sd-rtnl/rtnl-message.c ++++ src/libsystemd/sd-rtnl/rtnl-message.c 2014-05-05 13:33:01.998235340 +0000 +@@ -314,24 +314,28 @@ int sd_rtnl_message_link_get_flags(sd_rt + /* If successful the updated message will be correctly aligned, if + unsuccessful the old message is untouched. */ + static int add_rtattr(sd_rtnl_message *m, unsigned short type, const void *data, size_t data_length) { +- uint32_t rta_length, message_length; ++ uint32_t rta_length; ++ size_t message_length, padding_length; + struct nlmsghdr *new_hdr; + struct rtattr *rta; + char *padding; + unsigned i; ++ int offset; + + assert(m); + assert(m->hdr); + assert(!m->sealed); + assert(NLMSG_ALIGN(m->hdr->nlmsg_len) == m->hdr->nlmsg_len); +- assert(!data || data_length > 0); +- assert(data || m->n_containers < RTNL_CONTAINER_DEPTH); ++ assert(!data || data_length); ++ ++ /* get offset of the new attribute */ ++ offset = m->hdr->nlmsg_len; + + /* get the size of the new rta attribute (with padding at the end) */ + rta_length = RTA_LENGTH(data_length); + + /* get the new message size (with padding at the end) */ +- message_length = m->hdr->nlmsg_len + RTA_ALIGN(rta_length); ++ message_length = offset + RTA_ALIGN(rta_length); + + /* realloc to fit the new attribute */ + new_hdr = realloc(m->hdr, message_length); +@@ -340,32 +344,35 @@ static int add_rtattr(sd_rtnl_message *m + m->hdr = new_hdr; + + /* get pointer to the attribute we are about to add */ +- rta = (struct rtattr *) ((uint8_t *) m->hdr + m->hdr->nlmsg_len); ++ rta = (struct rtattr *) ((uint8_t *) m->hdr + offset); + + /* if we are inside containers, extend them */ + for (i = 0; i < m->n_containers; i++) +- GET_CONTAINER(m, i)->rta_len += message_length - m->hdr->nlmsg_len; ++ GET_CONTAINER(m, i)->rta_len += message_length - offset; + + /* fill in the attribute */ + rta->rta_type = type; + rta->rta_len = rta_length; +- if (!data) { +- /* this is the start of a new container */ +- m->container_offsets[m->n_containers ++] = m->hdr->nlmsg_len; +- } else { ++ if (data) + /* we don't deal with the case where the user lies about the type + * and gives us too little data (so don't do that) +- */ ++ */ + padding = mempcpy(RTA_DATA(rta), data, data_length); +- /* make sure also the padding at the end of the message is initialized */ +- memzero(padding, +- (uint8_t *) m->hdr + message_length - (uint8_t *) padding); ++ else { ++ /* if no data was passed, make sure we still initialize the padding ++ note that we can have data_length > 0 (used by some containers) */ ++ padding = RTA_DATA(rta); ++ data_length = 0; + } + ++ /* make sure also the padding at the end of the message is initialized */ ++ padding_length = (uint8_t*)m->hdr + message_length - (uint8_t*)padding; ++ memzero(padding, padding_length); ++ + /* update message size */ + m->hdr->nlmsg_len = message_length; + +- return 0; ++ return offset; + } + + int sd_rtnl_message_append_string(sd_rtnl_message *m, unsigned short type, const char *data) { +@@ -498,6 +505,7 @@ int sd_rtnl_message_append_u32(sd_rtnl_m + + assert_return(m, -EINVAL); + assert_return(!m->sealed, -EPERM); ++ assert_return(m->n_containers < RTNL_CONTAINER_DEPTH, -ERANGE); + + r = sd_rtnl_message_get_type(m, &rtm_type); + if (r < 0) +@@ -548,6 +556,10 @@ int sd_rtnl_message_append_u32(sd_rtnl_m + if (r < 0) + return r; + ++ m->container_offsets[m->n_containers ++] = r; ++ ++ m->container_offsets[m->n_containers ++] = r; ++ + return 0; + } + diff --git a/keep-crypt-password-prompt.patch b/keep-crypt-password-prompt.patch new file mode 100644 index 00000000..3caffec8 --- /dev/null +++ b/keep-crypt-password-prompt.patch @@ -0,0 +1,43 @@ +--- systemd-210/src/core/manager.c 2014-05-05 11:46:17.700483956 +0200 ++++ systemd-210/src/core/manager.c 2014-05-05 13:29:13.296503646 +0200 +@@ -152,6 +152,29 @@ + } + } + ++static int check_for_password_prompt(void) { ++ DIR *d; ++ struct dirent *de; ++ ++ if (!(d = opendir("/run/systemd/ask-password"))) { ++ log_error("opendir(): %m"); ++ ++ if (errno == ENOENT) ++ return 1; ++ ++ return -errno; ++ } ++ ++ while ((de = readdir(d))) { ++ if (startswith(de->d_name, "ask.")) { ++ closedir(d); ++ return 0; ++ } ++ } ++ closedir(d); ++ return 1; ++} ++ + static void manager_print_jobs_in_progress(Manager *m) { + static int is_ansi_console = -1; + _cleanup_free_ char *job_of_n = NULL; +@@ -195,6 +217,10 @@ + + m->jobs_in_progress_iteration++; + ++ //don't overwrite the crypt password prompt with job status messages ++ if (check_for_password_prompt() == 0); ++ return 0; ++ + if (m->n_running_jobs > 1) + if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0) + job_of_n = NULL; diff --git a/systemd-mini.changes b/systemd-mini.changes index 6df92168..8bd691bd 100644 --- a/systemd-mini.changes +++ b/systemd-mini.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Mon May 5 14:02:16 UTC 2014 - werner@suse.de + +- Port upstream patch + 0001-sd-rtnl-message-append-fix-uninitialized-memory.patch + back to 210 +- Add patch keep-crypt-password-prompt.patch from Thomas Blume + to fix bnc#875502 - fails to boot when swap space is encrypted +- Port upstream patch set for net_id back in patch + upstream-net_id-changes.patch + ------------------------------------------------------------------- Fri May 2 10:12:26 UTC 2014 - werner@suse.de diff --git a/systemd-mini.spec b/systemd-mini.spec index 1e2d56fe..b06165fd 100644 --- a/systemd-mini.spec +++ b/systemd-mini.spec @@ -399,6 +399,10 @@ Patch202: 0004-implement-a-union-to-pad-out-file_handle.patch Patch203: respect-nfs-bg-option.patch # PATCH-FIX-UPSTREAM Stop useless messages on dual_timestamp_is_set is failed. Patch204: shut-up-annoying-assertion-monotonic-clock-message.patch +# PATCH-FIX-SUSE Do not override the passphrase prompts due messages of busy jobs +Patch205: keep-crypt-password-prompt.patch +# PATCH-FIX-UPSTREAM Fix uninitialized memory +Patch206: 0001-sd-rtnl-message-append-fix-uninitialized-memory.patch # UDEV PATCHES # ============ @@ -432,6 +436,8 @@ Patch1011: 1011-64-btrfs.rules-skip-btrfs-check-if-devices-are-not-r.patch Patch1012: 1012-Skip-persistent-device-link-creation-on-multipath-de.patch # PATCH-FIX-SUSE Do not use runtime PM for some IBM consoles (bnc#868931) Patch1013: 1013-no-runtime-PM-for-IBM-consoles.patch +# PATCH-FIX-UPSTREAM Move forward to git Head for net_id +Patch1014: upstream-net_id-changes.patch %description Systemd is a system and service manager, compatible with SysV and LSB @@ -784,6 +790,8 @@ cp %{SOURCE7} m4/ %patch202 -p0 %patch203 -p1 %patch204 -p1 +%patch205 -p1 +%patch206 -p0 # udev patches %patch1001 -p1 @@ -800,6 +808,9 @@ cp %{SOURCE7} m4/ %patch1011 -p1 %patch1012 -p1 %patch1013 -p1 +%if 0%{?suse_version} > 1310 +%patch1014 -p0 +%endif # ensure generate files are removed rm -f units/emergency.service diff --git a/systemd.changes b/systemd.changes index 6df92168..8bd691bd 100644 --- a/systemd.changes +++ b/systemd.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Mon May 5 14:02:16 UTC 2014 - werner@suse.de + +- Port upstream patch + 0001-sd-rtnl-message-append-fix-uninitialized-memory.patch + back to 210 +- Add patch keep-crypt-password-prompt.patch from Thomas Blume + to fix bnc#875502 - fails to boot when swap space is encrypted +- Port upstream patch set for net_id back in patch + upstream-net_id-changes.patch + ------------------------------------------------------------------- Fri May 2 10:12:26 UTC 2014 - werner@suse.de diff --git a/systemd.spec b/systemd.spec index 9744e0e9..038af1d1 100644 --- a/systemd.spec +++ b/systemd.spec @@ -394,6 +394,10 @@ Patch202: 0004-implement-a-union-to-pad-out-file_handle.patch Patch203: respect-nfs-bg-option.patch # PATCH-FIX-UPSTREAM Stop useless messages on dual_timestamp_is_set is failed. Patch204: shut-up-annoying-assertion-monotonic-clock-message.patch +# PATCH-FIX-SUSE Do not override the passphrase prompts due messages of busy jobs +Patch205: keep-crypt-password-prompt.patch +# PATCH-FIX-UPSTREAM Fix uninitialized memory +Patch206: 0001-sd-rtnl-message-append-fix-uninitialized-memory.patch # UDEV PATCHES # ============ @@ -427,6 +431,8 @@ Patch1011: 1011-64-btrfs.rules-skip-btrfs-check-if-devices-are-not-r.patch Patch1012: 1012-Skip-persistent-device-link-creation-on-multipath-de.patch # PATCH-FIX-SUSE Do not use runtime PM for some IBM consoles (bnc#868931) Patch1013: 1013-no-runtime-PM-for-IBM-consoles.patch +# PATCH-FIX-UPSTREAM Move forward to git Head for net_id +Patch1014: upstream-net_id-changes.patch %description Systemd is a system and service manager, compatible with SysV and LSB @@ -779,6 +785,8 @@ cp %{SOURCE7} m4/ %patch202 -p0 %patch203 -p1 %patch204 -p1 +%patch205 -p1 +%patch206 -p0 # udev patches %patch1001 -p1 @@ -795,6 +803,9 @@ cp %{SOURCE7} m4/ %patch1011 -p1 %patch1012 -p1 %patch1013 -p1 +%if 0%{?suse_version} > 1310 +%patch1014 -p0 +%endif # ensure generate files are removed rm -f units/emergency.service diff --git a/upstream-net_id-changes.patch b/upstream-net_id-changes.patch new file mode 100644 index 00000000..60bc83b7 --- /dev/null +++ b/upstream-net_id-changes.patch @@ -0,0 +1,135 @@ +This the diff between systemd-210 and 19aa72f74e41045510b4af3f1415b419d42ff20b +But we do not remove the ATA support as in HEAD + +--- + src/udev/udev-builtin-net_id.c | 54 ++++++---------------------------------- + src/udev/udev-builtin-path_id.c | 3 -- + 2 files changed, 9 insertions(+), 48 deletions(-) + +--- src/udev/udev-builtin-net_id.c ++++ src/udev/udev-builtin-net_id.c 2014-04-08 07:16:45.094235605 +0000 +@@ -33,6 +33,8 @@ + * ww -- wwan + * + * Type of names: ++ * b -- BCMA bus core number ++ * ccw -- CCW bus group name + * o -- on-board device index number + * s[f][d] -- hotplug slot index number + * x -- MAC address +@@ -92,6 +94,7 @@ + #include + #include + #include ++#include + #include + + #include "udev.h" +@@ -119,12 +122,8 @@ struct netnames { + const char *pci_onboard_label; + + char usb_ports[IFNAMSIZ]; +- + char bcma_core[IFNAMSIZ]; +- +- char virtio_core[IFNAMSIZ]; +- +- char ccw_core[IFNAMSIZ]; ++ char ccw_group[IFNAMSIZ]; + }; + + /* retrieve on-board index number and label from firmware */ +@@ -351,25 +350,6 @@ static int names_bcma(struct udev_device + return 0; + } + +-static int names_virtio(struct udev_device *dev, struct netnames *names) { +- struct udev_device *virtdev; +- unsigned int core; +- +- virtdev = udev_device_get_parent_with_subsystem_devtype(dev, "virtio", NULL); +- if (!virtdev) +- return -ENOENT; +- +- /* core num */ +- if (sscanf(udev_device_get_sysname(virtdev), "virtio%u", &core) != 1) +- return -EINVAL; +- /* suppress the common core == 0 */ +- if (core > 0) +- snprintf(names->virtio_core, sizeof(names->virtio_core), "v%u", core); +- +- names->type = NET_VIRTIO; +- return 0; +-} +- + static int names_ccw(struct udev_device *dev, struct netnames *names) { + struct udev_device *cdev; + const char *bus_id; +@@ -402,8 +382,8 @@ static int names_ccw(struct udev_device + return -EINVAL; + + /* Store the CCW bus-ID for use as network device name */ +- rc = snprintf(names->ccw_core, sizeof(names->ccw_core), "ccw%s", bus_id); +- if (rc >= 0 && rc < (int)sizeof(names->ccw_core)) ++ rc = snprintf(names->ccw_group, sizeof(names->ccw_group), "ccw%s", bus_id); ++ if (rc >= 0 && rc < (int)sizeof(names->ccw_group)) + names->type = NET_CCWGROUP; + return 0; + } +@@ -472,10 +452,10 @@ static int builtin_net_id(struct udev_de + return EXIT_FAILURE; + i = strtoul(s, NULL, 0); + switch (i) { +- case 1: /* ARPHRD_ETHER */ ++ case ARPHRD_ETHER: + prefix = "en"; + break; +- case 256: /* ARPHRD_SLIP */ ++ case ARPHRD_SLIP: + prefix = "sl"; + break; + default: +@@ -517,7 +497,7 @@ static int builtin_net_id(struct udev_de + if (err >= 0 && names.type == NET_CCWGROUP) { + char str[IFNAMSIZ]; + +- if (snprintf(str, sizeof(str), "%s%s", prefix, names.ccw_core) < (int)sizeof(str)) ++ if (snprintf(str, sizeof(str), "%s%s", prefix, names.ccw_group) < (int)sizeof(str)) + udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str); + goto out; + } +@@ -578,22 +558,6 @@ static int builtin_net_id(struct udev_de + udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str); + goto out; + } +- +- /* virtio bus */ +- err = names_virtio(dev, &names); +- if (err >= 0 && names.type == NET_VIRTIO) { +- char str[IFNAMSIZ]; +- +- if (names.pci_path[0]) +- if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_path, names.virtio_core) < (int)sizeof(str)) +- udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str); +- +- if (names.pci_slot[0]) +- if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_slot, names.virtio_core) < (int)sizeof(str)) +- udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str); +- goto out; +- } +- + out: + return EXIT_SUCCESS; + } +--- src/udev/udev-builtin-path_id.c ++++ src/udev/udev-builtin-path_id.c 2014-03-28 09:27:20.402735390 +0000 +@@ -571,9 +571,6 @@ static int builtin_path_id(struct udev_d + } else if (streq(subsys, "xen")) { + path_prepend(&path, "xen-%s", udev_device_get_sysname(parent)); + parent = skip_subsystem(parent, "xen"); +- } else if (streq(subsys, "virtio")) { +- path_prepend(&path, "virtio-pci-%s", udev_device_get_sysname(parent)); +- parent = skip_subsystem(parent, "virtio"); + } else if (streq(subsys, "scm")) { + path_prepend(&path, "scm-%s", udev_device_get_sysname(parent)); + parent = skip_subsystem(parent, "scm");