Failure to read full line including embedded zero

2019-07-17 21:44发布

问题:

Lua script:

i=io.read()
print(i)

Command line:

echo -e "sala\x00m" | lua ll.lua

Output:

sala

I want it to print all character from input, similar to this:

salam

in HEX editor:

0000000: 7361 6c61 006d 0a                         sala.m.

How can I print all character from input?

回答1:

You tripped over one of the few places where the Lua standard library is still not 8-bit-clean.
Specifically, file reading line-by-line is not embedded-0 proof.

The reason it isn't yet is an unfortunate combination of:

  • Only standard C90 or equally portable constructs are allowed for the core, which does not provide for efficient 0-clean text parsing.
  • Every solution discussed to date on the mailinglist under that constraint has considerable overhead.
  • Embedded 0-bytes in text files are quite rare.

Workarounds:

  • Use a modified library, fixing these formats: "*l" "*L" for file:read(...)
  • parse your raw data yourself. (read a block using a number or as much as possible using "*a")
  • Badger the Lua developers/maintainers for a bugfix until they give in.