1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#! /bin/sh -e
if [ $# -eq 3 -a "$2" = '-d' ]; then
pdir="-d $3"
elif [ $# -ne 1 ]; then
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
fi
case "$1" in
-patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;;
-unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;;
*)
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
esac
exit 0
READLINE PATCH REPORT
=====================
Readline-Release: 5.1
Patch-ID: readline51-001
Bug-Reported-by: Andreas Schwab <schwab@suse.de>
Bug-Reference-ID: <20051213141916.4014A394BFABD@sykes.suse.de>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2005-12/msg00038.html
Bug-Description:
A problem with the readline callback interface can result in segmentation
faults when using the delete-char function via a multiple-key sequence.
Two consecutive calls to delete-char will crash the application calling
readline.
Patch:
*** ../readline-5.1/readline.c Mon Jul 4 22:29:35 2005
--- lib/readline/readline.c Tue Dec 20 17:38:29 2005
***************
*** 715,719 ****
rl_dispatching = 1;
RL_SETSTATE(RL_STATE_DISPATCHING);
! r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
RL_UNSETSTATE(RL_STATE_DISPATCHING);
rl_dispatching = 0;
--- 715,719 ----
rl_dispatching = 1;
RL_SETSTATE(RL_STATE_DISPATCHING);
! (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
RL_UNSETSTATE(RL_STATE_DISPATCHING);
rl_dispatching = 0;
*** ../readline-5.1/text.c Sat Sep 24 19:06:07 2005
--- lib/readline/text.c Tue Dec 20 17:38:26 2005
***************
*** 1072,1077 ****
int count, key;
{
- int r;
-
if (count < 0)
return (_rl_rubout_char (-count, key));
--- 1072,1075 ----
***************
*** 1091,1097 ****
rl_forward_byte (count, key);
! r = rl_kill_text (orig_point, rl_point);
rl_point = orig_point;
- return r;
}
else
--- 1089,1094 ----
rl_forward_byte (count, key);
! rl_kill_text (orig_point, rl_point);
rl_point = orig_point;
}
else
***************
*** 1100,1105 ****
new_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
! return (rl_delete_text (rl_point, new_point));
}
}
--- 1097,1103 ----
new_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
! rl_delete_text (rl_point, new_point);
}
+ return 0;
}
|