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

[cvs-ml 661] Re: 解決(たぶん) - WinCvs11b13_sjis_knjwrp20000522でdiff できない



中口です。


Hiroshi Kato wrote:
> ソースを追いかけている暇がないので直観ですが,xrealloc ではなく realloc を
> 修正するとうまくいってしまうということないですか?
> 確か,WinCVS では realloc の方は実際にはガベージコレクタ対応のマクロに
> なっていたと思います.
> xrealloc のコードを使うならどこかで free() してやらないとダメなような気が...

realloc を使って修正ということでしょうか?

rcscmds.c の 495 行目に
> tmpfile3 = xrealloc (tmpfile3, strlen (tmpfile3) + strlen (workfile));
というコードがあったので、これに従って xrealloc を使いました。

free のことは特に意識していなかったのですが、探してみたところ、
上記 tmpfile3 についても、また、追加した xrealloc の戻り値を入れた
tmpfile1、tmpfile2 についても free しているところがありました。
だから問題なく動いたのか。


で、cvs2ntlib.dll をビルドしてみたところ、落ちないようになりました。
以下、問題のまとめです。

[問題]
WinCVS をローカルで使い、長いファイル名(hogehogehogehogehogehoge.cpp など)
の diff を実行すると、不正アクセスで終了する。

[対処(diff のログ)]
cvs -q diff -c -r 1.1 -r 1.2 rcscmds.c 
Index: rcscmds.c
===================================================================
RCS file: d:\cvsrepository/rcscmds/rcscmds.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c -r1.1 -r1.2
*** rcscmds.c	2000/07/12 03:05:05	1.1
--- rcscmds.c	2000/07/12 03:06:46	1.2
***************
*** 421,426 ****
--- 421,427 ----
      tmpfile2 = NULL;
      tmpfile3 = NULL;
  
+     tmpfile1 = xrealloc (tmpfile1, strlen (tmpfile1) + strlen (workfile) + 1);
      strcat(tmpfile1, workfile);
    
      cvs_output ("\
***************
*** 465,470 ****
--- 466,472 ----
  	cvs_output (rev2, 0);
  	cvs_output ("\n", 1);
  
+     tmpfile2 = xrealloc (tmpfile2, strlen (tmpfile2) + strlen (workfile) + 1);
      strcat(tmpfile2, workfile);
  	status = RCS_checkout (rcsfile, NULL, rev2, NULL, options,
  			       tmpfile2, (RCSCHECKOUTPROC)0, NULL);

*****CVS exited normally with code 1*****


変更を適用して、cvs2ntlib を再構築(WinCVS.exe)。cvsntdos を再構築(cvs.exe)。

xrealloc 内の "+ 1" ですが、ほかのところでは +1 していないので、いらないのかも
知れません。ヌルターミネータ('\0') 用の領域も用意しようと思って書いてますが。


Takao Nakaguchi
tnakagu@hip.atr.co.jp