Merge changes from topics "createapexdirs", "createapexrollbackdirs"
* changes:
Create directory for snapshots of DE_sys apex data.
Create DE_sys APEX data directories.
diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp
index 1d72c70..30d01a6 100644
--- a/fs_mgr/libsnapshot/Android.bp
+++ b/fs_mgr/libsnapshot/Android.bp
@@ -121,6 +121,34 @@
],
}
+cc_library_static {
+ name: "libsnapshot_test_helpers",
+ defaults: ["libsnapshot_defaults"],
+ export_include_dirs: [
+ "include_test",
+ ],
+ srcs: [
+ "test_helpers.cpp",
+ ],
+ shared_libs: [
+ "android.hardware.boot@1.1",
+ "libcrypto",
+ ],
+ export_shared_lib_headers: [
+ "android.hardware.boot@1.1",
+ ],
+ header_libs: [
+ "libstorage_literals_headers",
+ ],
+ export_header_lib_headers: [
+ "libstorage_literals_headers",
+ ],
+ static_libs: [
+ "libgtest",
+ "libgmock",
+ ],
+}
+
cc_test {
name: "libsnapshot_test",
defaults: ["libsnapshot_defaults"],
@@ -144,6 +172,7 @@
"libgmock",
"liblp",
"libsnapshot",
+ "libsnapshot_test_helpers",
"libsparse",
"libz",
],
diff --git a/fs_mgr/libsnapshot/test_helpers.h b/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h
similarity index 100%
rename from fs_mgr/libsnapshot/test_helpers.h
rename to fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h
diff --git a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp
index eae6c35..9da3f05 100644
--- a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp
+++ b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp
@@ -18,9 +18,10 @@
#include <liblp/builder.h>
#include <liblp/property_fetcher.h>
+#include <libsnapshot/test_helpers.h>
+
#include "dm_snapshot_internals.h"
#include "partition_cow_creator.h"
-#include "test_helpers.h"
#include "utility.h"
using namespace android::fs_mgr;
diff --git a/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp b/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp
index 4fd8759..337be4f 100644
--- a/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp
+++ b/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp
@@ -24,7 +24,7 @@
#include <liblp/builder.h>
#include <storage_literals/storage_literals.h>
-#include "test_helpers.h"
+#include <libsnapshot/test_helpers.h>
using namespace android::storage_literals;
using android::fs_mgr::LpMetadata;
diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp
index 9e5fef3..ff943f2 100644
--- a/fs_mgr/libsnapshot/snapshot_test.cpp
+++ b/fs_mgr/libsnapshot/snapshot_test.cpp
@@ -38,7 +38,7 @@
#include <storage_literals/storage_literals.h>
#include <android/snapshot/snapshot.pb.h>
-#include "test_helpers.h"
+#include <libsnapshot/test_helpers.h>
#include "utility.h"
namespace android {
diff --git a/fs_mgr/libsnapshot/test_helpers.cpp b/fs_mgr/libsnapshot/test_helpers.cpp
index 2d62347..f7f25af 100644
--- a/fs_mgr/libsnapshot/test_helpers.cpp
+++ b/fs_mgr/libsnapshot/test_helpers.cpp
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "test_helpers.h"
+#include <libsnapshot/test_helpers.h>
#include <android-base/file.h>
#include <android-base/logging.h>
diff --git a/init/persistent_properties.cpp b/init/persistent_properties.cpp
index 3b5a41d..1758cfa 100644
--- a/init/persistent_properties.cpp
+++ b/init/persistent_properties.cpp
@@ -198,7 +198,7 @@
// Note in this case, that the source and destination directories are the same, so only one
// fsync() is required.
auto dir = Dirname(persistent_property_filename);
- auto dir_fd = unique_fd{open(dir.c_str(), O_DIRECTORY | O_RDONLY)};
+ auto dir_fd = unique_fd{open(dir.c_str(), O_DIRECTORY | O_RDONLY | O_CLOEXEC)};
if (dir_fd < 0) {
return ErrnoError() << "Unable to open persistent properties directory for fsync()";
}
diff --git a/logcat/logcat.cpp b/logcat/logcat.cpp
index cd5d7d4..3fc5e5d 100644
--- a/logcat/logcat.cpp
+++ b/logcat/logcat.cpp
@@ -1082,50 +1082,45 @@
}
if (printStatistics || getPruneList) {
- size_t len = 8192;
- char* buf;
+ std::string buf(8192, '\0');
+ size_t ret_length = 0;
+ int retry = 32;
- for (int retry = 32; (retry >= 0) && ((buf = new char[len]));
- delete[] buf, buf = nullptr, --retry) {
+ for (; retry >= 0; --retry) {
if (getPruneList) {
- android_logger_get_prune_list(logger_list.get(), buf, len);
+ android_logger_get_prune_list(logger_list.get(), buf.data(), buf.size());
} else {
- android_logger_get_statistics(logger_list.get(), buf, len);
+ android_logger_get_statistics(logger_list.get(), buf.data(), buf.size());
}
- buf[len - 1] = '\0';
- if (atol(buf) < 3) {
- delete[] buf;
- buf = nullptr;
+
+ ret_length = atol(buf.c_str());
+ if (ret_length < 3) {
+ error(EXIT_FAILURE, 0, "Failed to read data.");
+ }
+
+ if (ret_length < buf.size()) {
break;
}
- size_t ret = atol(buf) + 1;
- if (ret <= len) {
- len = ret;
- break;
- }
- len = ret;
+
+ buf.resize(ret_length + 1);
}
- if (!buf) {
+ if (retry < 0) {
error(EXIT_FAILURE, 0, "Failed to read data.");
}
- // remove trailing FF
- char* cp = buf + len - 1;
- *cp = '\0';
- bool truncated = *--cp != '\f';
- if (!truncated) *cp = '\0';
-
- // squash out the byte count
- cp = buf;
- if (!truncated) {
- while (isdigit(*cp)) ++cp;
- if (*cp == '\n') ++cp;
+ buf.resize(ret_length);
+ if (buf.back() == '\f') {
+ buf.pop_back();
}
- len = strlen(cp);
+ // Remove the byte count prefix
+ const char* cp = buf.c_str();
+ while (isdigit(*cp)) ++cp;
+ if (*cp == '\n') ++cp;
+
+ size_t len = strlen(cp);
TEMP_FAILURE_RETRY(write(output_fd_.get(), cp, len));
- delete[] buf;
return EXIT_SUCCESS;
}
diff --git a/logd/CommandListener.cpp b/logd/CommandListener.cpp
index 7a843d8..694b5fa 100644
--- a/logd/CommandListener.cpp
+++ b/logd/CommandListener.cpp
@@ -19,6 +19,7 @@
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
+#include <math.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
@@ -186,14 +187,26 @@
: LogCommand("getStatistics"), mBuf(*buf) {
}
-static std::string package_string(const std::string& str) {
- // Calculate total buffer size prefix, count is the string length w/o nul
- char fmt[32];
- for (size_t l = str.length(), y = 0, x = 6; y != x;
- y = x, x = strlen(fmt) - 2) {
- snprintf(fmt, sizeof(fmt), "%zu\n%%s\n\f", l + x);
+// This returns a string with a length prefix with the format <length>\n<data>\n\f. The length
+// prefix includes the length of the prefix itself.
+static std::string PackageString(const std::string& str) {
+ size_t overhead_length = 3; // \n \n \f.
+
+ // Number of digits needed to represent length(str + overhead_length).
+ size_t str_size_digits = 1 + static_cast<size_t>(log10(str.size() + overhead_length));
+ // Number of digits needed to represent the total size.
+ size_t total_size_digits =
+ 1 + static_cast<size_t>(log10(str.size() + overhead_length + str_size_digits));
+
+ // If adding the size prefix causes a new digit to be required to represent the new total
+ // size, add it to the 'overhead_length'. This can only happen once, since each new digit
+ // allows for 10x the previous size to be recorded.
+ if (total_size_digits != str_size_digits) {
+ overhead_length++;
}
- return android::base::StringPrintf(fmt, str.c_str());
+
+ size_t total_size = str.size() + overhead_length + str_size_digits;
+ return android::base::StringPrintf("%zu\n%s\n\f", total_size, str.c_str());
}
int CommandListener::GetStatisticsCmd::runCommand(SocketClient* cli, int argc,
@@ -228,8 +241,7 @@
}
}
- cli->sendMsg(
- package_string(mBuf.formatStatistics(uid, pid, logMask)).c_str());
+ cli->sendMsg(PackageString(mBuf.formatStatistics(uid, pid, logMask)).c_str());
return 0;
}
@@ -240,7 +252,7 @@
int CommandListener::GetPruneListCmd::runCommand(SocketClient* cli,
int /*argc*/, char** /*argv*/) {
setname();
- cli->sendMsg(package_string(mBuf.formatPrune()).c_str());
+ cli->sendMsg(PackageString(mBuf.formatPrune()).c_str());
return 0;
}
@@ -316,12 +328,11 @@
cli->sendMsg("can not mix id= with either format= or name=");
return 0;
}
- cli->sendMsg(package_string(mBuf.formatEntry(atoi(id), uid)).c_str());
+ cli->sendMsg(PackageString(mBuf.formatEntry(atoi(id), uid)).c_str());
return 0;
}
- cli->sendMsg(
- package_string(mBuf.formatGetEventTag(uid, name, format)).c_str());
+ cli->sendMsg(PackageString(mBuf.formatGetEventTag(uid, name, format)).c_str());
return 0;
}