Skip to content

Commit 2f7faf6

Browse files
authored
lexstates.h: Fix buffer overflow in macros (ksh93#538)
The isaname, isaletter, isadigit, isexp and ismeta macros don't check if c is a negative value before accessing sh_lexstates. This can result in a buffer overflow when running in a multibyte locale. src/cmd/ksh93/include/lexstates.h: - Check if c is negative before accessing sh_lexstates. Backported from ksh2020: att@a7013320
1 parent f8ec4c2 commit 2f7faf6

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/cmd/ksh93/include/lexstates.h

+9-9
Original file line numberDiff line numberDiff line change
@@ -107,21 +107,21 @@
107107
#if SHOPT_MULTIBYTE
108108
# define LEN _Fcin.fclen
109109
# define SETLEN(x) (_Fcin.fclen = x)
110-
# define isaname(c) ((c)>0x7f?isalpha(c): sh_lexstates[ST_NAME][(c)]==0)
111-
# define isaletter(c) ((c)>0x7f?isalpha(c): sh_lexstates[ST_DOL][(c)]==S_ALP && (c)!='.')
110+
# define isaname(c) ((c) < 0 ? 0 : ((c) > 0x7f ? isalpha(c) : sh_lexstates[ST_NAME][(c)] == 0))
111+
# define isaletter(c) ((c) < 0 ? 0 : ((c) > 0x7f ? isalpha(c) : sh_lexstates[ST_DOL][(c)] == S_ALP && (c) != '.'))
112112
#else
113113
# undef mbwide
114114
# define mbwide() (0)
115115
# define LEN 1
116116
# define SETLEN(x) (x)
117-
# define isaname(c) (sh_lexstates[ST_NAME][c]==0)
118-
# define isaletter(c) (sh_lexstates[ST_DOL][c]==S_ALP && (c)!='.')
117+
# define isaname(c) ((c) < 0 ? 0 : sh_lexstates[ST_NAME][c] == 0)
118+
# define isaletter(c) ((c) < 0 ? 0 : (sh_lexstates[ST_DOL][c] == S_ALP && (c) != '.'))
119119
#endif
120-
#define STATE(s,c) (s[mbwide()?((c=fcmbget(&LEN)),LEN>1?'a':c):(c=fcget())])
121-
#define isadigit(c) (sh_lexstates[ST_DOL][c]==S_DIG)
122-
#define isastchar(c) ((c)=='@' || (c)=='*')
123-
#define isexp(c) (sh_lexstates[ST_MACRO][c]==S_PAT||(c)=='$'||(c)=='`')
124-
#define ismeta(c) (sh_lexstates[ST_NAME][c]==S_BREAK)
120+
#define STATE(s,c) (s[mbwide() ? ((c = fcmbget(&LEN)), LEN > 1 ? 'a' : c) : (c = fcget())])
121+
#define isadigit(c) ((c) < 0 ? 0 : sh_lexstates[ST_DOL][c] == S_DIG)
122+
#define isastchar(c) ((c) == '@' || (c) == '*')
123+
#define isexp(c) ((c) < 0 ? 0 : (sh_lexstates[ST_MACRO][c] == S_PAT || (c) == '$' || (c) == '`'))
124+
#define ismeta(c) ((c) < 0 ? 0 : sh_lexstates[ST_NAME][c] == S_BREAK)
125125

126126
extern char *sh_lexstates[ST_NONE];
127127
extern const char *sh_lexrstates[ST_NONE];

0 commit comments

Comments
 (0)