idmap2: create in-memory FRRO before creating file
Re-order the serialization of an FRRO and creation of the backing file.
This prevents a dangling (empty) file if the serialization fails.
Bug: 189963636
Test: manual: cmd overlay fabricate <bad parameters>, verify no file created in /data/resource-cache
Change-Id: I1af88c6d2d1c3a881beecfb50ccaf541a249f39b
diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp
index 05336ba..4f775aa 100644
--- a/cmds/idmap2/idmap2d/Idmap2Service.cpp
+++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp
@@ -262,17 +262,17 @@
path.c_str(), uid));
}
+ const auto frro = builder.Build();
+ if (!frro) {
+ return error(StringPrintf("failed to serialize '%s:%s': %s", overlay.packageName.c_str(),
+ overlay.overlayName.c_str(), frro.GetErrorMessage().c_str()));
+ }
// Persist the fabricated overlay.
umask(kIdmapFilePermissionMask);
std::ofstream fout(path);
if (fout.fail()) {
return error("failed to open frro path " + path);
}
- const auto frro = builder.Build();
- if (!frro) {
- return error(StringPrintf("failed to serialize '%s:%s': %s", overlay.packageName.c_str(),
- overlay.overlayName.c_str(), frro.GetErrorMessage().c_str()));
- }
auto result = frro->ToBinaryStream(fout);
if (!result) {
unlink(path.c_str());