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]

Reply via email to