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

Commit a946b9e2 authored by Tianjie Xu's avatar Tianjie Xu
Browse files

Fix the permission of stashed blocks created by updater

Our updater created the stashes with root permission. This causes an
access denial when the RecoverySystem service tries to clean up these
blocks after a failing update. As a result, the subsequent OTA updates
may fail due to insufficient cache space.

Bug: 36457133
Test: stashed blocks cleaned successfully after reboot
Change-Id: If0ca99638cdfa1033646f29d9cc92b5ff1bacac1
parent 110102f3
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@
#include <android-base/unique_fd.h>
#include <android-base/unique_fd.h>
#include <applypatch/applypatch.h>
#include <applypatch/applypatch.h>
#include <openssl/sha.h>
#include <openssl/sha.h>
#include <private/android_filesystem_config.h>
#include <ziparchive/zip_archive.h>
#include <ziparchive/zip_archive.h>


#include "edify/expr.h"
#include "edify/expr.h"
@@ -772,6 +773,11 @@ static int WriteStash(const std::string& base, const std::string& id, int blocks
        return -1;
        return -1;
    }
    }


    if (fchown(fd, AID_SYSTEM, AID_SYSTEM) != 0) {  // system user
        PLOG(ERROR) << "failed to chown \"" << fn << "\"";
        return -1;
    }

    if (write_all(fd, buffer, blocks * BLOCKSIZE) == -1) {
    if (write_all(fd, buffer, blocks * BLOCKSIZE) == -1) {
        return -1;
        return -1;
    }
    }
@@ -841,6 +847,12 @@ static int CreateStash(State* state, size_t maxblocks, const std::string& blockd
      return -1;
      return -1;
    }
    }


    if (chown(dirname.c_str(), AID_SYSTEM, AID_SYSTEM) != 0) {  // system user
      ErrorAbort(state, kStashCreationFailure, "chown \"%s\" failed: %s\n", dirname.c_str(),
                 strerror(errno));
      return -1;
    }

    if (CacheSizeCheck(max_stash_size) != 0) {
    if (CacheSizeCheck(max_stash_size) != 0) {
      ErrorAbort(state, kStashCreationFailure, "not enough space for stash (%zu needed)\n",
      ErrorAbort(state, kStashCreationFailure, "not enough space for stash (%zu needed)\n",
                 max_stash_size);
                 max_stash_size);