Merge "EXT4_FEATURE_COMPAT_STABLE_INODES from ext4.h"
diff --git a/fastboot/constants.h b/fastboot/constants.h
index 4ea68da..b732c76 100644
--- a/fastboot/constants.h
+++ b/fastboot/constants.h
@@ -79,3 +79,4 @@
#define FB_VAR_SECURITY_PATCH_LEVEL "security-patch-level"
#define FB_VAR_TREBLE_ENABLED "treble-enabled"
#define FB_VAR_MAX_FETCH_SIZE "max-fetch-size"
+#define FB_VAR_DMESG "dmesg"
diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp
index 0f3a208..524196c 100644
--- a/fastboot/device/commands.cpp
+++ b/fastboot/device/commands.cpp
@@ -112,52 +112,65 @@
}
}
-bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args) {
- const std::unordered_map<std::string, VariableHandlers> kVariableMap = {
- {FB_VAR_VERSION, {GetVersion, nullptr}},
- {FB_VAR_VERSION_BOOTLOADER, {GetBootloaderVersion, nullptr}},
- {FB_VAR_VERSION_BASEBAND, {GetBasebandVersion, nullptr}},
- {FB_VAR_VERSION_OS, {GetOsVersion, nullptr}},
- {FB_VAR_VERSION_VNDK, {GetVndkVersion, nullptr}},
- {FB_VAR_PRODUCT, {GetProduct, nullptr}},
- {FB_VAR_SERIALNO, {GetSerial, nullptr}},
- {FB_VAR_VARIANT, {GetVariant, nullptr}},
- {FB_VAR_SECURE, {GetSecure, nullptr}},
- {FB_VAR_UNLOCKED, {GetUnlocked, nullptr}},
- {FB_VAR_MAX_DOWNLOAD_SIZE, {GetMaxDownloadSize, nullptr}},
- {FB_VAR_CURRENT_SLOT, {::GetCurrentSlot, nullptr}},
- {FB_VAR_SLOT_COUNT, {GetSlotCount, nullptr}},
- {FB_VAR_HAS_SLOT, {GetHasSlot, GetAllPartitionArgsNoSlot}},
- {FB_VAR_SLOT_SUCCESSFUL, {GetSlotSuccessful, nullptr}},
- {FB_VAR_SLOT_UNBOOTABLE, {GetSlotUnbootable, nullptr}},
- {FB_VAR_PARTITION_SIZE, {GetPartitionSize, GetAllPartitionArgsWithSlot}},
- {FB_VAR_PARTITION_TYPE, {GetPartitionType, GetAllPartitionArgsWithSlot}},
- {FB_VAR_IS_LOGICAL, {GetPartitionIsLogical, GetAllPartitionArgsWithSlot}},
- {FB_VAR_IS_USERSPACE, {GetIsUserspace, nullptr}},
- {FB_VAR_OFF_MODE_CHARGE_STATE, {GetOffModeChargeState, nullptr}},
- {FB_VAR_BATTERY_VOLTAGE, {GetBatteryVoltage, nullptr}},
- {FB_VAR_BATTERY_SOC_OK, {GetBatterySoCOk, nullptr}},
- {FB_VAR_HW_REVISION, {GetHardwareRevision, nullptr}},
- {FB_VAR_SUPER_PARTITION_NAME, {GetSuperPartitionName, nullptr}},
- {FB_VAR_SNAPSHOT_UPDATE_STATUS, {GetSnapshotUpdateStatus, nullptr}},
- {FB_VAR_CPU_ABI, {GetCpuAbi, nullptr}},
- {FB_VAR_SYSTEM_FINGERPRINT, {GetSystemFingerprint, nullptr}},
- {FB_VAR_VENDOR_FINGERPRINT, {GetVendorFingerprint, nullptr}},
- {FB_VAR_DYNAMIC_PARTITION, {GetDynamicPartition, nullptr}},
- {FB_VAR_FIRST_API_LEVEL, {GetFirstApiLevel, nullptr}},
- {FB_VAR_SECURITY_PATCH_LEVEL, {GetSecurityPatchLevel, nullptr}},
- {FB_VAR_TREBLE_ENABLED, {GetTrebleEnabled, nullptr}},
- {FB_VAR_MAX_FETCH_SIZE, {GetMaxFetchSize, nullptr}},
- };
+const std::unordered_map<std::string, VariableHandlers> kVariableMap = {
+ {FB_VAR_VERSION, {GetVersion, nullptr}},
+ {FB_VAR_VERSION_BOOTLOADER, {GetBootloaderVersion, nullptr}},
+ {FB_VAR_VERSION_BASEBAND, {GetBasebandVersion, nullptr}},
+ {FB_VAR_VERSION_OS, {GetOsVersion, nullptr}},
+ {FB_VAR_VERSION_VNDK, {GetVndkVersion, nullptr}},
+ {FB_VAR_PRODUCT, {GetProduct, nullptr}},
+ {FB_VAR_SERIALNO, {GetSerial, nullptr}},
+ {FB_VAR_VARIANT, {GetVariant, nullptr}},
+ {FB_VAR_SECURE, {GetSecure, nullptr}},
+ {FB_VAR_UNLOCKED, {GetUnlocked, nullptr}},
+ {FB_VAR_MAX_DOWNLOAD_SIZE, {GetMaxDownloadSize, nullptr}},
+ {FB_VAR_CURRENT_SLOT, {::GetCurrentSlot, nullptr}},
+ {FB_VAR_SLOT_COUNT, {GetSlotCount, nullptr}},
+ {FB_VAR_HAS_SLOT, {GetHasSlot, GetAllPartitionArgsNoSlot}},
+ {FB_VAR_SLOT_SUCCESSFUL, {GetSlotSuccessful, nullptr}},
+ {FB_VAR_SLOT_UNBOOTABLE, {GetSlotUnbootable, nullptr}},
+ {FB_VAR_PARTITION_SIZE, {GetPartitionSize, GetAllPartitionArgsWithSlot}},
+ {FB_VAR_PARTITION_TYPE, {GetPartitionType, GetAllPartitionArgsWithSlot}},
+ {FB_VAR_IS_LOGICAL, {GetPartitionIsLogical, GetAllPartitionArgsWithSlot}},
+ {FB_VAR_IS_USERSPACE, {GetIsUserspace, nullptr}},
+ {FB_VAR_OFF_MODE_CHARGE_STATE, {GetOffModeChargeState, nullptr}},
+ {FB_VAR_BATTERY_VOLTAGE, {GetBatteryVoltage, nullptr}},
+ {FB_VAR_BATTERY_SOC_OK, {GetBatterySoCOk, nullptr}},
+ {FB_VAR_HW_REVISION, {GetHardwareRevision, nullptr}},
+ {FB_VAR_SUPER_PARTITION_NAME, {GetSuperPartitionName, nullptr}},
+ {FB_VAR_SNAPSHOT_UPDATE_STATUS, {GetSnapshotUpdateStatus, nullptr}},
+ {FB_VAR_CPU_ABI, {GetCpuAbi, nullptr}},
+ {FB_VAR_SYSTEM_FINGERPRINT, {GetSystemFingerprint, nullptr}},
+ {FB_VAR_VENDOR_FINGERPRINT, {GetVendorFingerprint, nullptr}},
+ {FB_VAR_DYNAMIC_PARTITION, {GetDynamicPartition, nullptr}},
+ {FB_VAR_FIRST_API_LEVEL, {GetFirstApiLevel, nullptr}},
+ {FB_VAR_SECURITY_PATCH_LEVEL, {GetSecurityPatchLevel, nullptr}},
+ {FB_VAR_TREBLE_ENABLED, {GetTrebleEnabled, nullptr}},
+ {FB_VAR_MAX_FETCH_SIZE, {GetMaxFetchSize, nullptr}},
+};
+static bool GetVarAll(FastbootDevice* device) {
+ for (const auto& [name, handlers] : kVariableMap) {
+ GetAllVars(device, name, handlers);
+ }
+ return true;
+}
+
+const std::unordered_map<std::string, std::function<bool(FastbootDevice*)>> kSpecialVars = {
+ {"all", GetVarAll},
+ {"dmesg", GetDmesg},
+};
+
+bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args) {
if (args.size() < 2) {
return device->WriteFail("Missing argument");
}
- // Special case: return all variables that we can.
- if (args[1] == "all") {
- for (const auto& [name, handlers] : kVariableMap) {
- GetAllVars(device, name, handlers);
+ // "all" and "dmesg" are multiline and handled specially.
+ auto found_special = kSpecialVars.find(args[1]);
+ if (found_special != kSpecialVars.end()) {
+ if (!found_special->second(device)) {
+ return false;
}
return device->WriteOkay("");
}
diff --git a/fastboot/device/variables.cpp b/fastboot/device/variables.cpp
index 0cf4699..0de00b1 100644
--- a/fastboot/device/variables.cpp
+++ b/fastboot/device/variables.cpp
@@ -17,6 +17,7 @@
#include "variables.h"
#include <inttypes.h>
+#include <stdio.h>
#include <android-base/file.h>
#include <android-base/logging.h>
@@ -28,6 +29,7 @@
#include <fs_mgr.h>
#include <liblp/liblp.h>
+#include "constants.h"
#include "fastboot_device.h"
#include "flashing.h"
#include "utility.h"
@@ -46,6 +48,7 @@
using ::android::hardware::fastboot::V1_0::Status;
using IBootControl1_1 = ::android::hardware::boot::V1_1::IBootControl;
using namespace android::fs_mgr;
+using namespace std::string_literals;
constexpr char kFastbootProtocolVersion[] = "0.4";
@@ -518,3 +521,36 @@
*message = android::base::StringPrintf("0x%X", kMaxFetchSizeDefault);
return true;
}
+
+bool GetDmesg(FastbootDevice* device) {
+ if (GetDeviceLockStatus()) {
+ return device->WriteFail("Cannot use when device flashing is locked");
+ }
+
+ std::unique_ptr<FILE, decltype(&::fclose)> fp(popen("/system/bin/dmesg", "re"), ::fclose);
+ if (!fp) {
+ PLOG(ERROR) << "popen /system/bin/dmesg";
+ return device->WriteFail("Unable to run dmesg: "s + strerror(errno));
+ }
+
+ ssize_t rv;
+ size_t n = 0;
+ char* str = nullptr;
+ while ((rv = ::getline(&str, &n, fp.get())) > 0) {
+ if (str[rv - 1] == '\n') {
+ rv--;
+ }
+ device->WriteInfo(std::string(str, rv));
+ }
+
+ int saved_errno = errno;
+ ::free(str);
+
+ if (rv < 0 && saved_errno) {
+ LOG(ERROR) << "dmesg getline: " << strerror(saved_errno);
+ device->WriteFail("Unable to read dmesg: "s + strerror(saved_errno));
+ return false;
+ }
+
+ return true;
+}
diff --git a/fastboot/device/variables.h b/fastboot/device/variables.h
index f40a025..aa4d9fc 100644
--- a/fastboot/device/variables.h
+++ b/fastboot/device/variables.h
@@ -83,6 +83,9 @@
bool GetMaxFetchSize(FastbootDevice* /* device */, const std::vector<std::string>& /* args */,
std::string* message);
+// Complex cases.
+bool GetDmesg(FastbootDevice* device);
+
// Helpers for getvar all.
std::vector<std::vector<std::string>> GetAllPartitionArgsWithSlot(FastbootDevice* device);
std::vector<std::vector<std::string>> GetAllPartitionArgsNoSlot(FastbootDevice* device);
diff --git a/fs_mgr/fs_mgr_fstab.cpp b/fs_mgr/fs_mgr_fstab.cpp
index 06368b8..08200f6 100644
--- a/fs_mgr/fs_mgr_fstab.cpp
+++ b/fs_mgr/fs_mgr_fstab.cpp
@@ -539,6 +539,20 @@
return false;
}
+template <typename Pred>
+std::vector<FstabEntry*> GetEntriesByPred(Fstab* fstab, const Pred& pred) {
+ if (fstab == nullptr) {
+ return {};
+ }
+ std::vector<FstabEntry*> entries;
+ for (auto&& entry : *fstab) {
+ if (pred(entry)) {
+ entries.push_back(&entry);
+ }
+ }
+ return entries;
+}
+
} // namespace
bool ParseFstabFromString(const std::string& fstab_str, bool proc_mounts, Fstab* fstab_out) {
@@ -614,11 +628,7 @@
userdata = BuildDsuUserdataFstabEntry();
}
- if (EraseFstabEntry(fstab, "/data")) {
- fstab->emplace_back(userdata);
- }
-
- // Convert others
+ // Convert RO partitions.
for (auto&& partition : dsu_partitions) {
if (!EndsWith(partition, gsi::kDsuPostfix)) {
continue;
@@ -638,47 +648,58 @@
// vendor_gsi for vendor
std::string lp_name = partition.substr(0, partition.length() - strlen(gsi::kDsuPostfix));
std::string mount_point = "/" + lp_name;
- std::vector<FstabEntry*> entries = GetEntriesForMountPoint(fstab, mount_point);
- if (entries.empty()) {
- FstabEntry entry = {
- .blk_device = partition,
- // .logical_partition_name is required to look up AVB Hashtree descriptors.
- .logical_partition_name = "system",
- .mount_point = mount_point,
- .fs_type = "ext4",
- .flags = MS_RDONLY,
- .fs_options = "barrier=1",
- .avb_keys = kDsuKeysDir,
- };
- entry.fs_mgr_flags.wait = true;
- entry.fs_mgr_flags.logical = true;
- entry.fs_mgr_flags.first_stage_mount = true;
- fstab->emplace_back(entry);
- } else {
- // If the corresponding partition exists, transform all its Fstab
- // by pointing .blk_device to the DSU partition.
- for (auto&& entry : entries) {
- entry->blk_device = partition;
- // AVB keys for DSU should always be under kDsuKeysDir.
- entry->avb_keys = kDsuKeysDir;
- entry->fs_mgr_flags.logical = true;
- }
- // Make sure the ext4 is included to support GSI.
- auto partition_ext4 =
- std::find_if(fstab->begin(), fstab->end(), [&](const auto& entry) {
- return entry.mount_point == mount_point && entry.fs_type == "ext4";
- });
- if (partition_ext4 == fstab->end()) {
- auto new_entry = *GetEntryForMountPoint(fstab, mount_point);
- new_entry.fs_type = "ext4";
- auto it = std::find_if(fstab->rbegin(), fstab->rend(),
- [&mount_point](const auto& entry) {
- return entry.mount_point == mount_point;
- });
- auto end_of_mount_point_group = fstab->begin() + std::distance(it, fstab->rend());
- fstab->insert(end_of_mount_point_group, new_entry);
+
+ // List of fs_type entries we're lacking, need to synthesis these later.
+ std::vector<std::string> lack_fs_list = {"ext4", "erofs"};
+
+ // Only support early mount (first_stage_mount) partitions.
+ auto pred = [&mount_point](const FstabEntry& entry) {
+ return entry.fs_mgr_flags.first_stage_mount && entry.mount_point == mount_point;
+ };
+
+ // Transform all matching entries and assume they are all adjacent for simplicity.
+ for (auto&& entry : GetEntriesByPred(fstab, pred)) {
+ // .blk_device is replaced with the DSU partition.
+ entry->blk_device = partition;
+ // .avb_keys hints first_stage_mount to load the chained-vbmeta image from partition
+ // footer. See aosp/932779 for more details.
+ entry->avb_keys = kDsuKeysDir;
+ // .logical_partition_name is required to look up AVB Hashtree descriptors.
+ entry->logical_partition_name = lp_name;
+ entry->fs_mgr_flags.logical = true;
+ entry->fs_mgr_flags.slot_select = false;
+ entry->fs_mgr_flags.slot_select_other = false;
+
+ if (auto it = std::find(lack_fs_list.begin(), lack_fs_list.end(), entry->fs_type);
+ it != lack_fs_list.end()) {
+ lack_fs_list.erase(it);
}
}
+
+ if (!lack_fs_list.empty()) {
+ // Insert at the end of the existing mountpoint group, or at the end of fstab.
+ // We assume there is at most one matching mountpoint group, which is the common case.
+ auto it = std::find_if_not(std::find_if(fstab->begin(), fstab->end(), pred),
+ fstab->end(), pred);
+ for (const auto& fs_type : lack_fs_list) {
+ it = std::next(fstab->insert(it, {.blk_device = partition,
+ .logical_partition_name = lp_name,
+ .mount_point = mount_point,
+ .fs_type = fs_type,
+ .flags = MS_RDONLY,
+ .avb_keys = kDsuKeysDir,
+ .fs_mgr_flags{
+ .wait = true,
+ .logical = true,
+ .first_stage_mount = true,
+ }}));
+ }
+ }
+ }
+
+ // Always append userdata last for stable ordering.
+ if (EraseFstabEntry(fstab, "/data")) {
+ fstab->emplace_back(userdata);
}
}
diff --git a/fs_mgr/tests/fs_mgr_test.cpp b/fs_mgr/tests/fs_mgr_test.cpp
index 6c881c0..e34e06e 100644
--- a/fs_mgr/tests/fs_mgr_test.cpp
+++ b/fs_mgr/tests/fs_mgr_test.cpp
@@ -1109,14 +1109,17 @@
TemporaryFile tf;
ASSERT_TRUE(tf.fd != -1);
std::string fstab_contents = R"fs(
+data /data f2fs noatime wait,latemount
system /system erofs ro wait,logical,first_stage_mount
system /system ext4 ro wait,logical,first_stage_mount
vendor /vendor ext4 ro wait,logical,first_stage_mount
-data /data f2fs noatime wait
)fs";
ASSERT_TRUE(android::base::WriteStringToFile(fstab_contents, tf.path));
+ // If GSI is installed, ReadFstabFromFile() would have called TransformFstabForDsu() implicitly.
+ // In other words, TransformFstabForDsu() would be called two times if running CTS-on-GSI,
+ // which implies TransformFstabForDsu() should be idempotent.
Fstab fstab;
EXPECT_TRUE(ReadFstabFromFile(tf.path, &fstab));
TransformFstabForDsu(&fstab, "dsu", {"system_gsi", "userdata_gsi"});
@@ -1126,10 +1129,12 @@
EXPECT_EQ("/system", entry->mount_point);
EXPECT_EQ("system_gsi", entry->blk_device);
+ EXPECT_EQ("erofs", entry->fs_type);
entry++;
EXPECT_EQ("/system", entry->mount_point);
EXPECT_EQ("system_gsi", entry->blk_device);
+ EXPECT_EQ("ext4", entry->fs_type);
entry++;
EXPECT_EQ("/vendor", entry->mount_point);
@@ -1147,7 +1152,7 @@
std::string fstab_contents = R"fs(
system /system erofs ro wait,logical,first_stage_mount
vendor /vendor ext4 ro wait,logical,first_stage_mount
-data /data f2fs noatime wait
+data /data f2fs noatime wait,latemount
)fs";
ASSERT_TRUE(android::base::WriteStringToFile(fstab_contents, tf.path));
@@ -1177,3 +1182,39 @@
EXPECT_EQ("userdata_gsi", entry->blk_device);
entry++;
}
+
+TEST(fs_mgr, TransformFstabForDsu_synthesisAllMissingEntries) {
+ TemporaryFile tf;
+ ASSERT_TRUE(tf.fd != -1);
+ std::string fstab_contents = R"fs(
+data /data f2fs noatime wait,latemount
+vendor /vendor ext4 ro wait,logical,first_stage_mount
+)fs";
+
+ ASSERT_TRUE(android::base::WriteStringToFile(fstab_contents, tf.path));
+
+ Fstab fstab;
+ EXPECT_TRUE(ReadFstabFromFile(tf.path, &fstab));
+ TransformFstabForDsu(&fstab, "dsu", {"system_gsi", "userdata_gsi"});
+ ASSERT_EQ(4U, fstab.size());
+
+ auto entry = fstab.begin();
+
+ EXPECT_EQ("/vendor", entry->mount_point);
+ EXPECT_EQ("vendor", entry->blk_device);
+ entry++;
+
+ EXPECT_EQ("/system", entry->mount_point);
+ EXPECT_EQ("system_gsi", entry->blk_device);
+ EXPECT_EQ("ext4", entry->fs_type);
+ entry++;
+
+ EXPECT_EQ("/system", entry->mount_point);
+ EXPECT_EQ("system_gsi", entry->blk_device);
+ EXPECT_EQ("erofs", entry->fs_type);
+ entry++;
+
+ EXPECT_EQ("/data", entry->mount_point);
+ EXPECT_EQ("userdata_gsi", entry->blk_device);
+ entry++;
+}
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 9e1d93c..38f6f39 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -426,7 +426,7 @@
return ErrnoError() << "fchmodat() failed on " << options.target;
}
}
- if (fscrypt_is_native()) {
+ if (IsFbeEnabled()) {
if (!FscryptSetDirectoryPolicy(ref_basename, options.fscrypt_action, options.target)) {
return reboot_into_recovery(
{"--prompt_and_wipe_data", "--reason=set_policy_failed:"s + options.target});
@@ -1175,7 +1175,7 @@
auto reboot = [reboot_reason, should_reboot_into_recovery](const std::string& message) {
// TODO (b/122850122): support this in gsi
if (should_reboot_into_recovery) {
- if (fscrypt_is_native() && !android::gsi::IsGsiRunning()) {
+ if (IsFbeEnabled() && !android::gsi::IsGsiRunning()) {
LOG(ERROR) << message << ": Rebooting into recovery, reason: " << reboot_reason;
if (auto result = reboot_into_recovery(
{"--prompt_and_wipe_data", "--reason="s + reboot_reason});
diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp
index 042988e..4bbbc20 100644
--- a/init/first_stage_mount.cpp
+++ b/init/first_stage_mount.cpp
@@ -651,14 +651,9 @@
return;
}
- std::string lp_names = "";
- std::vector<std::string> dsu_partitions;
- for (auto&& name : images->GetAllBackingImages()) {
- dsu_partitions.push_back(name);
- lp_names += name + ",";
- }
- // Publish the logical partition names for TransformFstabForDsu
- WriteFile(gsi::kGsiLpNamesFile, lp_names);
+ // Publish the logical partition names for TransformFstabForDsu() and ReadFstabFromFile().
+ const auto dsu_partitions = images->GetAllBackingImages();
+ WriteFile(gsi::kGsiLpNamesFile, android::base::Join(dsu_partitions, ","));
TransformFstabForDsu(&fstab_, active_dsu, dsu_partitions);
}
diff --git a/libcutils/TEST_MAPPING b/libcutils/TEST_MAPPING
index cca7d93..6477502 100644
--- a/libcutils/TEST_MAPPING
+++ b/libcutils/TEST_MAPPING
@@ -4,7 +4,7 @@
"name": "libcutils_test"
}
],
- "hwasan-postsubmit": [
+ "hwasan-presubmit": [
{
"name": "libcutils_test"
}
diff --git a/libnetutils/dhcpclient.c b/libnetutils/dhcpclient.c
index 11c116a..ad6898c 100644
--- a/libnetutils/dhcpclient.c
+++ b/libnetutils/dhcpclient.c
@@ -45,7 +45,7 @@
typedef unsigned long long msecs_t;
#if VERBOSE
-void dump_dhcp_msg();
+void dump_dhcp_msg(dhcp_msg *msg, int len);
#endif
msecs_t get_msecs(void)
diff --git a/libstats/push_compat/statsd_writer.c b/libstats/push_compat/statsd_writer.c
index 04d3b46..4818d11 100644
--- a/libstats/push_compat/statsd_writer.c
+++ b/libstats/push_compat/statsd_writer.c
@@ -61,7 +61,7 @@
static int statsdOpen();
static void statsdClose();
static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr);
-static void statsdNoteDrop();
+static void statsdNoteDrop(int error, int tag);
struct android_log_transport_write statsdLoggerWrite = {
.name = "statsd",
diff --git a/libutils/include/utils/RefBase.h b/libutils/include/utils/RefBase.h
index e07f574..f3acd6f 100644
--- a/libutils/include/utils/RefBase.h
+++ b/libutils/include/utils/RefBase.h
@@ -779,6 +779,40 @@
} // namespace android
+namespace libutilsinternal {
+template <typename T, typename = void>
+struct is_complete_type : std::false_type {};
+
+template <typename T>
+struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};
+} // namespace libutilsinternal
+
+namespace std {
+
+// Define `RefBase` specific versions of `std::make_shared` and
+// `std::make_unique` to block people from using them. Using them to allocate
+// `RefBase` objects results in double ownership. Use
+// `sp<T>::make(...)` instead.
+//
+// Note: We exclude incomplete types because `std::is_base_of` is undefined in
+// that case.
+
+template <typename T, typename... Args,
+ typename std::enable_if<libutilsinternal::is_complete_type<T>::value, bool>::value = true,
+ typename std::enable_if<std::is_base_of<android::RefBase, T>::value, bool>::value = true>
+shared_ptr<T> make_shared(Args...) { // SEE COMMENT ABOVE.
+ static_assert(!std::is_base_of<android::RefBase, T>::value, "Must use RefBase with sp<>");
+}
+
+template <typename T, typename... Args,
+ typename std::enable_if<libutilsinternal::is_complete_type<T>::value, bool>::value = true,
+ typename std::enable_if<std::is_base_of<android::RefBase, T>::value, bool>::value = true>
+unique_ptr<T> make_unique(Args...) { // SEE COMMENT ABOVE.
+ static_assert(!std::is_base_of<android::RefBase, T>::value, "Must use RefBase with sp<>");
+}
+
+} // namespace std
+
// ---------------------------------------------------------------------------
#endif // ANDROID_REF_BASE_H
diff --git a/rootdir/init.rc b/rootdir/init.rc
index 29b8365..6d89f17 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -786,7 +786,6 @@
mkdir /data/misc/carrierid 0770 system radio
mkdir /data/misc/apns 0770 system radio
mkdir /data/misc/emergencynumberdb 0770 system radio
- mkdir /data/misc/zoneinfo 0775 system system
mkdir /data/misc/network_watchlist 0774 system system
mkdir /data/misc/textclassifier 0771 system system
mkdir /data/misc/vpn 0770 system vpn
@@ -1021,10 +1020,6 @@
# completed and apexd.status becomes "ready".
exec_start apexd-snapshotde
- # Check any timezone data in /data is newer than the copy in the time zone data
- # module, delete if not.
- exec - system system -- /system/bin/tzdatacheck /apex/com.android.tzdata/etc/tz /data/misc/zoneinfo
-
# sys.memfd_use set to false by default, which keeps it disabled
# until it is confirmed that apps and vendor processes don't make
# IOCTLs on ashmem fds any more.