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());