[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Bus error on backward search
新見と申します。
先日お送りした表記の件について、もう少し詳しく調べてみました。
(with-temp-buffer
(let ((case-fold-search t))
(insert "abcd")
(goto-char (point-max))
(search-backward "iテスト" nil t)))
これを評価すると
simple_search (n=-1, pat="iテスト", len=4, len_byte=10, trt,
pos=5, pos_byte=5, lim=1, lim_byte=1)
このような呼び出しがされます。そうすると src/search.c
1512: int this_pos_byte = pos_byte - len_byte;
ここで this_pos_byte = -5 となり、
1526: buf_ch = STRING_CHAR_AND_LENGTH (BYTE_POS_ADDR (this_pos_byte),
1527: ZV_BYTE - this_pos_byte,
1528: buf_charlen);
ここでバッファ外にアクセスしてしまいます。検索文字列に含まれるマルチバイ
ト文字が多いと len と len_byte の差が大きくなり、バスエラーを引き起こし
ているようです。
これを防ぐためには、先日のパッチのように this_pos_byte と lim_byte の比
較も必要になります。
念のため、もう一度パッチをお送りします。
Index: src/search.c
===================================================================
RCS file: /sources/emacs/emacs/src/search.c,v
retrieving revision 1.217
diff -u -c -r1.217 search.c
*** src/search.c 3 Oct 2006 13:47:26 -0000 1.217
--- src/search.c 1 Nov 2006 08:59:04 -0000
***************
*** 1514,1520 ****
int this_len_byte = len_byte;
unsigned char *p = pat;
! if (pos - len < lim)
goto stop;
while (this_len > 0)
--- 1514,1520 ----
int this_len_byte = len_byte;
unsigned char *p = pat;
! if (this_pos < lim || this_pos_byte < lim_byte)
goto stop;
while (this_len > 0)
--
NIIMI Satoshi / 新見 覚志