[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bus error on backward search



返事が遅れて申し訳けありません。

In article <4556DA0F.3040700@xxxxxxxx>, NIIMI Satoshi <sa2c@xxxxxxxx> writes:

> (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 の比
> 較も必要になります。

ありがとうございます。このパッチ以下の ChangeLog で commit し
ました。

2006-11-17  NIIMI Satoshi  <sa2c@xxxxxxxx>  (tiny change)

	* search.c (simple_search): In the loop of backward searching,
	check also the byte position against the limit.


---
半田@AIST