freebsd-dev/stand
John Hood dbdf2b52f5 loader: support.4th resets the read buffer incorrectly
Large nextboot.conf files (over 80 bytes) are not read correctly by the
Forth loader, causing file parsing to abort, and nextboot configuration
fails to apply.

Simple repro:

nextboot -e foo=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
shutdown -r now

That will cause the bug to cause a parse failure but shouldn't otherwise
affect the boot.  Depending on your loader configuration, you may also
have to set beastie_disable and/or reduce the number of modules loaded
to see the error on a small console screen.  12.0 or CURRENT users will
also have to explicitly use the Forth loader instead of the Lua loader.
The error will look something like:

Warning: syntax error on file /boot/loader.conf.local
foo="xxxxxxxxxxxxxxnextboot_enable="YES"
                                    ^
/boot/support.4th has crude file I/O buffering, which uses a buffer
'read_buffer', defined to be 80 bytes by the 'read_buffer_size'
constant.  The loader first tastes nextboot.conf, reading and parsing
the first line in it for nextboot_enable="YES".  If this is true, then
it reopens the file and parses it like other loader .conf files.

Unfortunately, the file I/O buffering code does not fully reset the
buffer state in the reset_line_reading word.  If the last file was read
to the end, that doesn't matter; the file buffer is treated as empty
anyway.  But in the nextboot.conf case, the loader will not read to the
end of file if it is over 80 bytes, and the file buffer may be reused
when reading the next file.  When the file is reread, the corrupt text
may cause file parsing to abort on bad syntax (if the corrupt line has
<>2 quotes in it), the wrong variable to be set, no variable to be set
at all, or (if the splice happens to land at a line ending) something
approximating normal operation.

The bug is very old, dating back to at least 2000 if not before, and is
still present in 12.0 and CURRENT r345863 (though it is now hidden by
the Lua loader by default).

Suggested one-line attached.  This does change the behavior of the
reset_line_reading word, which is exported in the line-reading
dictionary (though the export is not documented in loader man pages).
But repo history shows it was probably exported for the PNP support
code, which was never included in the loader build, and was removed 5
months ago.

One thing that puzzles me: how has this bug gone unnoticed/unfixed for
nearly 2 decades?  I find it hard to believe that nobody's tried to do
something interesting with nextboot, like load a kernel and filesystem,
which is what I'm doing.

Tested by:		Gary Jennejohn
PR:			239315
MFC After:		3 weeks
Reviewed by:		imp (and correctly applied this time)
Differential Revision:	https://reviews.freebsd.org/D31328
2021-07-28 13:50:38 -06:00
..
arm Remove obsolete code gated on _ARM_ARCH_* 2021-01-28 10:41:45 +00:00
arm64 No need to make objects here. 2018-04-27 22:15:18 +00:00
common loader: Don't reserve space for symbols twice. 2021-07-12 15:30:27 -06:00
defaults loader: update autoboot description and move to loader.conf.5 2021-07-12 15:13:03 -06:00
efi loader: Use tslog to instrument some functions 2021-06-20 20:09:48 -07:00
fdt loader: Fix dtb loading 2021-07-05 15:53:08 +02:00
ficl loader: implement framebuffer console 2021-01-02 21:41:36 +02:00
ficl32 Enable veriexec for loader 2019-02-26 06:22:10 +00:00
fonts loader: really use bold font for vga text mode 2021-01-08 01:24:30 +02:00
forth loader: support.4th resets the read buffer incorrectly 2021-07-28 13:50:38 -06:00
i386 type: becauce -> because 2021-07-21 20:03:35 -06:00
images loader: implement framebuffer console 2021-01-02 21:41:36 +02:00
kshim Fix build of stand/usb . 2021-04-12 16:13:33 +02:00
liblua EFI secure boot VECTX related changes 2021-04-30 12:53:45 -05:00
liblua32
libofw Fix 64-bit build of libofw. 2020-09-08 23:22:11 +00:00
libsa libsa: Add tslog support for arm64 2021-06-23 22:21:23 -07:00
libsa32 Enable veriexec for loader 2019-02-26 06:22:10 +00:00
lua loader: do not output empty menu title 2021-04-21 14:50:23 +03:00
man loader: Create loader_simp(8) to document simple version of loader 2021-07-14 16:59:51 -06:00
mips Disable PIE for MIPS BERI boot loader 2021-02-25 06:41:35 +01:00
powerpc Disable PIE for powerpc bootloaders. 2021-02-25 00:26:11 +01:00
uboot loader: fix uboot build with gfx_fb 2021-01-03 20:45:37 +02:00
usb Fix build of stand/usb . 2020-01-23 10:40:34 +00:00
userboot userboot: provide stub gfx functions 2021-01-30 21:20:27 +02:00
defs.mk loader: make sure CPUTYPE is ignored when building 2021-07-14 21:06:19 -06:00
fdt.mk
ficl.mk EFI secure boot VECTX related changes 2021-04-30 12:53:45 -05:00
loader.mk stand/common: Add support for timestamp logging (tslog) 2021-06-20 20:09:43 -07:00
lua.mk Do not include float interfaces when using libsa. 2018-02-23 04:04:25 +00:00
Makefile stand: ensure that the efi directory's dependencies are correct 2021-01-27 13:02:51 -06:00
Makefile.amd64 stand: properly declare subdir deps or .WAIT, do parallel build 2020-12-31 11:15:45 -06:00
Makefile.inc stand: properly declare subdir deps or .WAIT, do parallel build 2020-12-31 11:15:45 -06:00
uboot.mk
veriexec.mk EFI secure boot VECTX related changes 2021-04-30 12:53:45 -05:00