Skip to content

Commit

Permalink
emacs: Fix crash on inputting Asian chars (Solaris 240-22461939)
Browse files Browse the repository at this point in the history
This change is pulled from here:
https://github.com/oracle/solaris-userland/blob/master/components/ksh93/patches/240-22461939.patch

Information:
att#6

George Lijo wrote on 14 Mar 2016:
> I observed this issue in a Solaris 11 system on ksh2012-08-01
> [...]. The issue can be reproduced if we add Asian locales to
> ibus (such as Korean). In the ksh93 shell prompt, input some
> Asian character. ksh promptly dumps core [...].
>
> The coredump happens at the following line no 320 in
> src/cmd/ksh93/edit/emacs.c
>	if(c!='\t' && c!=ESC && !isdigit(c)).
>
> I referred the vi.c code and added the digit(c) macro, i.e.
> ((c&~STRIP)==0 && isdigit(c)) and replaced the isdigit(c) usage
> with the "digit(c)" macro.
  • Loading branch information
McDutchie committed Jan 8, 2021
1 parent a3ccff6 commit 3f38f8a
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/cmd/ksh93/edit/emacs.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,15 @@ One line screen editor for any program
static int print(int);
static int _isword(int);
# define isword(c) _isword(out[c])
# define digit(c) ((c&~STRIP)==0 && isdigit(c))

#else
# define gencpy(a,b) strcpy((char*)(a),(char*)(b))
# define genncpy(a,b,n) strncpy((char*)(a),(char*)(b),n)
# define genlen(str) strlen(str)
# define print(c) isprint(c)
# define isword(c) (isalnum(out[c]) || (out[c]=='_'))
# define digit(c) isdigit(c)
#endif /*SHOPT_MULTIBYTE */

typedef struct _emacs_
Expand Down Expand Up @@ -323,7 +325,7 @@ int ed_emacsread(void *context, int fd,char *buff,int scend, int reedit)
count = 1;
adjust = -1;
i = cur;
if(c!='\t' && c!=ESC && !isdigit(c))
if(c!='\t' && c!=ESC && !digit(c))
ep->ed->e_tabcount = 0;
switch(c)
{
Expand Down Expand Up @@ -782,7 +784,7 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
int digit,ch;
digit = 0;
value = 0;
while ((i=ed_getchar(ep->ed,0)),isdigit(i))
while ((i=ed_getchar(ep->ed,0)),digit(i))
{
value *= 10;
value += (i - '0');
Expand Down Expand Up @@ -1020,7 +1022,7 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
{
i=ed_getchar(ep->ed,0);
ed_ungetchar(ep->ed,i);
if(isdigit(i))
if(digit(i))
ed_ungetchar(ep->ed,ESC);
}
}
Expand Down

0 comments on commit 3f38f8a

Please sign in to comment.