From: dongshengyuan <545258830@qq.com> Date: Fri, 10 Jul 2026 08:05:24 +0000 (+0800) Subject: udev-rules: drop truncated import output line X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9095da896fc1bdd86b5b749d71bd2aebc585e236;p=thirdparty%2Fsystemd.git udev-rules: drop truncated import output line When IMPORT{program} output was truncated, the code intended to drop the last incomplete result line before importing properties. It edited the command buffer instead of the output buffer, so the incomplete line could still be parsed and imported. Trim the result buffer and cover the behavior with the existing IMPORT test. Follow-up for 6b6e471a325bf149839c5c822b4ae3e66cb1d9a3. Reproducer: Configure an IMPORT{program} rule whose output exceeds UDEV_LINE_SIZE and ends with an incomplete property line, for example: TRUNCATED_OK=yes TRUNCATED_BAD= Only TRUNCATED_OK should be imported. Before this fix, the truncation handler edited the command buffer instead of the output buffer, so TRUNCATED_BAD could still be parsed from the truncated result. --- diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 42f6fde8a08..88f633138e6 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -2482,14 +2482,14 @@ static int udev_rule_apply_token_to_event( /* Drop the last line. */ bool found = false; - for (char *p = PTR_SUB1(buf + strlen(buf), buf); p; p = PTR_SUB1(p, buf)) + for (char *p = PTR_SUB1(result + strlen(result), result); p; p = PTR_SUB1(p, result)) if (strchr(NEWLINE, *p)) { *p = '\0'; found = true; break; } if (!found) - buf[0] = '\0'; + result[0] = '\0'; } r = strv_split_newlines_full(&lines, result, EXTRACT_RETAIN_ESCAPE); diff --git a/test/units/TEST-17-UDEV.IMPORT.sh b/test/units/TEST-17-UDEV.IMPORT.sh index f09b1710661..f2f9a4100ee 100755 --- a/test/units/TEST-17-UDEV.IMPORT.sh +++ b/test/units/TEST-17-UDEV.IMPORT.sh @@ -17,6 +17,17 @@ test -f /run/udev/data/c1:3 udevadm info /dev/null | grep 'E: HOGE=aa\\x20\\x20\\x20bb' >/dev/null udevadm info /dev/null | grep 'E: FOO=\\x20aaa\\x20' >/dev/null +cat >/run/udev/rules.d/50-testsuite.rules <<'EOF' +SUBSYSTEM=="mem", KERNEL=="null", OPTIONS="log_level=debug" +ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", IMPORT{program}="/bin/sh -c 'printf \"TRUNCATED_OK=yes\nTRUNCATED_BAD=\"; i=0; while [ \"$i\" -lt 20000 ]; do printf A; i=$((i + 1)); done'" +EOF + +udevadm control --reload +SYSTEMD_LOG_LEVEL=debug udevadm trigger --verbose --settle --action add /dev/null + +udevadm info /dev/null | grep 'E: TRUNCATED_OK=yes' >/dev/null +(! udevadm info /dev/null | grep 'E: TRUNCATED_BAD=' >/dev/null) + rm /run/udev/rules.d/50-testsuite.rules udevadm control --reload