Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13885b73 authored by Martijn Coenen's avatar Martijn Coenen
Browse files

Use REPLACE_EXISTING for rename(2) workaround.

We implement a workaround for Os.rename() failing with EXDEV, by using
Files.move() instead. However, since we didn't pass in REPLACE_EXISTING
as an option, Files.move() would fail if the destination file already
existed. Since the semantics of rename(2) are to replace a file if it
already exists, the work-around should do the same; so pass the flag.

Also, log if the workaround throws an exception; that would have made
this easier to debug.

Bug: 151078664
Test: atest com.android.tests.fused.host.FuseDaemonHostTest#testRenameAndReplaceFile
Change-Id: Ie84e89f857c2cc71e3b373db2032f700d066cf6b
parent a8c6c8b1
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -201,6 +201,7 @@ import java.lang.reflect.Method;
import java.net.InetAddress;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -7413,8 +7414,10 @@ public final class ActivityThread extends ClientTransactionHandler {
                if (e.errno == OsConstants.EXDEV && oldPath.startsWith("/storage/")) {
                    Log.v(TAG, "Recovering failed rename " + oldPath + " to " + newPath);
                    try {
                        Files.move(new File(oldPath).toPath(), new File(newPath).toPath());
                        Files.move(new File(oldPath).toPath(), new File(newPath).toPath(),
                                StandardCopyOption.REPLACE_EXISTING);
                    } catch (IOException e2) {
                        Log.e(TAG, "Rename recovery failed ", e);
                        throw e;
                    }
                } else {