2011年8月 5日

[Namazu-devel-ja 1883] Re:Namazu 2.0.21がCentOS 6.0 64bitでnamazu-6に失敗する

At Fri, 05 Aug 2011 08:42:47 +0900,
NOKUBI Takatsugu wrote:
> 本来<bar, baz>となるべきところが<bar, bz">となってしまっているようで
> す。もう少し深追いしてみます。

原因が分かりました。nmz/search.cの中で、重なり合う領域内でstrcpyをし
ているのがいけませんでした。例えば以下のような感じです。

strcpy(expr, expr + 1);

このようなケースでは、結果は未定義と定義されているようです。

重なり合う領域でも動作することが保証されている、memmoveに書き換えて対
処してみました。make checkした限りは問題ありませんでした。差分を添付し
ます。

--- search.c 2011-08-05 09:26:47.000000000 +0900
+++ search.c.new 2011-08-05 09:32:25.000000000 +0900
@@ -572,7 +572,7 @@
{
if (*expr == '*' && expr[strlen(expr) - 1] != '*') {
/* If suffix match such as '*bar', enforce it into regex */
- strcpy(expr, expr + 1);
+ memmove(expr, expr + 1, strlen(expr));
escape_meta_characters(expr, BUFSIZE * 2);
strncat(expr, "$", BUFSIZE * 2 - strlen(expr) - 1);
expr[BUFSIZE * 2 - 1] = '\0';
@@ -584,7 +584,7 @@
expr[BUFSIZE * 2 - 1] = '\0';
} else if (*expr == '*' && expr[strlen(expr) - 1] == '*') {
/* If internal match such as '*foo*', enforce it into regex */
- strcpy(expr, expr + 1);
+ memmove(expr, expr + 1, strlen(expr));
expr[strlen(expr) - 1] = '\0';
escape_meta_characters(expr, BUFSIZE * 2);
} else if (*expr == '/' && expr[strlen(expr) - 1] == '/') {
@@ -592,7 +592,7 @@
nmz_debug_printf("do REGEX search\n");
/* Genuine regex */
/* Remove the both of '/' chars at begging and end of string */
- strcpy(expr, expr + 1);
+ memmove(expr, expr + 1, strlen(expr));
expr[strlen(expr) - 1]= '\0';
} else {
nmz_debug_printf("disabled REGEX search\n");
@@ -605,7 +605,7 @@
|| (*expr == '{' && expr[strlen(expr) - 1] == '}'))
{
/* Delimiters of field search */
- strcpy(expr, expr + 1);
+ memmove(expr, expr + 1, strlen(expr));
expr[strlen(expr) - 1] = '\0';
}
escape_meta_characters(expr, BUFSIZE * 2);
@@ -695,7 +695,7 @@
delete_beginning_backslash(char *str)
{
if (*str == '\\') {
- strcpy(str, str + 1);
+ memmove(str, str + 1, strlen(str));
}
}

@@ -935,7 +935,7 @@
if ((strlen(str) >= 3 && (*str == '"' && str[strlen(str) - 1] == '"'))
|| (*str == '{' && str[strlen(str) - 1] == '}'))
{
- strcpy(str, str + 1);
+ memmove(str , str + 1, strlen(str));
str[strlen(str) - 1]= '\0';
}
}

_______________________________________________
Namazu-devel-ja mailing list
Namazu-devel-ja@xxxxx
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-devel-ja


投稿者 xml-rpc : 2011年8月 5日 09:41
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/105830
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。