summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java15
1 files 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 29c5adaea844..b540b19f24dd 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);
}
}