--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: bookworm
User: release.debian....@packages.debian.org
Usertags: pu
X-Debbugs-Cc: pkg-systemd-maintain...@lists.alioth.debian.org
Dear Release Team,
We would like to upload the latest stable point release of systemd 252
to bookworm-p-u. Stable release branches are maintained upstream with
the intention of providing bug fixes only and no compatibility
breakages, and with automated non-trivial CI jobs that also cover
Debian and Ubuntu. I have already uploaded to p-u.
Debdiff attached. The only packaging change is to drop a patch merged
upstream and refresh another to remove fuzz.
diff -Nru systemd-252.30/debian/changelog systemd-252.31/debian/changelog
--- systemd-252.30/debian/changelog 2024-08-25 18:35:39.000000000 +0100
+++ systemd-252.31/debian/changelog 2024-10-10 18:40:53.000000000 +0100
@@ -1,3 +1,11 @@
+systemd (252.31-1~deb12u1) bookworm; urgency=medium
+
+ * New upstream version 252.31
+ * Drop journald.conf patch merged upstream
+ * Refresh patches to remove fuzz from update
+
+ -- Luca Boccassi <bl...@debian.org> Thu, 10 Oct 2024 18:40:53 +0100
+
systemd (252.30-1~deb12u2) bookworm; urgency=medium
* Backport patch to revert new comment in /etc/systemd/journald.conf.
diff -Nru systemd-252.30/debian/patches/debian/Re-enable-journal-forwarding-to-syslog.patch systemd-252.31/debian/patches/debian/Re-enable-journal-forwarding-to-syslog.patch
--- systemd-252.30/debian/patches/debian/Re-enable-journal-forwarding-to-syslog.patch 2024-08-25 18:33:30.000000000 +0100
+++ systemd-252.31/debian/patches/debian/Re-enable-journal-forwarding-to-syslog.patch 2024-10-10 18:40:53.000000000 +0100
@@ -16,8 +16,6 @@
src/journal/journald.conf | 2 +-
3 files changed, 3 insertions(+), 2 deletions(-)
-diff --git a/man/journald.conf.xml b/man/journald.conf.xml
-index 2db6a0f..160544a 100644
--- a/man/journald.conf.xml
+++ b/man/journald.conf.xml
@@ -356,7 +356,7 @@
@@ -29,11 +27,9 @@
command line options <literal>systemd.journald.forward_to_syslog</literal>,
<literal>systemd.journald.forward_to_kmsg</literal>,
<literal>systemd.journald.forward_to_console</literal>, and
-diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
-index 31358cd..863575c 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
-@@ -2289,6 +2289,7 @@ int server_init(Server *s, const char *namespace) {
+@@ -2289,6 +2289,7 @@
.ratelimit_interval = DEFAULT_RATE_LIMIT_INTERVAL,
.ratelimit_burst = DEFAULT_RATE_LIMIT_BURST,
@@ -41,13 +37,11 @@
.forward_to_wall = true,
.max_file_usec = DEFAULT_MAX_FILE_USEC,
-diff --git a/src/journal/journald.conf b/src/journal/journald.conf
-index 5a60a9d..64f4d4b 100644
--- a/src/journal/journald.conf
+++ b/src/journal/journald.conf
@@ -32,7 +32,7 @@
#RuntimeMaxFiles=100
- #MaxRetentionSec=0
+ #MaxRetentionSec=
#MaxFileSec=1month
-#ForwardToSyslog=no
+#ForwardToSyslog=yes
diff -Nru systemd-252.30/debian/patches/Revert-journal-comment-the-default-value-in-journald.conf.patch systemd-252.31/debian/patches/Revert-journal-comment-the-default-value-in-journald.conf.patch
--- systemd-252.30/debian/patches/Revert-journal-comment-the-default-value-in-journald.conf.patch 2024-08-25 18:34:31.000000000 +0100
+++ systemd-252.31/debian/patches/Revert-journal-comment-the-default-value-in-journald.conf.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,17 +0,0 @@
-Author: Luca Boccassi <bl...@debian.org>
-Bug-Debian: http://bugs.debian.org/1079086
-Description: Revert "journal: comment the default value in journald.conf"
- Because of how dpkg handles config files, this will cause a prompt to
- users on upgrade, which is undesirable for stable updates, so revert it
- in v252-stable.
---- a/src/journal/journald.conf
-+++ b/src/journal/journald.conf
-@@ -30,7 +30,7 @@
- #RuntimeKeepFree=
- #RuntimeMaxFileSize=
- #RuntimeMaxFiles=100
--#MaxRetentionSec=0
-+#MaxRetentionSec=
- #MaxFileSec=1month
- #ForwardToSyslog=yes
- #ForwardToKMsg=no
diff -Nru systemd-252.30/debian/patches/series systemd-252.31/debian/patches/series
--- systemd-252.30/debian/patches/series 2024-08-25 18:32:58.000000000 +0100
+++ systemd-252.31/debian/patches/series 2024-10-10 18:39:48.000000000 +0100
@@ -18,4 +18,3 @@
debian/systemctl-do-not-shutdown-immediately-on-scheduled-shutdo.patch
debian/Downgrade-a-couple-of-warnings-to-debug.patch
debian/Skip-flaky-test_resolved_domain_restricted_dns-in-network.patch
-Revert-journal-comment-the-default-value-in-journald.conf.patch
diff -Nru systemd-252.30/hwdb.d/60-evdev.hwdb systemd-252.31/hwdb.d/60-evdev.hwdb
--- systemd-252.30/hwdb.d/60-evdev.hwdb 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/hwdb.d/60-evdev.hwdb 2024-10-10 18:34:03.000000000 +0100
@@ -255,6 +255,13 @@
# Dell
#########################################
+# Dell AlpsPS/2 ALPS DualPoint TouchPad
+evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:*:svnDellInc.*:pnLatitudeE7440*:
+ EVDEV_ABS_00=:::28
+ EVDEV_ABS_01=:::28
+ EVDEV_ABS_35=:::28
+ EVDEV_ABS_36=:::28
+
# Dell Vostro 1510
evdev:name:AlpsPS/2 ALPS GlidePoint*:dmi:bvn*:bvr*:bd*:svnDellInc.:pnVostro1510:*
EVDEV_ABS_00=::14
diff -Nru systemd-252.30/hwdb.d/60-keyboard.hwdb systemd-252.31/hwdb.d/60-keyboard.hwdb
--- systemd-252.30/hwdb.d/60-keyboard.hwdb 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/hwdb.d/60-keyboard.hwdb 2024-10-10 18:34:03.000000000 +0100
@@ -223,7 +223,7 @@
# Swift SF314-511
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnSwiftSF314-511:pvr*
- KEYBOARD_KEY_8a=f20 # Fn+F12, microphone mute
+ KEYBOARD_KEY_8a=f20 # Fn+F12, microphone mute
# Predator PHN16-71
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnPredatorPHN16-71:*
@@ -231,6 +231,10 @@
KEYBOARD_KEY_f5=prog1 # "predator sense" button
KEYBOARD_KEY_66=micmute # Microphone mute button
+# Predator PHN16-72
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnPredatorPHN16-72:*
+ KEYBOARD_KEY_66=micmute # Microphone mute button
+
# Nitro AN515-58
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnNitro*AN*515-58:pvr*
KEYBOARD_KEY_8a=f20 # Microphone mute button
@@ -259,7 +263,7 @@
# Aquarius Cmp NS483
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAquarius*:pnCmp*NS483*:*
KEYBOARD_KEY_56=backslash
- KEYBOARD_KEY_76=f21 # Touchpad Toggle
+ KEYBOARD_KEY_76=f21 # Touchpad Toggle
###########################################################
# Asus
@@ -341,6 +345,9 @@
KEYBOARD_KEY_f7=f21 # Touchpad Toggle
KEYBOARD_KEY_f8=f21 # Touchpad Toggle
+evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnV5xTNC_TND_TNE:*
+ KEYBOARD_KEY_81=f20 # Fn+4; Mic Mute
+
###########################################################
# Compal
###########################################################
@@ -973,7 +980,7 @@
# LE14U/LE15U
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnKVADRA*:pn*LE1*U*:*
- KEYBOARD_KEY_76=f21 # Fn+F1 Toggle touchpad, sends meta+ctrl+toggle
+ KEYBOARD_KEY_76=f21 # Fn+F1 Toggle touchpad, sends meta+ctrl+toggle
###########################################################
# Lenovo
@@ -1901,9 +1908,9 @@
# Galaxy Book (2021) NP750XDA-KD4SE
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn750XDA:pvr*
KEYBOARD_KEY_81=!esc
- KEYBOARD_KEY_ce=!prog1 # Fn+F1 launch settings
- KEYBOARD_KEY_ae=!volumedown # Fn+F7 volume down
- KEYBOARD_KEY_b0=!volumeup # Fn+F8 volume up
+ KEYBOARD_KEY_ce=!prog1 # Fn+F1 launch settings
+ KEYBOARD_KEY_ae=!volumedown # Fn+F7 volume down
+ KEYBOARD_KEY_b0=!volumeup # Fn+F8 volume up
###########################################################
@@ -2028,13 +2035,13 @@
# Portege Z830 ACPI quickstart buttons
evdev:name:Quickstart Button 1:dmi:bvn*:bvr*:bd*:svnTOSHIBA*:pnPORTEGEZ830:*
- KEYBOARD_KEY_1=prog1 # TOSHIBA eco button
+ KEYBOARD_KEY_1=prog1 # TOSHIBA eco button
evdev:name:Quickstart Button 2:dmi:bvn*:bvr*:bd*:svnTOSHIBA*:pnPORTEGEZ830:*
- KEYBOARD_KEY_1=prog2 # TOSHIBA Presentation button
+ KEYBOARD_KEY_1=prog2 # TOSHIBA Presentation button
evdev:name:Quickstart Button 3:dmi:bvn*:bvr*:bd*:svnTOSHIBA*:pnPORTEGEZ830:*
- KEYBOARD_KEY_1=f21 # Touchpad toggle
+ KEYBOARD_KEY_1=f21 # Touchpad toggle
###########################################################
# VIA
@@ -2067,11 +2074,11 @@
# Home: LeftCtrl + Esc -> LeftMeta (ignore LeftCtrl, map Esc to LeftMeta)
# Back: Backspace -> back (map backspace to back)
evdev:name:FTSC1000:00 2808:509C Keyboard:dmi:*:svnXiaomiInc:pnMipad2:*
- KEYBOARD_KEY_700e0=unknown # LeftCtrl -> ignore
- KEYBOARD_KEY_700e3=unknown # LeftMeta -> ignore
- KEYBOARD_KEY_70016=menu # S -> menu
- KEYBOARD_KEY_70029=leftmeta # Esc -> LeftMeta (Windows key / Win8 tablets home)
- KEYBOARD_KEY_7002a=back # Backspace -> back
+ KEYBOARD_KEY_700e0=unknown # LeftCtrl -> ignore
+ KEYBOARD_KEY_700e3=unknown # LeftMeta -> ignore
+ KEYBOARD_KEY_70016=menu # S -> menu
+ KEYBOARD_KEY_70029=leftmeta # Esc -> LeftMeta (Windows key / Win8 tablets home)
+ KEYBOARD_KEY_7002a=back # Backspace -> back
###########################################################
# Zepto
@@ -2183,7 +2190,7 @@
evdev:name:AT Translated Set 2 keyboard:dmi:bvn*:bvr*:bd*:svnPositivoBahia-VAIO:pnVJPW1[12]F11X*:pvr*:*
# Vaio FE14 (VJFE41F11X, VJE42F11X, VJFE44F11X, VJFE54F11X)
evdev:name:AT Translated Set 2 keyboard:dmi:bvn*:bvr*:bd*:svnPositivoBahia-VAIO:pnVJFE*:pvr*:*
- KEYBOARD_KEY_76=f21 # Fn+F1 toggle touchpad
+ KEYBOARD_KEY_76=f21 # Fn+F1 toggle touchpad
###########################################################
# Positivo
@@ -2288,6 +2295,18 @@
#
# Presence of a LED is implicit when the property is absent.
+# Apple Wireless keyboards
+evdev:input:b0005v05aCp022C*
+evdev:input:b0005v05aCp022D*
+evdev:input:b0005v05aCp022E*
+evdev:input:b0005v05aCp0239*
+evdev:input:b0005v05aCp023A*
+evdev:input:b0005v05aCp023B*
+evdev:input:b0005v05aCp0255*
+evdev:input:b0005v05aCp0256*
+evdev:input:b0005v05aCp0257*
+ KEYBOARD_LED_NUMLOCK=0
+
# Logitech K750
evdev:input:b0003v046Dp4002*
KEYBOARD_LED_NUMLOCK=0
diff -Nru systemd-252.30/hwdb.d/60-sensor.hwdb systemd-252.31/hwdb.d/60-sensor.hwdb
--- systemd-252.30/hwdb.d/60-sensor.hwdb 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/hwdb.d/60-sensor.hwdb 2024-10-10 18:34:03.000000000 +0100
@@ -152,6 +152,7 @@
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pnT100TA:*
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pnT100TAF:*
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pnT100TAM:*
+sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pnT100TAS:*
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:pnT200TA:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
@@ -163,6 +164,7 @@
sensor:modalias:acpi:INVN6500*:dmi:*svn*ASUSTeK*:*pn*TP300LD:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
+sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pn*Q551LB:*
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pn*Q551LN:*
ACCEL_MOUNT_MATRIX=0, 1, 0; -1, 0, 0; 0, 0, 1
diff -Nru systemd-252.30/man/org.freedesktop.systemd1.xml systemd-252.31/man/org.freedesktop.systemd1.xml
--- systemd-252.30/man/org.freedesktop.systemd1.xml 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/man/org.freedesktop.systemd1.xml 2024-10-10 18:34:03.000000000 +0100
@@ -2344,18 +2344,9 @@
was already active).</para>
<para><varname>ActiveState</varname> contains a state value that reflects whether the unit is currently
- active or not. The following states are currently defined: <literal>active</literal>,
- <literal>reloading</literal>, <literal>inactive</literal>, <literal>failed</literal>,
- <literal>activating</literal>, and <literal>deactivating</literal>. <literal>active</literal> indicates
- that unit is active (obviously...). <literal>reloading</literal> indicates that the unit is active and
- currently reloading its configuration. <literal>inactive</literal> indicates that it is inactive and
- the previous run was successful or no previous run has taken place yet. <literal>failed</literal>
- indicates that it is inactive and the previous run was not successful (more information about the
- reason for this is available on the unit type specific interfaces, for example for services in the
- <varname>Result</varname> property, see below). <literal>activating</literal> indicates that the unit
- has previously been inactive but is currently in the process of entering an active state. Conversely
- <literal>deactivating</literal> indicates that the unit is currently in the process of
- deactivation.</para>
+ active or not. The following states are currently defined:</para>
+
+ <xi:include href="unit-states.xml" xpointer="table"/>
<para><varname>SubState</varname> encodes states of the same state machine that
<varname>ActiveState</varname> covers, but knows more fine-grained states that are
diff -Nru systemd-252.30/man/sd_bus_message_append_array.xml systemd-252.31/man/sd_bus_message_append_array.xml
--- systemd-252.30/man/sd_bus_message_append_array.xml 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/man/sd_bus_message_append_array.xml 2024-10-10 18:34:03.000000000 +0100
@@ -34,7 +34,7 @@
<funcdef>int sd_bus_message_append_array</funcdef>
<paramdef>sd_bus_message *<parameter>m</parameter></paramdef>
<paramdef>char <parameter>type</parameter></paramdef>
- <paramdef>void *<parameter>ptr</parameter></paramdef>
+ <paramdef>const void *<parameter>ptr</parameter></paramdef>
<paramdef>size_t <parameter>size</parameter></paramdef>
</funcprototype>
diff -Nru systemd-252.30/man/systemctl.xml systemd-252.31/man/systemctl.xml
--- systemd-252.30/man/systemctl.xml 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/man/systemctl.xml 2024-10-10 18:34:03.000000000 +0100
@@ -96,12 +96,15 @@
<para>The LOAD column shows the load state, one of <constant>loaded</constant>,
<constant>not-found</constant>, <constant>bad-setting</constant>, <constant>error</constant>,
- <constant>masked</constant>. The ACTIVE columns shows the general unit state, one of
- <constant>active</constant>, <constant>reloading</constant>, <constant>inactive</constant>,
- <constant>failed</constant>, <constant>activating</constant>, <constant>deactivating</constant>. The SUB
- column shows the unit-type-specific detailed state of the unit, possible values vary by unit type. The list
- of possible LOAD, ACTIVE, and SUB states is not constant and new systemd releases may both add and remove
- values. <programlisting>systemctl --state=help</programlisting> command maybe be used to display the
+ <constant>masked</constant>. The ACTIVE columns shows the general unit state, one of the
+ following:</para>
+
+ <xi:include href="unit-states.xml" xpointer="table"/>
+
+ <para>The SUB column shows the unit-type-specific detailed state of the unit, possible values
+ vary by unit type. The list of possible LOAD, ACTIVE, and SUB states is not constant and new
+ systemd releases may both add and remove values.
+ <programlisting>systemctl --state=help</programlisting> command may be used to display the
current set of possible values.</para>
<para>This is the default command.</para>
diff -Nru systemd-252.30/man/systemd.special.xml systemd-252.31/man/systemd.special.xml
--- systemd-252.30/man/systemd.special.xml 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/man/systemd.special.xml 2024-10-10 18:34:03.000000000 +0100
@@ -229,6 +229,11 @@
names like <varname>single</varname>, <varname>rescue</varname>, <varname>1</varname>,
<varname>3</varname>, <varname>5</varname>, …; see
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>.</para>
+
+ <para>For typical unit files please set <literal>WantedBy=</literal> to a regular target (like
+ <filename>multi-user.target</filename> or <filename>graphical.target</filename>),
+ instead of <filename>default.target</filename>, since such a service will also be run on special
+ boots like on system update, emergency boot…</para>
</listitem>
</varlistentry>
<varlistentry>
diff -Nru systemd-252.30/man/systemd.xml systemd-252.31/man/systemd.xml
--- systemd-252.30/man/systemd.xml 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/man/systemd.xml 2024-10-10 18:34:03.000000000 +0100
@@ -74,21 +74,12 @@
configuration files, whose syntax and basic set of options is
described in
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- however some are created automatically from other configuration
- files, dynamically from system state or programmatically at runtime.
- Units may be "active" (meaning started, bound, plugged in, …,
- depending on the unit type, see below), or "inactive" (meaning
- stopped, unbound, unplugged, …), as well as in the process of
- being activated or deactivated, i.e. between the two states (these
- states are called "activating", "deactivating"). A special
- "failed" state is available as well, which is very similar to
- "inactive" and is entered when the service failed in some way
- (process returned error code on exit, or crashed, an operation
- timed out, or after too many restarts). If this state is entered,
- the cause will be logged, for later reference. Note that the
- various unit types may have a number of additional substates,
- which are mapped to the five generalized unit states described
- here.</para>
+ however some are created automatically from other configuration files, dynamically from system state or
+ programmatically at runtime. Units may be in a number of states, described in the following table. Note
+ that the various unit types may have a number of additional substates, which are mapped to the
+ generalized unit states described here.</para>
+
+ <xi:include href="unit-states.xml" xpointer="table"/>
<para>The following unit types are available:</para>
diff -Nru systemd-252.30/man/unit-states.xml systemd-252.31/man/unit-states.xml
--- systemd-252.30/man/unit-states.xml 1970-01-01 01:00:00.000000000 +0100
+++ systemd-252.31/man/unit-states.xml 2024-10-10 18:34:03.000000000 +0100
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!DOCTYPE refsect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
+<!--
+ SPDX-License-Identifier: LGPL-2.1-or-later
+-->
+
+<refsect1>
+ <title/>
+
+ <table id="table">
+ <title>Unit ACTIVE states</title>
+ <tgroup cols='2'>
+ <colspec colname='state'/>
+ <colspec colname='description'/>
+ <thead>
+ <row>
+ <entry>State</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><varname>active</varname></entry>
+ <entry>Started, bound, plugged in, …, depending on the unit type.</entry>
+ </row>
+ <row>
+ <entry><varname>inactive</varname></entry>
+ <entry>Stopped, unbound, unplugged, …, depending on the unit type.</entry>
+ </row>
+ <row>
+ <entry><varname>failed</varname></entry>
+ <entry>Similar to <constant>inactive</constant>, but the unit failed in some way (process returned error code on exit, crashed, an operation timed out, or after too many restarts).
+ </entry>
+ </row>
+ <row>
+ <entry><varname>activating</varname></entry>
+ <entry>Changing from <constant>inactive</constant> to <constant>active</constant>.</entry>
+ </row>
+ <row>
+ <entry><varname>deactivating</varname></entry>
+ <entry>Changing from <constant>active</constant> to <constant>inactive</constant>.</entry>
+ </row>
+ <row>
+ <entry><varname>maintenance</varname></entry>
+ <entry>Unit is <constant>inactive</constant> and a maintenance operation is in progress.</entry>
+ </row>
+ <row>
+ <entry><varname>reloading</varname></entry>
+ <entry>Unit is <constant>active</constant> and it is reloading its configuration.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+</refsect1>
diff -Nru systemd-252.30/.semaphore/semaphore-runner.sh systemd-252.31/.semaphore/semaphore-runner.sh
--- systemd-252.30/.semaphore/semaphore-runner.sh 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/.semaphore/semaphore-runner.sh 2024-10-10 18:34:03.000000000 +0100
@@ -11,7 +11,8 @@
BRANCH="${BRANCH:-upstream-ci}"
ARCH="${ARCH:-amd64}"
CONTAINER="${RELEASE}-${ARCH}"
-CACHE_DIR="${SEMAPHORE_CACHE_DIR:-/tmp}"
+CACHE_DIR=/var/tmp
+TMPDIR=/var/tmp
AUTOPKGTEST_DIR="${CACHE_DIR}/autopkgtest"
# semaphore cannot expose these, but useful for interactive/local runs
ARTIFACTS_DIR=/tmp/artifacts
@@ -64,7 +65,7 @@
sudo apt-get install -y -t "$UBUNTU_RELEASE-backports" lxc
sudo apt-get install -y python3-debian git dpkg-dev fakeroot python3-jinja2
- [ -d "$AUTOPKGTEST_DIR" ] || git clone --quiet --branch=debian/5.32 --depth=1 https://salsa.debian.org/ci-team/autopkgtest.git "$AUTOPKGTEST_DIR"
+ [ -d "$AUTOPKGTEST_DIR" ] || git clone --quiet --depth=1 https://salsa.debian.org/ci-team/autopkgtest.git "$AUTOPKGTEST_DIR"
create_container
;;
@@ -91,7 +92,7 @@
# disable autopkgtests which are not for upstream
sed -i '/# NOUPSTREAM/ q' debian/tests/control
# enable more unit tests
- sed -i '/^CONFFLAGS =/ s/=/= --werror -Dtests=unsafe -Dsplit-usr=true -Dslow-tests=true -Dfuzz-tests=true -Dman=true /' debian/rules
+ sed -i '/^CONFFLAGS =/ s/=/= --werror -Dsplit-usr=true /' debian/rules
# no orig tarball
echo '1.0' > debian/source/format
@@ -101,8 +102,11 @@
# now build the package and run the tests
rm -rf "$ARTIFACTS_DIR"
# autopkgtest exits with 2 for "some tests skipped", accept that
- sudo "$AUTOPKGTEST_DIR/runner/autopkgtest" --env DEB_BUILD_OPTIONS=noudeb \
- --env TEST_UPSTREAM=1 ../systemd_*.dsc \
+ sudo TMPDIR=/var/tmp "$AUTOPKGTEST_DIR/runner/autopkgtest" --env DEB_BUILD_OPTIONS="noudeb nostrip nodoc optimize=-lto" \
+ --env DPKG_DEB_COMPRESSOR_TYPE="none" \
+ --env DEB_BUILD_PROFILES="noudeb nodoc" \
+ --env TEST_UPSTREAM=1 \
+ ../systemd_*.dsc \
-o "$ARTIFACTS_DIR" \
-- lxc -s "$CONTAINER" \
|| [ $? -eq 2 ]
diff -Nru systemd-252.30/src/basic/audit-util.c systemd-252.31/src/basic/audit-util.c
--- systemd-252.30/src/basic/audit-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/basic/audit-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -101,7 +101,7 @@
n = recvmsg_safe(fd, &mh, 0);
if (n < 0)
- return -errno;
+ return n;
if (n != NLMSG_LENGTH(sizeof(struct nlmsgerr)))
return -EIO;
diff -Nru systemd-252.30/src/basic/missing_loop.h systemd-252.31/src/basic/missing_loop.h
--- systemd-252.30/src/basic/missing_loop.h 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/basic/missing_loop.h 2024-10-10 18:34:03.000000000 +0100
@@ -22,3 +22,7 @@
#ifndef LOOP_SET_STATUS_SETTABLE_FLAGS
#define LOOP_SET_STATUS_SETTABLE_FLAGS (LO_FLAGS_AUTOCLEAR | LO_FLAGS_PARTSCAN)
#endif
+
+#ifndef LOOP_SET_BLOCK_SIZE
+# define LOOP_SET_BLOCK_SIZE 0x4C09
+#endif
diff -Nru systemd-252.30/src/basic/os-util.c systemd-252.31/src/basic/os-util.c
--- systemd-252.30/src/basic/os-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/basic/os-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -44,8 +44,9 @@
/* Does the path exist at all? If not, generate an error immediately. This is useful so that a missing root dir
* always results in -ENOENT, and we can properly distinguish the case where the whole root doesn't exist from
* the case where just the os-release file is missing. */
- if (laccess(path, F_OK) < 0)
- return -errno;
+ r = laccess(path, F_OK);
+ if (r < 0)
+ return r;
/* We use /usr/lib/extension-release.d/extension-release[.NAME] as flag for something being a system extension,
* and {/etc|/usr/lib}/os-release as a flag for something being an OS (when not an extension). */
diff -Nru systemd-252.30/src/basic/path-lookup.c systemd-252.31/src/basic/path-lookup.c
--- systemd-252.30/src/basic/path-lookup.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/basic/path-lookup.c 2024-10-10 18:34:03.000000000 +0100
@@ -881,6 +881,7 @@
int find_portable_profile(const char *name, const char *unit, char **ret_path) {
const char *p, *dot;
+ int r;
assert(name);
assert(ret_path);
@@ -894,13 +895,13 @@
if (!joined)
return -ENOMEM;
- if (laccess(joined, F_OK) >= 0) {
+ r = laccess(joined, F_OK);
+ if (r >= 0) {
*ret_path = TAKE_PTR(joined);
return 0;
}
-
- if (errno != ENOENT)
- return -errno;
+ if (r != -ENOENT)
+ return r;
}
return -ENOENT;
diff -Nru systemd-252.30/src/basic/unit-def.c systemd-252.31/src/basic/unit-def.c
--- systemd-252.30/src/basic/unit-def.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/basic/unit-def.c 2024-10-10 18:34:03.000000000 +0100
@@ -96,6 +96,7 @@
DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState);
+/* Keep in sync with man/unit-states.xml */
static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
[UNIT_ACTIVE] = "active",
[UNIT_RELOADING] = "reloading",
diff -Nru systemd-252.30/src/boot/efi/boot.c systemd-252.31/src/boot/efi/boot.c
--- systemd-252.30/src/boot/efi/boot.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/boot/efi/boot.c 2024-10-10 18:34:03.000000000 +0100
@@ -1506,7 +1506,7 @@
if (streq8(key, "architecture")) {
/* do not add an entry for an EFI image of architecture not matching with that of the image */
- if (!streq8(value, EFI_MACHINE_TYPE_NAME)) {
+ if (!strcaseeq8(value, EFI_MACHINE_TYPE_NAME)) {
entry->type = LOADER_UNDEFINED;
break;
}
diff -Nru systemd-252.30/src/core/dbus-cgroup.c systemd-252.31/src/core/dbus-cgroup.c
--- systemd-252.30/src/core/dbus-cgroup.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/core/dbus-cgroup.c 2024-10-10 18:34:03.000000000 +0100
@@ -1259,7 +1259,7 @@
for (type = 0; type < _CGROUP_IO_LIMIT_TYPE_MAX; type++)
a->limits[type] = cgroup_io_limit_defaults[type];
- LIST_PREPEND(device_limits, c->io_device_limits, a);
+ LIST_APPEND(device_limits, c->io_device_limits, a);
}
a->limits[iol_type] = u64;
@@ -1338,7 +1338,7 @@
free(a);
return -ENOMEM;
}
- LIST_PREPEND(device_weights, c->io_device_weights, a);
+ LIST_APPEND(device_weights, c->io_device_weights, a);
}
a->weight = weight;
@@ -1411,7 +1411,7 @@
free(a);
return -ENOMEM;
}
- LIST_PREPEND(device_latencies, c->io_device_latencies, a);
+ LIST_APPEND(device_latencies, c->io_device_latencies, a);
}
a->target_usec = target;
@@ -1491,7 +1491,7 @@
return -ENOMEM;
}
- LIST_PREPEND(device_bandwidths, c->blockio_device_bandwidths, a);
+ LIST_APPEND(device_bandwidths, c->blockio_device_bandwidths, a);
}
if (read)
@@ -1585,7 +1585,7 @@
free(a);
return -ENOMEM;
}
- LIST_PREPEND(device_weights, c->blockio_device_weights, a);
+ LIST_APPEND(device_weights, c->blockio_device_weights, a);
}
a->weight = weight;
diff -Nru systemd-252.30/src/core/load-fragment.c systemd-252.31/src/core/load-fragment.c
--- systemd-252.30/src/core/load-fragment.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/core/load-fragment.c 2024-10-10 18:34:03.000000000 +0100
@@ -4237,7 +4237,7 @@
w->path = TAKE_PTR(resolved);
w->weight = u;
- LIST_PREPEND(device_weights, c->io_device_weights, w);
+ LIST_APPEND(device_weights, c->io_device_weights, w);
return 0;
}
@@ -4308,7 +4308,7 @@
l->path = TAKE_PTR(resolved);
l->target_usec = usec;
- LIST_PREPEND(device_latencies, c->io_device_latencies, l);
+ LIST_APPEND(device_latencies, c->io_device_latencies, l);
return 0;
}
@@ -4396,7 +4396,7 @@
for (ttype = 0; ttype < _CGROUP_IO_LIMIT_TYPE_MAX; ttype++)
l->limits[ttype] = cgroup_io_limit_defaults[ttype];
- LIST_PREPEND(device_limits, c->io_device_limits, l);
+ LIST_APPEND(device_limits, c->io_device_limits, l);
}
l->limits[type] = num;
@@ -4477,7 +4477,7 @@
w->path = TAKE_PTR(resolved);
w->weight = u;
- LIST_PREPEND(device_weights, c->blockio_device_weights, w);
+ LIST_APPEND(device_weights, c->blockio_device_weights, w);
return 0;
}
@@ -4564,7 +4564,7 @@
b->rbps = CGROUP_LIMIT_MAX;
b->wbps = CGROUP_LIMIT_MAX;
- LIST_PREPEND(device_bandwidths, c->blockio_device_bandwidths, b);
+ LIST_APPEND(device_bandwidths, c->blockio_device_bandwidths, b);
}
if (read)
diff -Nru systemd-252.30/src/home/homework-luks.c systemd-252.31/src/home/homework-luks.c
--- systemd-252.30/src/home/homework-luks.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/home/homework-luks.c 2024-10-10 18:34:03.000000000 +0100
@@ -1986,11 +1986,11 @@
_cleanup_free_ char *dn = NULL;
usec_t w;
- if (laccess(path, F_OK) < 0) {
- if (errno != ENOENT)
- return log_error_errno(errno, "Failed to determine whether %s exists: %m", path);
- } else
+ r = laccess(path, F_OK);
+ if (r >= 0)
return 0; /* Found it */
+ if (r != -ENOENT)
+ return log_error_errno(r, "Failed to determine whether %s exists: %m", path);
if (inotify_fd < 0) {
/* We need to wait for the device symlink to show up, let's create an inotify watch for it */
diff -Nru systemd-252.30/src/journal/journald.conf systemd-252.31/src/journal/journald.conf
--- systemd-252.30/src/journal/journald.conf 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/journal/journald.conf 2024-10-10 18:34:03.000000000 +0100
@@ -30,7 +30,7 @@
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
-#MaxRetentionSec=0
+#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
diff -Nru systemd-252.30/src/libsystemd/sd-daemon/sd-daemon.c systemd-252.31/src/libsystemd/sd-daemon/sd-daemon.c
--- systemd-252.30/src/libsystemd/sd-daemon/sd-daemon.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/libsystemd/sd-daemon/sd-daemon.c 2024-10-10 18:34:03.000000000 +0100
@@ -616,17 +616,18 @@
}
_public_ int sd_booted(void) {
- /* We test whether the runtime unit file directory has been
- * created. This takes place in mount-setup.c, so is
- * guaranteed to happen very early during boot. */
+ int r;
- if (laccess("/run/systemd/system/", F_OK) >= 0)
- return true;
+ /* We test whether the runtime unit file directory has been created. This takes place in mount-setup.c,
+ * so is guaranteed to happen very early during boot. */
- if (errno == ENOENT)
+ r = laccess("/run/systemd/system/", F_OK);
+ if (r >= 0)
+ return true;
+ if (r == -ENOENT)
return false;
- return -errno;
+ return r;
}
_public_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) {
diff -Nru systemd-252.30/src/libsystemd/sd-netlink/test-netlink.c systemd-252.31/src/libsystemd/sd-netlink/test-netlink.c
--- systemd-252.30/src/libsystemd/sd-netlink/test-netlink.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/libsystemd/sd-netlink/test-netlink.c 2024-10-10 18:34:03.000000000 +0100
@@ -95,18 +95,24 @@
struct in_addr in_data;
struct ifa_cacheinfo cache;
const char *label;
+ int ret;
log_debug("/* %s */", __func__);
assert_se(sd_rtnl_message_new_addr(rtnl, &m, RTM_GETADDR, ifindex, AF_INET) >= 0);
assert_se(m);
assert_se(sd_netlink_message_set_request_dump(m, true) >= 0);
- assert_se(sd_netlink_call(rtnl, m, -1, &r) == 1);
- assert_se(sd_netlink_message_read_in_addr(r, IFA_LOCAL, &in_data) == 0);
- assert_se(sd_netlink_message_read_in_addr(r, IFA_ADDRESS, &in_data) == 0);
- assert_se(sd_netlink_message_read_string(r, IFA_LABEL, &label) == 0);
- assert_se(sd_netlink_message_read_cache_info(r, IFA_CACHEINFO, &cache) == 0);
+ ret = sd_netlink_call(rtnl, m, -1, &r);
+ assert_se(ret >= 0);
+
+ /* If the loopback device is down we won't get any results. */
+ if (ret > 0) {
+ assert_se(sd_netlink_message_read_in_addr(r, IFA_LOCAL, &in_data) == 0);
+ assert_se(sd_netlink_message_read_in_addr(r, IFA_ADDRESS, &in_data) == 0);
+ assert_se(sd_netlink_message_read_string(r, IFA_LABEL, &label) == 0);
+ assert_se(sd_netlink_message_read_cache_info(r, IFA_CACHEINFO, &cache) == 0);
+ }
}
static void test_route(sd_netlink *rtnl) {
diff -Nru systemd-252.30/src/libsystemd-network/sd-ipv4acd.c systemd-252.31/src/libsystemd-network/sd-ipv4acd.c
--- systemd-252.30/src/libsystemd-network/sd-ipv4acd.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/libsystemd-network/sd-ipv4acd.c 2024-10-10 18:34:03.000000000 +0100
@@ -396,6 +396,7 @@
}
break;
+ case IPV4ACD_STATE_STARTED:
case IPV4ACD_STATE_WAITING_PROBE:
case IPV4ACD_STATE_PROBING:
case IPV4ACD_STATE_WAITING_ANNOUNCE:
diff -Nru systemd-252.30/src/libsystemd-network/test-dhcp-server.c systemd-252.31/src/libsystemd-network/test-dhcp-server.c
--- systemd-252.30/src/libsystemd-network/test-dhcp-server.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/libsystemd-network/test-dhcp-server.c 2024-10-10 18:34:03.000000000 +0100
@@ -119,6 +119,7 @@
.s_addr = htobe32(INADDR_LOOPBACK + 42),
};
static uint8_t static_lease_client_id[7] = {0x01, 'A', 'B', 'C', 'D', 'E', 'G' };
+ int r;
log_debug("/* %s */", __func__);
@@ -129,7 +130,10 @@
assert_se(sd_dhcp_server_attach_event(server, NULL, 0) >= 0);
assert_se(sd_dhcp_server_start(server) >= 0);
- assert_se(dhcp_server_handle_message(server, (DHCPMessage*)&test, sizeof(test)) == DHCP_OFFER);
+ r = dhcp_server_handle_message(server, (DHCPMessage*)&test, sizeof(test));
+ if (r == -ENETDOWN)
+ return (void) log_tests_skipped("Network is not available");
+ assert_se(r == DHCP_OFFER);
test.end = 0;
/* TODO, shouldn't this fail? */
diff -Nru systemd-252.30/src/nspawn/nspawn.c systemd-252.31/src/nspawn/nspawn.c
--- systemd-252.30/src/nspawn/nspawn.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/nspawn/nspawn.c 2024-10-10 18:34:03.000000000 +0100
@@ -2264,7 +2264,7 @@
/* Explicitly warn the user when /dev is already populated. */
if (errno == EEXIST)
log_notice("%s/dev is pre-mounted and pre-populated. If a pre-mounted /dev is provided it needs to be an unpopulated file system.", dest);
- if (errno != EPERM)
+ if (errno != EPERM || arg_uid_shift != 0)
return log_error_errno(errno, "mknod(%s) failed: %m", to);
/* Some systems abusively restrict mknod but allow bind mounts. */
@@ -2274,12 +2274,12 @@
r = mount_nofollow_verbose(LOG_DEBUG, from, to, NULL, MS_BIND, NULL);
if (r < 0)
return log_error_errno(r, "Both mknod and bind mount (%s) failed: %m", to);
+ } else {
+ r = userns_lchown(to, 0, 0);
+ if (r < 0)
+ return log_error_errno(r, "chown() of device node %s failed: %m", to);
}
- r = userns_lchown(to, 0, 0);
- if (r < 0)
- return log_error_errno(r, "chown() of device node %s failed: %m", to);
-
dn = path_join("/dev", S_ISCHR(st.st_mode) ? "char" : "block");
if (!dn)
return log_oom();
diff -Nru systemd-252.30/src/partition/repart.c systemd-252.31/src/partition/repart.c
--- systemd-252.30/src/partition/repart.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/partition/repart.c 2024-10-10 18:34:03.000000000 +0100
@@ -3291,13 +3291,13 @@
sfd, ".",
pfd, fn,
UID_INVALID, GID_INVALID,
- COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT|COPY_HARDLINKS|COPY_ALL_XATTRS);
+ COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT|COPY_HARDLINKS|COPY_ALL_XATTRS|COPY_RESTORE_DIRECTORY_TIMESTAMPS);
} else
r = copy_tree_at(
sfd, ".",
tfd, ".",
UID_INVALID, GID_INVALID,
- COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT|COPY_HARDLINKS|COPY_ALL_XATTRS);
+ COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT|COPY_HARDLINKS|COPY_ALL_XATTRS|COPY_RESTORE_DIRECTORY_TIMESTAMPS);
if (r < 0)
return log_error_errno(r, "Failed to copy '%s' to '%s%s': %m", *source, strempty(arg_root), *target);
} else {
@@ -5862,6 +5862,10 @@
if (!context)
return log_oom();
+ r = context_read_seed(context, arg_root);
+ if (r < 0)
+ return r;
+
strv_uniq(arg_definitions);
r = context_read_definitions(context, arg_definitions, arg_root);
@@ -5926,10 +5930,6 @@
putchar('\n');
#endif
- r = context_read_seed(context, arg_root);
- if (r < 0)
- return r;
-
/* Open all files to copy blocks from now, since we want to take their size into consideration */
r = context_open_copy_block_paths(
context,
diff -Nru systemd-252.30/src/portable/portable.c systemd-252.31/src/portable/portable.c
--- systemd-252.30/src/portable/portable.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/portable/portable.c 2024-10-10 18:34:03.000000000 +0100
@@ -1083,8 +1083,12 @@
return -ENOMEM;
if (flags & PORTABLE_PREFER_COPY) {
+ CopyFlags copy_flags = COPY_REFLINK|COPY_FSYNC;
- r = copy_file_atomic(from, dropin, 0644, 0, 0, COPY_REFLINK|COPY_FSYNC);
+ if (flags & PORTABLE_FORCE_ATTACH)
+ copy_flags |= COPY_REPLACE;
+
+ r = copy_file_atomic(from, dropin, 0644, 0, 0, copy_flags);
if (r < 0)
return log_debug_errno(r, "Failed to copy %s %s %s: %m", from, special_glyph(SPECIAL_GLYPH_ARROW_RIGHT), dropin);
@@ -1092,8 +1096,12 @@
} else {
- if (symlink(from, dropin) < 0)
- return log_debug_errno(errno, "Failed to link %s %s %s: %m", from, special_glyph(SPECIAL_GLYPH_ARROW_RIGHT), dropin);
+ if (flags & PORTABLE_FORCE_ATTACH)
+ r = symlink_atomic(from, dropin);
+ else
+ r = RET_NERRNO(symlink(from, dropin));
+ if (r < 0)
+ return log_debug_errno(r, "Failed to link %s %s %s: %m", from, special_glyph(SPECIAL_GLYPH_ARROW_RIGHT), dropin);
(void) portable_changes_add(changes, n_changes, PORTABLE_SYMLINK, dropin, from);
}
@@ -1177,8 +1185,12 @@
if ((flags & PORTABLE_PREFER_SYMLINK) && m->source) {
- if (symlink(m->source, path) < 0)
- return log_debug_errno(errno, "Failed to symlink unit file '%s': %m", path);
+ if (flags & PORTABLE_FORCE_ATTACH)
+ r = symlink_atomic(m->source, path);
+ else
+ r = RET_NERRNO(symlink(m->source, path));
+ if (r < 0)
+ return log_debug_errno(r, "Failed to symlink unit file '%s': %m", path);
(void) portable_changes_add(changes, n_changes, PORTABLE_SYMLINK, path, m->source);
@@ -1200,6 +1212,9 @@
if (fchmod(fd, 0644) < 0)
return log_debug_errno(errno, "Failed to change unit file access mode for '%s': %m", path);
+ if (flags & PORTABLE_FORCE_ATTACH)
+ (void) unlink(path);
+
r = link_tmpfile(fd, tmp, path);
if (r < 0)
return log_debug_errno(r, "Failed to install unit file '%s': %m", path);
diff -Nru systemd-252.30/src/resolve/resolved-dns-packet.h systemd-252.31/src/resolve/resolved-dns-packet.h
--- systemd-252.30/src/resolve/resolved-dns-packet.h 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/resolve/resolved-dns-packet.h 2024-10-10 18:34:03.000000000 +0100
@@ -111,6 +111,7 @@
#define DNS_PACKET_AD(p) ((be16toh(DNS_PACKET_HEADER(p)->flags) >> 5) & 1)
#define DNS_PACKET_CD(p) ((be16toh(DNS_PACKET_HEADER(p)->flags) >> 4) & 1)
+#define DNS_PACKET_FLAG_AD (UINT16_C(1) << 5)
#define DNS_PACKET_FLAG_TC (UINT16_C(1) << 9)
static inline uint16_t DNS_PACKET_RCODE(DnsPacket *p) {
diff -Nru systemd-252.30/src/resolve/resolved-dns-stub.c systemd-252.31/src/resolve/resolved-dns-stub.c
--- systemd-252.30/src/resolve/resolved-dns-stub.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/resolve/resolved-dns-stub.c 2024-10-10 18:34:03.000000000 +0100
@@ -685,7 +685,8 @@
static int dns_stub_patch_bypass_reply_packet(
DnsPacket **ret, /* Where to place the patched packet */
DnsPacket *original, /* The packet to patch */
- DnsPacket *request) { /* The packet the patched packet shall look like a reply to */
+ DnsPacket *request, /* The packet the patched packet shall look like a reply to */
+ bool authenticated) {
_cleanup_(dns_packet_unrefp) DnsPacket *c = NULL;
int r;
@@ -725,6 +726,10 @@
DNS_PACKET_HEADER(c)->flags = htobe16(be16toh(DNS_PACKET_HEADER(c)->flags) | DNS_PACKET_FLAG_TC);
}
+ /* Ensure we don't pass along an untrusted ad flag for bypass packets */
+ if (!authenticated)
+ DNS_PACKET_HEADER(c)->flags = htobe16(be16toh(DNS_PACKET_HEADER(c)->flags) & ~DNS_PACKET_FLAG_AD);
+
*ret = TAKE_PTR(c);
return 0;
}
@@ -745,7 +750,8 @@
q->answer_full_packet->protocol == DNS_PROTOCOL_DNS) {
_cleanup_(dns_packet_unrefp) DnsPacket *reply = NULL;
- r = dns_stub_patch_bypass_reply_packet(&reply, q->answer_full_packet, q->request_packet);
+ r = dns_stub_patch_bypass_reply_packet(&reply, q->answer_full_packet, q->request_packet,
+ FLAGS_SET(q->answer_query_flags, SD_RESOLVED_AUTHENTICATED));
if (r < 0)
log_debug_errno(r, "Failed to patch bypass reply packet: %m");
else
diff -Nru systemd-252.30/src/shared/bpf-dlopen.c systemd-252.31/src/shared/bpf-dlopen.c
--- systemd-252.30/src/shared/bpf-dlopen.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/bpf-dlopen.c 2024-10-10 18:34:03.000000000 +0100
@@ -49,13 +49,13 @@
void *dl;
int r;
- dl = dlopen("libbpf.so.1", RTLD_LAZY);
+ dl = dlopen("libbpf.so.1", RTLD_NOW|RTLD_NODELETE);
if (!dl) {
/* libbpf < 1.0.0 (we rely on 0.1.0+) provide most symbols we care about, but
* unfortunately not all until 0.7.0. See bpf-compat.h for more details.
* Once we consider we can assume 0.7+ is present we can just use the same symbol
* list for both files, and when we assume 1.0+ is present we can remove this dlopen */
- dl = dlopen("libbpf.so.0", RTLD_LAZY);
+ dl = dlopen("libbpf.so.0", RTLD_NOW|RTLD_NODELETE);
if (!dl)
return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"neither libbpf.so.1 nor libbpf.so.0 are installed: %s", dlerror());
diff -Nru systemd-252.30/src/shared/condition.c systemd-252.31/src/shared/condition.c
--- systemd-252.30/src/shared/condition.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/condition.c 2024-10-10 18:34:03.000000000 +0100
@@ -172,10 +172,11 @@
if (!j)
return -ENOMEM;
- if (laccess(j, F_OK) >= 0)
+ r = laccess(j, F_OK);
+ if (r >= 0)
return true; /* yay! */
- if (errno != ENOENT)
- return -errno;
+ if (r != -ENOENT)
+ return r;
/* not found in this dir */
}
diff -Nru systemd-252.30/src/shared/copy.c systemd-252.31/src/shared/copy.c
--- systemd-252.30/src/shared/copy.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/copy.c 2024-10-10 18:34:03.000000000 +0100
@@ -908,6 +908,7 @@
_cleanup_close_ int fdf = -1, fdt = -1;
_cleanup_closedir_ DIR *d = NULL;
+ struct stat dt_st;
bool exists, created;
int r;
@@ -966,6 +967,9 @@
if (fdt < 0)
return -errno;
+ if (exists && FLAGS_SET(copy_flags, COPY_RESTORE_DIRECTORY_TIMESTAMPS) && fstat(fdt, &dt_st) < 0)
+ return -errno;
+
r = 0;
FOREACH_DIRENT_ALL(de, d, return -errno) {
@@ -1050,7 +1054,9 @@
(void) copy_xattr(dirfd(d), fdt, copy_flags);
(void) futimens(fdt, (struct timespec[]) { st->st_atim, st->st_mtim });
- }
+ } else if (FLAGS_SET(copy_flags, COPY_RESTORE_DIRECTORY_TIMESTAMPS))
+ /* If the directory already exists, make sure the timestamps stay the same as before. */
+ (void) futimens(fdt, (struct timespec[]) { dt_st.st_atim, dt_st.st_mtim });
if (copy_flags & COPY_FSYNC_FULL) {
if (fsync(fdt) < 0)
diff -Nru systemd-252.30/src/shared/copy.h systemd-252.31/src/shared/copy.h
--- systemd-252.30/src/shared/copy.h 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/copy.h 2024-10-10 18:34:03.000000000 +0100
@@ -25,6 +25,7 @@
COPY_SYNCFS = 1 << 12, /* syncfs() the *top-level* dir after we are done */
COPY_ALL_XATTRS = 1 << 13, /* Preserve all xattrs when copying, not just those in the user namespace */
COPY_HOLES = 1 << 14, /* Copy holes */
+ COPY_RESTORE_DIRECTORY_TIMESTAMPS = 1 << 15, /* Make sure existing directory timestamps don't change during copying. */
} CopyFlags;
typedef int (*copy_progress_bytes_t)(uint64_t n_bytes, void *userdata);
diff -Nru systemd-252.30/src/shared/dlfcn-util.c systemd-252.31/src/shared/dlfcn-util.c
--- systemd-252.30/src/shared/dlfcn-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/dlfcn-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -44,7 +44,7 @@
if (*dlp)
return 0; /* Already loaded */
- dl = dlopen(filename, RTLD_LAZY);
+ dl = dlopen(filename, RTLD_NOW|RTLD_NODELETE);
if (!dl)
return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"%s is not installed: %s", filename, dlerror());
diff -Nru systemd-252.30/src/shared/idn-util.c systemd-252.31/src/shared/idn-util.c
--- systemd-252.30/src/shared/idn-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/idn-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -42,11 +42,11 @@
if (idn_dl)
return 0; /* Already loaded */
- dl = dlopen("libidn.so.12", RTLD_LAZY);
+ dl = dlopen("libidn.so.12", RTLD_NOW|RTLD_NODELETE);
if (!dl) {
/* libidn broke ABI in 1.34, but not in a way we care about (a new field got added to an
* open-coded struct we do not use), hence support both versions. */
- dl = dlopen("libidn.so.11", RTLD_LAZY);
+ dl = dlopen("libidn.so.11", RTLD_NOW|RTLD_NODELETE);
if (!dl)
return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"libidn support is not installed: %s", dlerror());
@@ -54,7 +54,6 @@
} else
log_debug("Loaded 'libidn.so.12' via dlopen()");
-
r = dlsym_many_or_warn(
dl,
LOG_DEBUG,
diff -Nru systemd-252.30/src/shared/mount-util.c systemd-252.31/src/shared/mount-util.c
--- systemd-252.30/src/shared/mount-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/mount-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -446,8 +446,9 @@
fs = mnt_table_find_target(table, path, MNT_ITER_FORWARD);
if (!fs) {
- if (laccess(path, F_OK) < 0) /* Hmm, it's not in the mount table, but does it exist at all? */
- return -errno;
+ r = laccess(path, F_OK); /* Hmm, it's not in the mount table, but does it exist at all? */
+ if (r < 0)
+ return r;
return -EINVAL; /* Not a mount point we recognize */
}
diff -Nru systemd-252.30/src/shared/seccomp-util.c systemd-252.31/src/shared/seccomp-util.c
--- systemd-252.30/src/shared/seccomp-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/seccomp-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -854,6 +854,7 @@
.name = "@sync",
.help = "Synchronize files and memory to storage",
.value =
+ /* Please also update the list in seccomp_suppress_sync(). */
"fdatasync\0"
"fsync\0"
"msync\0"
@@ -2331,8 +2332,10 @@
uint32_t arch;
int r;
- /* This is mostly identical to SystemCallFilter=~@sync:0, but simpler to use, and separately
- * manageable, and also masks O_SYNC/O_DSYNC */
+ /* This behaves slightly differently from SystemCallFilter=~@sync:0, in that negative fds (which
+ * we can determine to be invalid) are still refused with EBADF. See #34478.
+ *
+ * Additionally, O_SYNC/O_DSYNC are masked. */
SECCOMP_FOREACH_LOCAL_ARCH(arch) {
_cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
@@ -2351,11 +2354,21 @@
continue;
}
- r = seccomp_rule_add_exact(
- seccomp,
- SCMP_ACT_ERRNO(0), /* success → we want this to be a NOP after all */
- id,
- 0);
+ if (STR_IN_SET(c, "fdatasync", "fsync", "sync_file_range", "sync_file_range2", "syncfs"))
+ r = seccomp_rule_add_exact(
+ seccomp,
+ SCMP_ACT_ERRNO(0), /* success → we want this to be a NOP after all */
+ id,
+ 1,
+ SCMP_A0(SCMP_CMP_LE, INT_MAX)); /* The rule handles arguments in unsigned. Hence, this
+ * means non-negative fd matches the rule, and the negative
+ * fd passed to the syscall (then it fails with EBADF). */
+ else
+ r = seccomp_rule_add_exact(
+ seccomp,
+ SCMP_ACT_ERRNO(0), /* success → we want this to be a NOP after all */
+ id,
+ 0);
if (r < 0)
log_debug_errno(r, "Failed to add filter for system call %s, ignoring: %m", c);
}
diff -Nru systemd-252.30/src/shared/tests.c systemd-252.31/src/shared/tests.c
--- systemd-252.30/src/shared/tests.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/tests.c 2024-10-10 18:34:03.000000000 +0100
@@ -35,6 +35,7 @@
#include "strv.h"
#include "tests.h"
#include "tmpfile-util.h"
+#include "uid-range.h"
char* setup_fake_runtime_dir(void) {
char t[] = "/tmp/fake-xdg-runtime-XXXXXX", *p;
@@ -172,6 +173,20 @@
assert_not_reached();
}
+bool userns_has_single_user(void) {
+ _cleanup_(uid_range_freep) UidRange *uidrange = NULL;
+
+ /* Check if we're in a user namespace with only a single user mapped in. We special case this
+ * scenario in a few tests because it's the only kind of namespace that can be created unprivileged
+ * and as such happens more often than not, so we make sure to deal with it so that all tests pass
+ * in such environments. */
+
+ if (uid_range_load_userns(&uidrange, NULL) < 0)
+ return false;
+
+ return uidrange->n_entries == 1 && uidrange->entries[0].nr == 1;
+}
+
bool can_memlock(void) {
/* Let's see if we can mlock() a larger blob of memory. BPF programs are charged against
* RLIMIT_MEMLOCK, hence let's first make sure we can lock memory at all, and skip the test if we
diff -Nru systemd-252.30/src/shared/tests.h systemd-252.31/src/shared/tests.h
--- systemd-252.30/src/shared/tests.h 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/tests.h 2024-10-10 18:34:03.000000000 +0100
@@ -48,6 +48,7 @@
int write_tmpfile(char *pattern, const char *contents);
bool have_namespaces(void);
+bool userns_has_single_user(void);
/* We use the small but non-trivial limit here */
#define CAN_MEMLOCK_SIZE (512 * 1024U)
diff -Nru systemd-252.30/src/shared/tpm2-util.c systemd-252.31/src/shared/tpm2-util.c
--- systemd-252.30/src/shared/tpm2-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/tpm2-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -195,7 +195,7 @@
if (!filename_is_valid(fn))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "TPM2 driver name '%s' not valid, refusing.", driver);
- dl = dlopen(fn, RTLD_NOW);
+ dl = dlopen(fn, RTLD_NOW|RTLD_NODELETE);
if (!dl)
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "Failed to load %s: %s", fn, dlerror());
diff -Nru systemd-252.30/src/shared/userdb.c systemd-252.31/src/shared/userdb.c
--- systemd-252.30/src/shared/userdb.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/shared/userdb.c 2024-10-10 18:34:03.000000000 +0100
@@ -1454,7 +1454,7 @@
/* Note that we might be called from libnss_systemd.so.2 itself, but that should be fine, really. */
- dl = dlopen(ROOTLIBDIR "/libnss_systemd.so.2", RTLD_LAZY|RTLD_NODELETE);
+ dl = dlopen(ROOTLIBDIR "/libnss_systemd.so.2", RTLD_NOW|RTLD_NODELETE);
if (!dl) {
/* If the file isn't installed, don't complain loudly */
log_debug("Failed to dlopen(libnss_systemd.so.2), ignoring: %s", dlerror());
diff -Nru systemd-252.30/src/sysext/sysext.c systemd-252.31/src/sysext/sysext.c
--- systemd-252.30/src/sysext/sysext.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/sysext/sysext.c 2024-10-10 18:34:03.000000000 +0100
@@ -676,13 +676,11 @@
if (!p)
return log_oom();
- if (laccess(p, F_OK) < 0) {
- if (errno != ENOENT)
- return log_error_errno(errno, "Failed to check if '%s' exists: %m", p);
-
- /* Hierarchy apparently was empty in all extensions, and wasn't mounted, ignoring. */
+ r = laccess(p, F_OK);
+ if (r == -ENOENT) /* Hierarchy apparently was empty in all extensions, and wasn't mounted, ignoring. */
continue;
- }
+ if (r < 0)
+ return log_error_errno(r, "Failed to check if '%s' exists: %m", p);
r = chase_symlinks(*h, arg_root, CHASE_PREFIX_ROOT|CHASE_NONEXISTENT, &resolved, NULL);
if (r < 0)
diff -Nru systemd-252.30/src/systemctl/systemctl-show.c systemd-252.31/src/systemctl/systemctl-show.c
--- systemd-252.30/src/systemctl/systemctl-show.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/systemctl/systemctl-show.c 2024-10-10 18:34:03.000000000 +0100
@@ -1645,6 +1645,29 @@
bus_print_property_value(name, expected_value, flags, affinity);
return 1;
+
+ } else if (streq(name, "RootImageOptions")) {
+ const char *a, *p;
+
+ /* In config files, the syntax allows the partition name to be omitted. Here, we
+ * always print the partition name, also because we have no way of knowing if it was
+ * originally omitted or not. We also print the partitions on separate lines. */
+
+ r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "(ss)");
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ while ((r = sd_bus_message_read(m, "(ss)", &a, &p)) > 0)
+ bus_print_property_valuef(name, expected_value, flags, "%s:%s", a, p);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ r = sd_bus_message_exit_container(m);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ return 1;
+
} else if (streq(name, "MountImages")) {
_cleanup_free_ char *paths = NULL;
diff -Nru systemd-252.30/src/system-update-generator/system-update-generator.c systemd-252.31/src/system-update-generator/system-update-generator.c
--- systemd-252.30/src/system-update-generator/system-update-generator.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/system-update-generator/system-update-generator.c 2024-10-10 18:34:03.000000000 +0100
@@ -20,12 +20,14 @@
static int generate_symlink(void) {
const char *p = NULL;
+ int r;
- if (laccess("/system-update", F_OK) < 0) {
- if (errno == ENOENT)
+ r = laccess("/system-update", F_OK);
+ if (r < 0) {
+ if (r == -ENOENT)
return 0;
- log_error_errno(errno, "Failed to check for system update: %m");
+ log_error_errno(r, "Failed to check for system update: %m");
return -EINVAL;
}
diff -Nru systemd-252.30/src/test/test-acl-util.c systemd-252.31/src/test/test-acl-util.c
--- systemd-252.30/src/test/test-acl-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-acl-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -34,7 +34,7 @@
cmd = strjoina("getfacl -p ", fn);
assert_se(system(cmd) == 0);
- if (getuid() == 0) {
+ if (getuid() == 0 && !userns_has_single_user()) {
const char *nobody = NOBODY_USER_NAME;
r = get_user_creds(&nobody, &uid, NULL, NULL, NULL, 0);
if (r < 0)
diff -Nru systemd-252.30/src/test/test-capability.c systemd-252.31/src/test/test-capability.c
--- systemd-252.30/src/test/test-capability.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-capability.c 2024-10-10 18:34:03.000000000 +0100
@@ -267,10 +267,13 @@
show_capabilities();
- test_drop_privileges();
+ if (!userns_has_single_user())
+ test_drop_privileges();
+
test_update_inherited_set();
- fork_test(test_have_effective_cap);
+ if (!userns_has_single_user())
+ fork_test(test_have_effective_cap);
if (run_ambient)
fork_test(test_apply_ambient_caps);
diff -Nru systemd-252.30/src/test/test-chown-rec.c systemd-252.31/src/test/test-chown-rec.c
--- systemd-252.30/src/test/test-chown-rec.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-chown-rec.c 2024-10-10 18:34:03.000000000 +0100
@@ -153,8 +153,8 @@
}
static int intro(void) {
- if (geteuid() != 0)
- return log_tests_skipped("not running as root");
+ if (geteuid() != 0 || userns_has_single_user())
+ return log_tests_skipped("not running as root or in userns with single user");
return EXIT_SUCCESS;
}
diff -Nru systemd-252.30/src/test/test-condition.c systemd-252.31/src/test/test-condition.c
--- systemd-252.30/src/test/test-condition.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-condition.c 2024-10-10 18:34:03.000000000 +0100
@@ -995,6 +995,13 @@
condition_free(condition);
free(gid);
+ /* In an unprivileged user namespace with the current user mapped to root, all the auxiliary groups
+ * of the user will be mapped to the nobody group, which means the user in the user namespace is in
+ * both the root and the nobody group, meaning the next test can't work, so let's skip it in that
+ * case. */
+ if (in_group(NOBODY_GROUP_NAME) && in_group("root"))
+ return (void) log_tests_skipped("user is in both root and nobody group");
+
groupname = (char*)(getegid() == 0 ? NOBODY_GROUP_NAME : "root");
condition = condition_new(CONDITION_GROUP, groupname, false, false);
assert_se(condition);
diff -Nru systemd-252.30/src/test/test-dlopen.c systemd-252.31/src/test/test-dlopen.c
--- systemd-252.30/src/test/test-dlopen.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-dlopen.c 2024-10-10 18:34:03.000000000 +0100
@@ -10,7 +10,7 @@
int i;
for (i = 0; i < argc - 1; i++)
- assert_se(handles[i] = dlopen(argv[i + 1], RTLD_NOW));
+ assert_se(handles[i] = dlopen(argv[i + 1], RTLD_NOW|RTLD_NODELETE));
for (i--; i >= 0; i--)
assert_se(dlclose(handles[i]) == 0);
diff -Nru systemd-252.30/src/test/test-fs-util.c systemd-252.31/src/test/test-fs-util.c
--- systemd-252.30/src/test/test-fs-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-fs-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -775,8 +775,8 @@
struct stat st;
const char *p;
- if (geteuid() != 0)
- return;
+ if (geteuid() != 0 || userns_has_single_user())
+ return (void) log_tests_skipped("not running as root or in userns with single user");
BLOCK_WITH_UMASK(0000);
diff -Nru systemd-252.30/src/test/test-nss-hosts.c systemd-252.31/src/test/test-nss-hosts.c
--- systemd-252.30/src/test/test-nss-hosts.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-nss-hosts.c 2024-10-10 18:34:03.000000000 +0100
@@ -380,7 +380,7 @@
log_info("======== %s ========", module);
- _cleanup_(dlclosep) void *handle = nss_open_handle(dir, module, RTLD_LAZY|RTLD_NODELETE);
+ _cleanup_(dlclosep) void *handle = nss_open_handle(dir, module, RTLD_NOW|RTLD_NODELETE);
if (!handle)
return -EINVAL;
diff -Nru systemd-252.30/src/test/test-nss-users.c systemd-252.31/src/test/test-nss-users.c
--- systemd-252.30/src/test/test-nss-users.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-nss-users.c 2024-10-10 18:34:03.000000000 +0100
@@ -166,7 +166,7 @@
log_info("======== %s ========", module);
- _cleanup_(dlclosep) void *handle = nss_open_handle(dir, module, RTLD_LAZY|RTLD_NODELETE);
+ _cleanup_(dlclosep) void *handle = nss_open_handle(dir, module, RTLD_NOW|RTLD_NODELETE);
if (!handle)
return -EINVAL;
diff -Nru systemd-252.30/src/test/test-rm-rf.c systemd-252.31/src/test/test-rm-rf.c
--- systemd-252.30/src/test/test-rm-rf.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-rm-rf.c 2024-10-10 18:34:03.000000000 +0100
@@ -89,6 +89,9 @@
TEST(rm_rf_chmod) {
int r;
+ if (getuid() == 0 && userns_has_single_user())
+ return (void) log_tests_skipped("running as root or in userns with single user");
+
if (getuid() == 0) {
/* This test only works unpriv (as only then the access mask for the owning user matters),
* hence drop privs here */
diff -Nru systemd-252.30/src/test/test-seccomp.c systemd-252.31/src/test/test-seccomp.c
--- systemd-252.30/src/test/test-seccomp.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-seccomp.c 2024-10-10 18:34:03.000000000 +0100
@@ -18,6 +18,7 @@
#include "capability-util.h"
#include "fd-util.h"
#include "fileio.h"
+#include "fs-util.h"
#include "macro.h"
#include "memory-util.h"
#include "missing_sched.h"
@@ -1227,4 +1228,55 @@
assert_se(wait_for_terminate_and_check("suidsgidseccomp", pid, WAIT_LOG) == EXIT_SUCCESS);
}
+static void test_seccomp_suppress_sync_child(void) {
+ _cleanup_(unlink_and_freep) char *path = NULL;
+ _cleanup_close_ int fd = -EBADF;
+
+ assert_se(tempfn_random("/tmp/seccomp_suppress_sync", NULL, &path) >= 0);
+ assert_se((fd = open(path, O_RDWR | O_CREAT | O_SYNC | O_CLOEXEC, 0666)) >= 0);
+ fd = safe_close(fd);
+
+ assert_se(fdatasync(-1) < 0 && errno == EBADF);
+ assert_se(fsync(-1) < 0 && errno == EBADF);
+ assert_se(syncfs(-1) < 0 && errno == EBADF);
+
+ assert_se(fdatasync(INT_MAX) < 0 && errno == EBADF);
+ assert_se(fsync(INT_MAX) < 0 && errno == EBADF);
+ assert_se(syncfs(INT_MAX) < 0 && errno == EBADF);
+
+ assert_se(seccomp_suppress_sync() >= 0);
+
+ assert_se((fd = open(path, O_RDWR | O_CREAT | O_SYNC | O_CLOEXEC, 0666)) < 0 && errno == EINVAL);
+
+ assert_se(fdatasync(INT_MAX) >= 0);
+ assert_se(fsync(INT_MAX) >= 0);
+ assert_se(syncfs(INT_MAX) >= 0);
+
+ assert_se(fdatasync(-1) < 0 && errno == EBADF);
+ assert_se(fsync(-1) < 0 && errno == EBADF);
+ assert_se(syncfs(-1) < 0 && errno == EBADF);
+}
+
+TEST(seccomp_suppress_sync) {
+ pid_t pid;
+
+ if (!is_seccomp_available()) {
+ log_notice("Seccomp not available, skipping %s", __func__);
+ return;
+ }
+ if (!have_seccomp_privs()) {
+ log_notice("Not privileged, skipping %s", __func__);
+ return;
+ }
+
+ assert_se((pid = fork()) >= 0);
+
+ if (pid == 0) {
+ test_seccomp_suppress_sync_child();
+ _exit(EXIT_SUCCESS);
+ }
+
+ assert_se(wait_for_terminate_and_check("seccomp_suppress_sync", pid, WAIT_LOG) == EXIT_SUCCESS);
+}
+
DEFINE_TEST_MAIN(LOG_DEBUG);
diff -Nru systemd-252.30/src/test/test-socket-util.c systemd-252.31/src/test/test-socket-util.c
--- systemd-252.30/src/test/test-socket-util.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/test/test-socket-util.c 2024-10-10 18:34:03.000000000 +0100
@@ -170,7 +170,7 @@
struct ucred ucred;
int pair[2];
- if (geteuid() == 0) {
+ if (geteuid() == 0 && !userns_has_single_user()) {
test_uid = 1;
test_gid = 2;
test_gids = (gid_t*) gids;
diff -Nru systemd-252.30/src/udev/cdrom_id/cdrom_id.c systemd-252.31/src/udev/cdrom_id/cdrom_id.c
--- systemd-252.30/src/udev/cdrom_id/cdrom_id.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/udev/cdrom_id/cdrom_id.c 2024-10-10 18:34:03.000000000 +0100
@@ -476,7 +476,7 @@
switch (feature) {
case 0x00:
- log_debug("GET CONFIGURATION: feature 'profiles', with %u entries", features[i + 3] / 4);
+ log_debug("GET CONFIGURATION: feature 'profiles', with %u entries", features[i + 3] / 4U);
feature_profiles(c, features + i + 4, MIN(features[i + 3], len - i - 4));
break;
default:
diff -Nru systemd-252.30/src/udev/dmi_memory_id/dmi_memory_id.c systemd-252.31/src/udev/dmi_memory_id/dmi_memory_id.c
--- systemd-252.30/src/udev/dmi_memory_id/dmi_memory_id.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/udev/dmi_memory_id/dmi_memory_id.c 2024-10-10 18:34:03.000000000 +0100
@@ -399,7 +399,7 @@
/* LSB is 7-bit Odd Parity number of continuation codes */
if (code != 0)
printf("MEMORY_DEVICE_%u_%s=Bank %d, Hex 0x%02X\n", slot_num, attr_suffix,
- (code & 0x7F) + 1, code >> 8);
+ (code & 0x7F) + 1, (uint16_t) (code >> 8));
}
static void dmi_memory_device_product_id(
diff -Nru systemd-252.30/src/udev/udev-node.c systemd-252.31/src/udev/udev-node.c
--- systemd-252.30/src/udev/udev-node.c 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/src/udev/udev-node.c 2024-10-10 18:34:03.000000000 +0100
@@ -385,6 +385,87 @@
return 0;
}
+static int link_update_diskseq(sd_device *dev, const char *slink, bool add) {
+ _cleanup_free_ char *buf = NULL;
+ const char *fname, *diskseq, *subsystem = NULL, *devtype = NULL;
+ int r;
+
+ assert(dev);
+ assert(slink);
+
+ (void) sd_device_get_subsystem(dev, &subsystem);
+ if (!streq_ptr(subsystem, "block"))
+ return 0;
+
+ fname = path_startswith(slink, "/dev/disk/by-diskseq");
+ if (isempty(fname))
+ return 0;
+
+ (void) sd_device_get_devtype(dev, &devtype);
+ if (streq_ptr(devtype, "partition")) {
+ _cleanup_free_ char *suffix = NULL;
+ const char *partn, *p;
+
+ /* Check if the symlink has an expected suffix "-part%n". See 60-persistent-storage.rules. */
+
+ r = sd_device_get_sysnum(dev, &partn);
+ if (r < 0) {
+ /* Cannot verify the symlink is owned by this device. Let's create the stack directory for the symlink. */
+ log_device_debug_errno(dev, r, "Failed to get sysnum, but symlink '%s' is requested, ignoring: %m", slink);
+ return 0;
+ }
+
+ suffix = strjoin("-part", partn);
+ if (!suffix)
+ return -ENOMEM;
+
+ p = endswith(fname, suffix);
+ if (!p) {
+ log_device_debug(dev, "Unexpected by-diskseq symlink '%s' is requested, proceeding anyway.", slink);
+ return 0;
+ }
+
+ buf = strndup(fname, p - fname);
+ if (!buf)
+ return -ENOMEM;
+
+ fname = buf;
+ }
+
+ /* Check if the diskseq part of the symlink is in digits. */
+ if (!in_charset(fname, DIGITS)) {
+ log_device_debug(dev, "Unexpected by-diskseq symlink '%s' is requested, proceeding anyway.", slink);
+ return 0; /* unexpected by-diskseq symlink */
+ }
+
+ /* On removal, we cannot verify the diskseq. Skipping further check below. */
+ if (!add) {
+ if (unlink(slink) < 0 && errno != ENOENT)
+ return log_device_debug_errno(dev, errno, "Failed to remove '%s': %m", slink);
+
+ (void) rmdir_parents(slink, "/dev");
+ return 1; /* done */
+ }
+
+ /* Check if the diskseq matches with the DISKSEQ property. */
+ r = sd_device_get_property_value(dev, "DISKSEQ", &diskseq);
+ if (r < 0) {
+ log_device_debug_errno(dev, r, "Failed to get DISKSEQ property, but symlink '%s' is requested, ignoring: %m", slink);
+ return 0;
+ }
+
+ if (!streq(fname, diskseq)) {
+ log_device_debug(dev, "Unexpected by-diskseq symlink '%s' is requested (DISKSEQ=%s), proceeding anyway.", slink, diskseq);
+ return 0;
+ }
+
+ r = node_symlink(dev, /* devnode = */ NULL, slink);
+ if (r < 0)
+ return r;
+
+ return 1; /* done */
+}
+
static int link_update(sd_device *dev, const char *slink, bool add) {
_cleanup_free_ char *dirname = NULL, *devnode = NULL;
_cleanup_close_ int dirfd = -1, lockfd = -1;
@@ -393,6 +474,10 @@
assert(dev);
assert(slink);
+ r = link_update_diskseq(dev, slink, add);
+ if (r != 0)
+ return r;
+
r = stack_directory_get_name(slink, &dirname);
if (r < 0)
return log_device_debug_errno(dev, r, "Failed to build stack directory name for '%s': %m", slink);
diff -Nru systemd-252.30/test/TEST-64-UDEV-STORAGE/test.sh systemd-252.31/test/TEST-64-UDEV-STORAGE/test.sh
--- systemd-252.30/test/TEST-64-UDEV-STORAGE/test.sh 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/test/TEST-64-UDEV-STORAGE/test.sh 2024-10-10 18:34:03.000000000 +0100
@@ -474,7 +474,7 @@
qemu_opts+=("-device pci-bridge,id=pci_bridge$brid,bus=pci_bridge$((brid-1)),chassis_nr=$((64+brid))")
done
- qemu_opts+=("-device virtio-blk-pci,drive=drive0,scsi=off,bus=pci_bridge$brid")
+ qemu_opts+=("-device virtio-blk-pci,drive=drive0,bus=pci_bridge$brid")
KERNEL_APPEND="systemd.setenv=TEST_FUNCTION_NAME=${FUNCNAME[0]} ${USER_KERNEL_APPEND:-}"
QEMU_OPTIONS="${qemu_opts[*]} ${USER_QEMU_OPTIONS:-}"
diff -Nru systemd-252.30/test/test-functions systemd-252.31/test/test-functions
--- systemd-252.30/test/test-functions 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/test/test-functions 2024-10-10 18:34:03.000000000 +0100
@@ -1826,13 +1826,9 @@
}
create_rc_local() {
- dinfo "Create rc.local"
- mkdir -p "${initdir:?}/etc/rc.d"
- cat >"$initdir/etc/rc.d/rc.local" <<EOF
-#!/usr/bin/env bash
-exit 0
-EOF
- chmod 0755 "$initdir/etc/rc.d/rc.local"
+ dinfo "Mask rc.local generator"
+ mkdir -p "${initdir:?}/etc/systemd/system-generators/"
+ ln -s /dev/null "$initdir/etc/systemd/system-generators/systemd-rc-local-generator"
}
install_execs() {
diff -Nru systemd-252.30/test/units/testsuite-17.14.sh systemd-252.31/test/units/testsuite-17.14.sh
--- systemd-252.30/test/units/testsuite-17.14.sh 1970-01-01 01:00:00.000000000 +0100
+++ systemd-252.31/test/units/testsuite-17.14.sh 2024-10-10 18:34:03.000000000 +0100
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# shellcheck disable=SC2010
+# shellcheck disable=SC2317
+set -ex
+set -o pipefail
+
+# shellcheck source=test/units/assert.sh
+. "$(dirname "$0")"/assert.sh
+
+# This is a test case for issue #34637.
+
+at_exit() (
+ set +e
+
+ systemctl stop test-diskseq.service || :
+ rm -f /run/systemd/system/test-diskseq.service
+ systemctl daemon-reload
+
+ [[ -d "$TMPDIR" ]] && rm -rf "$TMPDIR"
+
+ udevadm control --log-level=info
+)
+
+trap at_exit EXIT
+
+udevadm control --log-level=debug
+
+TMPDIR="$(mktemp -d)"
+truncate -s 16M "$TMPDIR"/foo.raw
+mkfs.ext4 -L foo "$TMPDIR"/foo.raw
+
+mkdir -p /run/systemd/system/
+cat >/run/systemd/system/test-diskseq.service <<EOF
+[Unit]
+StartLimitIntervalSec=0
+[Service]
+ExecStart=false
+Restart=on-failure
+MountImages=$TMPDIR/foo.raw:/var
+EOF
+systemctl daemon-reload
+
+udevadm settle
+
+# If an initrd from the host is used, stack directories for by-diskseq symlinks
+# may already exist. Save the number of the directories here.
+NUM_DISKSEQ_EXPECTED=$(ls /run/udev/links | grep -c by-diskseq || :)
+
+systemctl start --no-block test-diskseq.service
+
+for _ in {0..100}; do
+ sleep .1
+ assert_eq "$(ls /run/udev/links | grep -c by-diskseq || :)" "$NUM_DISKSEQ_EXPECTED"
+done
+
+exit 0
diff -Nru systemd-252.30/test/units/testsuite-19.keyed-properties.sh systemd-252.31/test/units/testsuite-19.keyed-properties.sh
--- systemd-252.30/test/units/testsuite-19.keyed-properties.sh 1970-01-01 01:00:00.000000000 +0100
+++ systemd-252.31/test/units/testsuite-19.keyed-properties.sh 2024-10-10 18:34:03.000000000 +0100
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -ex
+set -o pipefail
+
+# shellcheck source=test/units/test-control.sh
+. "$(dirname "$0")"/test-control.sh
+# shellcheck source=test/units/util.sh
+. "$(dirname "$0")"/util.sh
+
+if [[ "$(get_cgroup_hierarchy)" != unified ]]; then
+ echo "Skipping $0 as we're not running with the unified cgroup hierarchy"
+ exit 0
+fi
+
+testcase_iodevice_dbus () {
+ # Test that per-device properties are applied in configured order even for different devices (because
+ # they may resolve to same underlying device in the end
+ # Note: if device does not exist cgroup attribute write fails but systemd should still track the
+ # configured properties
+ systemd-run --unit=test0.service \
+ --property="IOAccounting=yes" \
+ sleep inf
+
+ systemctl set-property test0.service \
+ IOReadBandwidthMax="/dev/sda1 1M" \
+ IOReadBandwidthMax="/dev/sda2 2M" \
+ IOReadBandwidthMax="/dev/sda3 4M"
+
+ local output
+ output=$(mktemp)
+ trap 'rm -f "$output"' RETURN
+ systemctl show -P IOReadBandwidthMax test0.service >"$output"
+ diff -u "$output" - <<EOF
+/dev/sda1 1000000
+/dev/sda2 2000000
+/dev/sda3 4000000
+EOF
+
+ systemctl stop test0.service
+}
+
+testcase_iodevice_unitfile () {
+ cat >/run/systemd/system/test1.service <<EOF
+[Service]
+ExecStart=/usr/bin/sleep inf
+IOReadBandwidthMax=/dev/sda1 1M
+IOReadBandwidthMax=/dev/sda2 2M
+IOReadBandwidthMax=/dev/sda3 4M
+EOF
+ systemctl daemon-reload
+
+ local output
+ output=$(mktemp)
+ trap 'rm -f "$output"' RETURN
+ systemctl show -P IOReadBandwidthMax test1.service >"$output"
+ diff -u "$output" - <<EOF
+/dev/sda1 1000000
+/dev/sda2 2000000
+/dev/sda3 4000000
+EOF
+ rm -f /run/systemd/system/test1.service
+}
+
+run_testcases
diff -Nru systemd-252.30/test/units/testsuite-29.sh systemd-252.31/test/units/testsuite-29.sh
--- systemd-252.30/test/units/testsuite-29.sh 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/test/units/testsuite-29.sh 2024-10-10 18:34:03.000000000 +0100
@@ -71,6 +71,21 @@
# Ensure we don't regress (again) when using --force
+mkdir -p /run/systemd/system.attached/minimal-app0.service.d/
+cat <<EOF >/run/systemd/system.attached/minimal-app0.service
+[Unit]
+Description=Minimal App 0
+EOF
+cat <<EOF >/run/systemd/system.attached/minimal-app0.service.d/10-profile.conf
+[Unit]
+Description=Minimal App 0
+EOF
+cat <<EOF >/run/systemd/system.attached/minimal-app0.service.d/20-portable.conf
+[Unit]
+Description=Minimal App 0
+EOF
+systemctl daemon-reload
+
portablectl "${ARGS[@]}" attach --force --now --runtime /usr/share/minimal_0.raw minimal-app0
portablectl is-attached --force minimal-app0
@@ -208,6 +223,28 @@
systemctl is-active app1.service
+portablectl detach --now --runtime overlay app1
+
+# Ensure --force works also when symlinking
+mkdir -p /run/systemd/system.attached/app1.service.d
+cat <<EOF >/run/systemd/system.attached/app1.service
+[Unit]
+Description=App 1
+EOF
+cat <<EOF >/run/systemd/system.attached/app1.service.d/10-profile.conf
+[Unit]
+Description=App 1
+EOF
+cat <<EOF >/run/systemd/system.attached/app1.service.d/20-portable.conf
+[Unit]
+Description=App 1
+EOF
+systemctl daemon-reload
+
+portablectl "${ARGS[@]}" attach --force --copy=symlink --now --runtime /tmp/overlay app1
+
+systemctl is-active app1.service
+
portablectl detach --now --runtime overlay app1
umount /tmp/overlay
diff -Nru systemd-252.30/test/units/testsuite-58.sh systemd-252.31/test/units/testsuite-58.sh
--- systemd-252.30/test/units/testsuite-58.sh 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/test/units/testsuite-58.sh 2024-10-10 18:34:03.000000000 +0100
@@ -914,6 +914,47 @@
assert_in "${loop}p3 : start= *${start}, size= *${size}, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=DB081670-07AE-48CA-9F5E-813D5E40B976, name=\"linux-generic-2\"" "$output"
}
+testcase_random_seed() {
+ local defs imgs output
+
+ # For issue #34257
+
+ defs="$(mktemp --directory "/tmp/test-repart.defs.XXXXXXXXXX")"
+ imgs="$(mktemp --directory "/var/tmp/test-repart.imgs.XXXXXXXXXX")"
+ # shellcheck disable=SC2064
+ trap "rm -rf '$defs' '$imgs'" RETURN
+ chmod 0755 "$defs"
+
+ tee "$defs/root.conf" <<EOF
+[Partition]
+Type=root
+EOF
+
+ tee "$defs/home.conf" <<EOF
+[Partition]
+Type=home
+Label=home-first
+EOF
+
+ tee "$defs/swap.conf" <<EOF
+[Partition]
+Type=swap
+SizeMaxBytes=64M
+PaddingMinBytes=92M
+EOF
+
+ systemd-repart --definitions="$defs" \
+ --empty=create \
+ --size=1G \
+ --dry-run=no \
+ --seed=random \
+ --json=pretty \
+ "$imgs/zzz"
+
+ sfdisk -d "$imgs/zzz"
+ [[ "$(sfdisk -d "$imgs/zzz" | grep -F 'uuid=' | awk '{ print $8 }' | sort -u | wc -l)" == "3" ]]
+}
+
test_basic
test_dropin
test_multiple_definitions
@@ -923,6 +964,7 @@
test_issue_24553
test_zero_uuid
test_verity
+testcase_random_seed
# Valid block sizes on the Linux block layer are >= 512 and <= PAGE_SIZE, and
# must be powers of 2. Which leaves exactly four different ones to test on
diff -Nru systemd-252.30/test/units/testsuite-75.sh systemd-252.31/test/units/testsuite-75.sh
--- systemd-252.30/test/units/testsuite-75.sh 2024-08-19 21:25:31.000000000 +0100
+++ systemd-252.31/test/units/testsuite-75.sh 2024-10-10 18:34:03.000000000 +0100
@@ -16,6 +16,12 @@
"$@" |& tee "$RUN_OUT"
}
+run_delv() {
+ # Since [0] delv no longer loads /etc/(bind/)bind.keys by default, so we
+ # have to do that explicitly for each invocation
+ run delv -a /etc/bind.keys "$@"
+}
+
monitor_check_rr() (
set +x
set +o pipefail
@@ -214,9 +220,9 @@
# Check the trust chain (with and without systemd-resolved in between
# Issue: https://github.com/systemd/systemd/issues/22002
# PR: https://github.com/systemd/systemd/pull/23289
-run delv @10.0.0.1 signed.test
+run_delv @10.0.0.1 signed.test
grep -qF "; fully validated" "$RUN_OUT"
-run delv signed.test
+run_delv signed.test
grep -qF "; fully validated" "$RUN_OUT"
run dig +short signed.test
@@ -239,9 +245,9 @@
# DNSSEC validation with multiple records of the same type for the same name
# Issue: https://github.com/systemd/systemd/issues/22002
# PR: https://github.com/systemd/systemd/pull/23289
-run delv @10.0.0.1 dupe.signed.test
+run_delv @10.0.0.1 dupe.signed.test
grep -qF "; fully validated" "$RUN_OUT"
-run delv dupe.signed.test
+run_delv dupe.signed.test
grep -qF "; fully validated" "$RUN_OUT"
# Test resolution of CNAME chains
@@ -266,9 +272,9 @@
# Check the trust chain (with and without systemd-resolved in between
# Issue: https://github.com/systemd/systemd/issues/22002
# PR: https://github.com/systemd/systemd/pull/23289
-run delv @10.0.0.1 sub.onlinesign.test
+run_delv @10.0.0.1 sub.onlinesign.test
grep -qF "; fully validated" "$RUN_OUT"
-run delv sub.onlinesign.test
+run_delv sub.onlinesign.test
grep -qF "; fully validated" "$RUN_OUT"
run dig +short sub.onlinesign.test
--- End Message ---