DirectoryNotEmptyException when moving symlink with REPLACE_EXISTING set

Aperta
#177 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
java

Direzione di ricerca

Inizia da CryptoFileSystemImpl.moveSymlink intorno alla riga 585 e riproduci la chiamata Files.move fornita con REPLACE_EXISTING, usando sia JIMFS sia un filesystem normale come descritto. Segui i percorsi ciphertextSource e ciphertextTarget attraverso lo stack di spostamento ed eliminazione; il lavoro è completato quando lo spostamento di un symlink sopra un altro riesce senza DirectoryNotEmptyException e la regressione è coperta da un test.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Moving a symlink (on top of another symlink) causes a DirectoryNotEmptyException:

var source = fs.getPath("/source");
var target = fs.getPath("/target");
Files.createSymbolicLink(source, fs.getPath("/linkedBySource.txt"));
Files.createSymbolicLink(target, fs.getPath("/linkedByTarget.txt"));

Assertions.assertDoesNotThrow(() -> Files.move(source, target, REPLACE_EXISTING));

Stacktrace:

java.nio.file.DirectoryNotEmptyException: /vault/d/FW/62AD46Y3CLSPBJCAZTO2EQD5TDALWH/y6Yo0PGakzpfU2ZozQWLcHrgiT8=.c9s
	at com.google.common.jimfs.FileSystemView.checkEmpty(FileSystemView.java:493)
	at com.google.common.jimfs.FileSystemView.checkDeletable(FileSystemView.java:477)
	at com.google.common.jimfs.FileSystemView.delete(FileSystemView.java:449)
	at com.google.common.jimfs.FileSystemView.copy(FileSystemView.java:539)
	at com.google.common.jimfs.JimfsFileSystemProvider.copy(JimfsFileSystemProvider.java:268)
	at com.google.common.jimfs.JimfsFileSystemProvider.move(JimfsFileSystemProvider.java:273)
	at java.base/java.nio.file.Files.move(Files.java:1432)
	at org.cryptomator.cryptofs/org.cryptomator.cryptofs.CryptoFileSystemImpl.moveSymlink(CryptoFileSystemImpl.java:585)
	at org.cryptomator.cryptofs/org.cryptomator.cryptofs.CryptoFileSystemImpl.move(CryptoFileSystemImpl.java:573)
	at org.cryptomator.cryptofs/org.cryptomator.cryptofs.MoveOperation.move(MoveOperation.java:37)
	at org.cryptomator.cryptofs/org.cryptomator.cryptofs.CryptoFileSystemProvider.move(CryptoFileSystemProvider.java:255)
	at java.base/java.nio.file.Files.move(Files.java:1432)

The same happens when using a regular filesystem instead of JIMFS.

org.cryptomator.cryptofs/org.cryptomator.cryptofs.CryptoFileSystemImpl.moveSymlink(CryptoFileSystemImpl.java:585):

CiphertextFilePath ciphertextSource = cryptoPathMapper.getCiphertextFilePath(cleartextSource);
CiphertextFilePath ciphertextTarget = cryptoPathMapper.getCiphertextFilePath(cleartextTarget);
try (OpenCryptoFiles.TwoPhaseMove twoPhaseMove = openCryptoFiles.prepareMove(ciphertextSource.getRawPath(), ciphertextTarget.getRawPath())) {
	Files.move(ciphertextSource.getRawPath(), ciphertextTarget.getRawPath(), options); //585
	if (ciphertextTarget.isShortened()) {
		ciphertextTarget.persistLongFileName();
	} else {
		Files.deleteIfExists(ciphertextTarget.getInflatedNamePath()); // no longer needed if not shortened
	}
	twoPhaseMove.commit();
}

Tests showed that both ciphertextSource.getRawPath() and ciphertextTarget.getRawPath() are directories, not regular files. I assume the problem is related to this.

Lingua principale
Java
Stelle
110
Fork
39
Merge medio
1g 28m
PR unite (30g)
4

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di cryptomator/cryptofs

Tutte le issue di cryptomator/cryptofs

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.