diff --git a/cmd-parse.y b/cmd-parse.y index a6541c930..390ff627e 100644 --- a/cmd-parse.y +++ b/cmd-parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-parse.y,v 1.60 2026/09/08 10:20:08 nicm Exp $ */ +/* $OpenBSD: cmd-parse.y,v 1.61 2026/10/05 13:45:49 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott @@ -41,6 +41,7 @@ static char *yylex_format(void); struct cmd_parse_scope { int flag; + int taken; TAILQ_ENTRY (cmd_parse_scope) entry; }; @@ -272,6 +273,7 @@ if_open : IF expanded scope = xmalloc(sizeof *scope); $$ = scope->flag = format_true($2); + scope->taken = scope->flag; free($2); if (ps->scope != NULL) @@ -285,7 +287,8 @@ if_else : ELSE struct cmd_parse_scope *scope; scope = xmalloc(sizeof *scope); - scope->flag = !ps->scope->flag; + scope->flag = !ps->scope->taken; + scope->taken = 1; free(ps->scope); ps->scope = scope; @@ -297,7 +300,9 @@ if_elif : ELIF expanded struct cmd_parse_scope *scope; scope = xmalloc(sizeof *scope); - $$ = scope->flag = format_true($2); + scope->flag = !ps->scope->taken && format_true($2); + scope->taken = ps->scope->taken || scope->flag; + $$ = scope->flag; free($2); free(ps->scope); diff --git a/format.c b/format.c index 97bcc4bfc..26a64f964 100644 --- a/format.c +++ b/format.c @@ -1,4 +1,4 @@ -/* $OpenBSD: format.c,v 1.424 2026/09/29 14:12:21 nicm Exp $ */ +/* $OpenBSD: format.c,v 1.425 2026/10/05 10:59:37 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -4831,6 +4831,9 @@ format_skip1(struct format_expand_state *es, const char *s, const char *end) int brackets = 0; u_int check = 0; + if (es != NULL && !format_check_time(es, NULL)) + return (NULL); + for (; *s != '\0'; s++) { if (es != NULL && !format_check_time(es, &check)) return (NULL);