Package: bash Version: 3.0-16 Severity: minor Tags: patch M-b, M-f, M-u, M-l and other keys strokes do not work properly with non-English input when bash works as an interactive shell.
This is because isalpha, isalnum,... tolower and toupper function handles correctly only ASCII characters. Another bug is in that '(char) 255' is passed to all these functions. Because 'char == signed char', '(char) 255' is treated as -1 which is equal to EOF constant. As a result, when working in CP1251 coding system, the russian charter YA is processed incorrectly. The coding system KOI8-R is also affected. The patch below fixes these bugs. Please forward it to upstream. diff -Nurb bash-3.0.orig/bash/include/chartypes.h bash-3.0/bash/include/chartypes.h --- bash-3.0.orig/bash/include/chartypes.h 2002-04-03 16:32:22.000000000 +0300 +++ bash-3.0/bash/include/chartypes.h 2005-09-21 12:35:13.000000000 +0300 @@ -22,6 +22,7 @@ #define _SH_CHARTYPES_H #include <ctype.h> +#include "shmbutil.h" /* Jim Meyering writes: @@ -50,15 +51,15 @@ #endif #if defined (isblank) || defined (HAVE_ISBLANK) -# define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (c)) +# define ISBLANK(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isblank ((unsigned char) c)) #else # define ISBLANK(c) ((c) == ' ' || (c) == '\t') #endif #if defined (isgraph) || defined (HAVE_ISGRAPH) -# define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (c)) +# define ISGRAPH(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isgraph ((unsigned char) c)) #else -# define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (c) && !isspace (c)) +# define ISGRAPH(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isprint ((unsigned char) c) && !isspace ((unsigned char) c)) #endif #if !defined (isxdigit) && !defined (HAVE_ISXDIGIT) @@ -67,16 +68,16 @@ #undef ISPRINT -#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) -#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) -#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c)) -#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c)) -#define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c)) -#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c)) -#define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c)) -#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c)) -#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c)) -#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c)) +#define ISPRINT(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isprint ((unsigned char) c)) +#define ISDIGIT(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isdigit ((unsigned char) c)) +#define ISALNUM(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isalnum ((unsigned char) c)) +#define ISALPHA(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isalpha ((unsigned char) c)) +#define ISCNTRL(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && iscntrl ((unsigned char) c)) +#define ISLOWER(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && islower ((unsigned char) c)) +#define ISPUNCT(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && ispunct ((unsigned char) c)) +#define ISSPACE(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isspace ((unsigned char) c)) +#define ISUPPER(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isupper ((unsigned char) c)) +#define ISXDIGIT(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isxdigit ((unsigned char) c)) #define ISLETTER(c) (ISALPHA(c)) @@ -97,8 +98,8 @@ #define TODIGIT(c) ((c) - '0') #define TOCHAR(c) ((c) + '0') -#define TOLOWER(c) (ISUPPER(c) ? tolower(c) : (c)) -#define TOUPPER(c) (ISLOWER(c) ? toupper(c) : (c)) +#define TOLOWER(c) (ISUPPER(c) ? tolower((unsigned char) c) : ((unsigned char) c)) +#define TOUPPER(c) (ISLOWER(c) ? toupper((unsigned char) c) : ((unsigned char) c)) #ifndef TOCTRL /* letter to control char -- ASCII. The TOUPPER is in there so \ce and diff -Nurb bash-3.0.orig/bash/lib/readline/chardefs.h bash-3.0/bash/lib/readline/chardefs.h --- bash-3.0.orig/bash/lib/readline/chardefs.h 2003-02-02 00:43:47.000000000 +0200 +++ bash-3.0/bash/lib/readline/chardefs.h 2005-09-21 12:25:25.000000000 +0300 @@ -24,6 +24,7 @@ #define _CHARDEFS_H_ #include <ctype.h> +#include "rlmbutil.h" #if defined (HAVE_CONFIG_H) # if defined (HAVE_STRING_H) @@ -86,24 +87,24 @@ /* Some systems define these; we want our definitions. */ #undef ISPRINT -#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c)) -#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c)) -#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) -#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c)) -#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) -#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c)) -#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c)) +#define ISALNUM(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isalnum ((unsigned char) c)) +#define ISALPHA(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isalpha ((unsigned char) c)) +#define ISDIGIT(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isdigit ((unsigned char) c)) +#define ISLOWER(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && islower ((unsigned char) c)) +#define ISPRINT(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isprint ((unsigned char) c)) +#define ISUPPER(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isupper ((unsigned char) c)) +#define ISXDIGIT(c) ((MB_CUR_MAX == 1 || IN_CTYPE_DOMAIN (c)) && isxdigit ((unsigned char) c)) -#define _rl_lowercase_p(c) (NON_NEGATIVE(c) && ISLOWER(c)) -#define _rl_uppercase_p(c) (NON_NEGATIVE(c) && ISUPPER(c)) +#define _rl_lowercase_p(c) (ISLOWER(c)) +#define _rl_uppercase_p(c) (ISUPPER(c)) #define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') -#define _rl_pure_alphabetic(c) (NON_NEGATIVE(c) && ISALPHA(c)) -#define ALPHABETIC(c) (NON_NEGATIVE(c) && ISALNUM(c)) +#define _rl_pure_alphabetic(c) (ISALPHA(c)) +#define ALPHABETIC(c) (ISALNUM(c)) #ifndef _rl_to_upper -# define _rl_to_upper(c) (_rl_lowercase_p(c) ? toupper((unsigned char)c) : (c)) -# define _rl_to_lower(c) (_rl_uppercase_p(c) ? tolower((unsigned char)c) : (c)) +# define _rl_to_upper(c) (_rl_lowercase_p(c) ? toupper((unsigned char)c) : ((unsigned char) c)) +# define _rl_to_lower(c) (_rl_uppercase_p(c) ? tolower((unsigned char)c) : ((unsigned char) c)) #endif #ifndef _rl_digit_value -- System Information: Debian Release: testing/unstable APT prefers testing APT policy: (500, 'testing') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/dash Kernel: Linux 2.6.11-1-686 Locale: LANG=ru_RU.CP1251, LC_CTYPE=ru_RU.CP1251 (charmap=CP1251) Versions of packages bash depends on: ii base-files 3.1.5 Debian base system miscellaneous f ii libc6 2.3.5-6 GNU C Library: Shared libraries an ii libncurses5 5.4-9 Shared libraries for terminal hand ii passwd 1:4.0.3-35 change and administer password and bash recommends no packages. -- no debconf information -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]