From dd7ffddb26b5e75ef0a0127ef04e3f0c185c08ca Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Mon, 1 May 2023 23:04:27 +0000 Subject: [PATCH] Attempt to unlink session file if hardlink fails If either creating the link or changing the file permissions fails, the session should clean up the link so that a fallback manual copy can succeed. This can occur during APEX rollback. Bug: 274802935 Test: manual, follow steps in bug to test rollback mechanism Change-Id: Ic15bbe657a11a26b4bbcc48dca2f3e3a3f1239e2 --- .../server/pm/PackageInstallerSession.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 29c5adaea8440..b540b19f24dd9 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1633,13 +1633,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { throw new SecurityException("link() can only be run by the system"); } + final File target = new File(path); + final File source = new File(stageDir, target.getName()); + var sourcePath = source.getAbsolutePath(); try { - final File target = new File(path); - final File source = new File(stageDir, target.getName()); try { - Os.link(path, source.getAbsolutePath()); + Os.link(path, sourcePath); // Grant READ access for APK to be read successfully - Os.chmod(source.getAbsolutePath(), 0644); + Os.chmod(sourcePath, 0644); } catch (ErrnoException e) { e.rethrowAsIOException(); } @@ -1647,6 +1648,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { throw new IOException("Can't relabel file: " + source); } } catch (IOException e) { + try { + Os.unlink(sourcePath); + } catch (Exception ignored) { + Slog.d(TAG, "Failed to unlink session file: " + sourcePath); + } + throw ExceptionUtils.wrap(e); } }