From 9095da896fc1bdd86b5b749d71bd2aebc585e236 Mon Sep 17 00:00:00 2001 From: dongshengyuan <545258830@qq.com> Date: Fri, 10 Jul 2026 16:05:24 +0800 Subject: [PATCH] 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. --- src/udev/udev-rules.c | 4 ++-- test/units/TEST-17-UDEV.IMPORT.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 42f6fde8a0..88f633138e 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 f09b171066..f2f9a4100e 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