diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageInstallerSession.java | 15 |
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); } } |