Our strsep() function is slightly incorrect in that it leaves the `stringp` pointer pointing to the terminating NUL byte after parsing the last token. The man page for official implementations says: > In case no delimiter was found, the token is taken to be the entire > string *stringp, and *stringp is made NULL. This doesn't affect things in practice much because we also (incorrectly) return NULL when called with `**stringp == '\0'`, meaning the usual pattern of calling `strsep()` in a row without checking results first still works when there are less tokens than expected, since we terminate early from that case instead. But it does break the edge cases where the caller wants to check if there were extra bytes beyond the last token (`stringp == NULL`), and where we call `strsep()` on a pointer pointing directly to a terminating NUL byte already (supposed to return an empty string but our implementation actually returns NULL). It doesn't look like these edge cases occur anywhere in current libpayload or depthcharge code. This patch fixes the issue and also adds a unit test to ensure it remains correct in the future. (Also move the definition of the `errno` variable from lib.c into string.c, because `perror()` in string.c is the only function that actually needs that, and the crazy linker error you get when only linking one but not the other into a test will waste you half an hour to figure out.) Change-Id: I610b5117710c110bcba4fac2a0bb6c13f4f8d046 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/88729 Reviewed-by: Yu-Ping Wu <yupingso@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> |
||
|---|---|---|
| .. | ||
| arch | ||
| bin | ||
| configs | ||
| crypto | ||
| curses | ||
| drivers | ||
| gdb | ||
| include | ||
| libc | ||
| libcbfs | ||
| liblz4 | ||
| liblzma | ||
| libpci | ||
| sample | ||
| tests | ||
| vboot | ||
| .gitignore | ||
| Doxyfile | ||
| Kconfig | ||
| LICENSE_GPL | ||
| LICENSES | ||
| Makefile | ||
| Makefile.mk | ||
| Makefile.payload | ||
| README | ||
-------------------------------------------------------------------------------
libpayload README
-------------------------------------------------------------------------------
libpayload is a minimal library to support standalone payloads
that can be booted with firmware like coreboot. It handles the setup
code, and provides common C library symbols such as malloc() and printf().
Note: This is _not_ a standard library for use with an operating system,
rather it's only useful for coreboot payload development!
See https://www.coreboot.org for details on coreboot.
Installation
------------
$ git clone https://review.coreboot.org/coreboot.git
$ cd coreboot/payloads/libpayload
$ make menuconfig
$ make
$ make install (optional, will install into ./install per default)
On x86 systems, libpayload will always be 32-bit even if your host OS runs
in 64-bit, so you might have to install the 32-bit libgcc version.
On Debian systems you'd do 'apt-get install gcc-multilib' for example.
Run 'make distclean' before switching boards. This command will remove
your current .config file, so you need 'make menuconfig' again or
'make defconfig' in order to set up configuration. Default configuration
is based on 'configs/defconfig'. See the configs/ directory for examples
of configuration.
Usage
-----
Here's an example of a very simple payload (hello.c) and how to build it:
#include <libpayload.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
Building the payload using the 'lpgcc' compiler wrapper:
$ lpgcc -o hello.elf hello.c
Please see the sample/ directory for details.
Website and Mailing List
------------------------
The main website is https://www.coreboot.org/Libpayload.
For additional information, patches, and discussions, please join the
coreboot mailing list at https://www.coreboot.org/Mailinglist, where most
libpayload developers are subscribed.
Copyright and License
---------------------
See LICENSES.