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:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user