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 6b6e471a32.

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=<very long value without terminating newline>

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.
This commit is contained in:
dongshengyuan
2026-07-10 16:05:24 +08:00
parent 13d8955088
commit 9095da896f
2 changed files with 13 additions and 2 deletions
+2 -2
View File
@@ -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);
+11
View File
@@ -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