Article delegate-ja/596 of [1-661] on the server localhost:119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
[Reference:<_A583@delegate-ja.ML_>]
Newsgroups: mail-lists.delegate-ja

[DeleGate-Ja] Re: delegateのFTPについて
03 Jun 2014 05:04:59 GMT ysato@delegate.org (Yutaka Sato)
The DeleGate Project


長倉様

的確な問題指摘をありがとうございました。
ご指摘の問題ですが、1999年10月頃に version 6.0.0 で作り込まれたまま、
潜伏していたようです。6.0.0 では FTP の MOUNT について大幅な拡張・
修正が行われた模様で、DeleGate の CHANGELOG を見ても、どの変更の
ための変更だったのか判然としません。ただ、当時 FTP のマウントに
ついては開発途上で色々な問題に対処する中で、できる限りカレント
ディレクトリからの相対パスでの参照で済ませ、絶対パスの場合に
起こり得る問題を回避しようとした試みであったように思われます。
その後 FTP の MOUNT はかなり安定しましたので、この試みは盲腸化した
ものとも思われます。

In message <_A583@delegate-ja.ML_> on 04/28/14(00:26:00)
you Kenji Nagakura <pi4babrv6-mlee2cg2alrr.ml@ml.delegate.org> wrote:
 |以下の構成でdelegateを使用させていただいております。
...
 |SERVER=ftp
 |MOUNT="/* ftp://FTPサーバIPアドレス/*"
...
 |FTPクライアントからdelegateサーバの21ポートへアクセスし、
 |別のFTPサーバの21番ポートに接続しております。
 |その際、以下のようなコマンドを実行するとエラーとなります。
...
 |どうやら、aaaまでは自身のパスとして認識し、aaaaaと認識できていないように
 |見受けられます。また、aaaディレクトリにaaディレクトリを作成すると、
 |そこに格納されます。
 |指定した対象のディレクトリ[aaaaa]を参照するように出来ませんでしょうか。

ご指摘の通りの現象が起きます。
MOUNT を行う場合に DeleGate は、"../" のようなパス名の指定を一旦正規化
してから書き換え処理しましすが、その際に問題が発生しています。
原因は、RETR や STOR の引数を、現在のディレクトリからの相対パスにしよう
とする試みの中、たまたま現在のディレクトリ名が当該パス名の部分文字列で
ある場合に、誤って相対パスにしてしまっていることにあります。
ですので、同封のパッチのように修正します。9.9.9 に反映させる予定です。

旧来の版での回避方法としましては、このケースのように、サーバが一つ
だけでパス名の書き換えも行わない場合に限り、

  SERVER=ftp://FTPサーバ

のようにすると良いです。この場合 DeleGate はパス名の解釈を行いません。

                   9 9  
┌─┐┬┌──┬┐ //\^^ ( e ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_<   >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@ITRI.産総研

*** orig/src/ftp.c	Tue May  6 22:23:06 2014
--- ./src/ftp.c	Tue Jun  3 13:09:45 2014
***************
*** 1335,1344 ****
--- 1335,1352 ----
  		up++;
  	}
  	while( *cp == '/' ) cp++;
+ 
+     if( *cwd == 0 && *upath != '/' || *cp == 0 && *up == '/' ){
+ 	/* v9.9.9 fix-140603a -- only if relative from cur. dir. (v6.0.0) */
+ 	sv1log("--- relative [%s][%s] -> [%s][%s]\n",cwd,upath,cp,up);
+ 
  	while( *up == '/' ) up++;
  
+ 	/*
  	if( *cp == 0 )
+ 	*/
  		strcpy(rpath,up);
+     }
  	else{
  		/* absolute path in the target server: LoginDir/UrlPath */
  		strcpy(rpath,FS->fs_logindir);

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V