Attention is currently required from: Yu-Ping Wu. Hello Yu-Ping Wu,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/62720
to review the following change.
Change subject: cbmem: Fix console banner matches ......................................................................
cbmem: Fix console banner matches
Since the new loglevel markers were added, there will now be a marker character at the beginning of the coreboot banner string, and this will make the existing regular expressions meant to find it fail to match. This patch fixes the problem by just allowing for a single extra character there (any character to avoid the hassle of having to match the marker explicitly). The extra character is optional so that we will still continue to match banners from older versions of coreboot as well.
Since the `?` glyph is not available in basic POSIX regular expressions, we have to switch to REG_EXTENDED syntax (should otherwise make no difference). (Also, move side effects out of assert() while I'm here, that's not actually safe for the standard libc implementation.)
Signed-off-by: Julius Werner jwerner@chromium.org Change-Id: I99fb347eb1cf7b043a2113dfda7c798d6ee38975 --- M util/cbmem/cbmem.c 1 file changed, 4 insertions(+), 3 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/20/62720/1
diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c index a39ef2a..eef68a0 100644 --- a/util/cbmem/cbmem.c +++ b/util/cbmem/cbmem.c @@ -818,8 +818,8 @@ cursor = previous = 0; if (type != CONSOLE_PRINT_FULL) { #define BANNER_REGEX(stage) \ - "\n\ncoreboot-[^\n]* " stage " starting.*\.\.\.\n" -#define OVERFLOW_REGEX(stage) "\n\*\*\* Pre-CBMEM " stage " console overflow" + "\n\n.?coreboot-[^\n]* " stage " starting.*\.\.\.\n" +#define OVERFLOW_REGEX(stage) "\n.?\*\*\* Pre-CBMEM " stage " console overflow" const char *regex[] = { BANNER_REGEX("verstage-before-bootblock"), BANNER_REGEX("bootblock"), BANNER_REGEX("verstage"), @@ -831,7 +831,8 @@ for (size_t i = 0; !cursor && i < ARRAY_SIZE(regex); i++) { regex_t re; regmatch_t match; - assert(!regcomp(&re, regex[i], 0)); + int res = regcomp(&re, regex[i], REG_EXTENDED); + assert(res == 0);
/* Keep looking for matches so we find the last one. */ while (!regexec(&re, console_c + cursor, 1, &match, 0)) {