Browse Source

shell: Fix "read -d ''" behavior

With bash's read builtin it is possible to read from a file (e.g.
device-tree) until the first '\0' character:

IFS= read -r -d '' VARIABLE < file

In busybox ash the -d extension is also implemented, but checking the
read character for '\0' has to be performed after comparing with the
delimiter.

Signed-off-by: Christian Eggers <ceggers@arri.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Christian Eggers 3 years ago
parent
commit
39925026f6

+ 1 - 0
shell/ash_test/ash-read/read_d0.right

@@ -0,0 +1 @@
+test

+ 1 - 0
shell/ash_test/ash-read/read_d0.tests

@@ -0,0 +1 @@
+printf 'test\0zest\n' | (read -d '' reply; echo "$reply")

+ 1 - 0
shell/hush_test/hush-read/read_d0.right

@@ -0,0 +1 @@
+test

+ 1 - 0
shell/hush_test/hush-read/read_d0.tests

@@ -0,0 +1 @@
+printf 'test\0zest\n' | (read -d '' reply; echo "$reply")

+ 2 - 2
shell/shell_common.c

@@ -209,8 +209,6 @@ shell_builtin_read(struct builtin_read_params *params)
 		}
 
 		c = buffer[bufpos];
-		if (c == '\0')
-			continue;
 		if (!(read_flags & BUILTIN_READ_RAW)) {
 			if (backslash) {
 				backslash = 0;
@@ -225,6 +223,8 @@ shell_builtin_read(struct builtin_read_params *params)
 		}
 		if (c == delim) /* '\n' or -d CHAR */
 			break;
+		if (c == '\0')
+			continue;
 
 		/* $IFS splitting. NOT done if we run "read"
 		 * without variable names (bash compat).