ApacheSSHd用のカスタムファイルシステムクラスを書いています。get
クライアントが存在しないファイルを試したときに問題が発生しました。
私のオブジェクトはを返しますdoesExist() == false
。
これにより、サーバーはSSH_FXP_STATに応答してSSH_FX_NO_SUCH_FILEパケットを送信します。
OpenSSHクライアントを使用すると、これは正常に機能します。クライアントは「ファイル'/foo'が見つかりません」と報告します。
ただし、PSFTP(Putty SFTPクライアント)は要求をパイプライン処理するため、STATへの応答に関係なくOPENパケットを送信します。次に、結果のファイルハンドルにREADを送信します。これにより、現在、コードで例外が発生し、セッション全体が終了します。
存在しないファイルを読み取ろうとした場合、サーバーの応答はどうなりますか?
冗長性についてお詫び申し上げます。ここに問題のApacheコードがあります。私はそれを変更したくないのですが、私のクラスはここではSshFileの「ファイル」です。しかし、Apacheコードに間違いなくバグがある場合は、パッチを適用する必要があると思います。
if (version <= 4) {
String path = buffer.getString();
int pflags = buffer.getInt();
// attrs
try {
SshFile file = resolveFile(path);
if (file.doesExist()) {
if (((pflags & SSH_FXF_CREAT) != 0) && ((pflags & SSH_FXF_EXCL) != 0)) {
sendStatus(id, SSH_FX_FILE_ALREADY_EXISTS, path);
return;
}
} else {
if (((pflags & SSH_FXF_CREAT) != 0)) {
if (!file.isWritable()) {
sendStatus(id, SSH_FX_FAILURE, "Can not create " + path);
return;
}
file.create();
}
}
String acc = ((pflags & (SSH_FXF_READ | SSH_FXF_WRITE)) != 0 ? "r" : "") +
((pflags & SSH_FXF_WRITE) != 0 ? "w" : "");
if ((pflags & SSH_FXF_TRUNC) != 0) {
file.truncate();
}
String handle = UUID.randomUUID().toString();
handles.put(handle, new FileHandle(file, pflags)); // handle flags conversion
sendHandle(id, handle);
} catch (IOException e) {
sendStatus(id, SSH_FX_FAILURE, e.getMessage());
}