[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 / 新見 覚志