tools: mkenvimage: Fix reading from slow pipe
authorAndre Przywara <andre.przywara@arm.com>
Sun, 30 Jun 2019 01:45:00 +0000 (02:45 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 18 Jul 2019 15:31:26 +0000 (11:31 -0400)
It is perfectly fine for the read(2) syscall to return with less than
the requested number of bytes read (short read, see the "RETURN VALUE"
section of the man page). This typically happens with slow input
(keyboard, network) or with complex pipes.

So far mkenvimage expects the exact number of requested bytes to be
read, assuming an end-of-file condition otherwise. This wrong behaviour
can be easily shown with:
$ (echo "foo=bar"; sleep 1; echo "bar=baz") | mkenvimage -s 256 -o out -
The second line will be missing from the output.

Correct this by checking for any positive, non-zero return value.

This fixes a problem with a complex pipe in one of my scripts, where
the environment consist of two parts.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Acked-by: Alexander Dahl <ada@thorsis.com>
tools/mkenvimage.c

index 75967d0c2d59667da31ada29bc3d7abb3e3b5acc..ffaebd5565c5a57b4c883fcd2d1dcad060320ffc 100644 (file)
@@ -173,8 +173,7 @@ int main(int argc, char **argv)
                                return EXIT_FAILURE;
                        }
                        filesize += readbytes;
-               } while (readbytes == readlen);
-
+               } while (readbytes > 0);
        } else {
                txt_filename = argv[optind];
                txt_fd = open(txt_filename, O_RDONLY);