Merge "Add %b/%B to async-safe logging." into main am: bf4d3a95c1

Original change: https://android-review.googlesource.com/c/platform/bionic/+/2721534

Change-Id: I2c8f318874f9c2fc674041a10d36f7082f9a5d43
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Elliott Hughes 2023-08-24 15:26:08 +00:00 committed by Automerger Merge Worker
commit 5abfd88813
2 changed files with 23 additions and 5 deletions

View file

@ -207,10 +207,12 @@ static void format_integer(char* buf, size_t buf_size, uint64_t value, char conv
// Decode the conversion specifier.
int is_signed = (conversion == 'd' || conversion == 'i' || conversion == 'o');
int base = 10;
if (conversion == 'x' || conversion == 'X') {
if (tolower(conversion) == 'x') {
base = 16;
} else if (conversion == 'o') {
base = 8;
} else if (tolower(conversion) == 'b') {
base = 2;
}
bool caps = (conversion == 'X');
@ -360,7 +362,8 @@ static void out_vformat(Out& o, const char* format, va_list args) {
format_integer(buffer + 2, sizeof(buffer) - 2, value, 'x');
} else if (c == 'm') {
strerror_r(errno, buffer, sizeof(buffer));
} else if (c == 'd' || c == 'i' || c == 'o' || c == 'u' || c == 'x' || c == 'X') {
} else if (tolower(c) == 'b' || c == 'd' || c == 'i' || c == 'o' || c == 'u' ||
tolower(c) == 'x') {
/* integers - first read value from stack */
uint64_t value;
int is_signed = (c == 'd' || c == 'i' || c == 'o');
@ -391,10 +394,10 @@ static void out_vformat(Out& o, const char* format, va_list args) {
value = static_cast<uint64_t>((static_cast<int64_t>(value << shift)) >> shift);
}
if (alternate && value != 0 && (c == 'x' || c == 'o')) {
if (c == 'x') {
if (alternate && value != 0 && (tolower(c) == 'x' || c == 'o' || tolower(c) == 'b')) {
if (tolower(c) == 'x' || tolower(c) == 'b') {
buffer[0] = '0';
buffer[1] = 'x';
buffer[1] = c;
format_integer(buffer + 2, sizeof(buffer) - 2, value, c);
} else {
buffer[0] = '0';

View file

@ -45,6 +45,15 @@ TEST(async_safe_log, smoke) {
async_safe_format_buffer(buf, sizeof(buf), "aa%scc", "bb");
EXPECT_STREQ("aabbcc", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%bb", 1234);
EXPECT_STREQ("a10011010010b", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%#bb", 1234);
EXPECT_STREQ("a0b10011010010b", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%#Bb", 1234);
EXPECT_STREQ("a0B10011010010b", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%cc", 'b');
EXPECT_STREQ("abc", buf);
@ -76,9 +85,15 @@ TEST(async_safe_log, smoke) {
async_safe_format_buffer(buf, sizeof(buf), "a%xz", 0x12ab);
EXPECT_STREQ("a12abz", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%#xz", 0x12ab);
EXPECT_STREQ("a0x12abz", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%Xz", 0x12ab);
EXPECT_STREQ("a12ABz", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%#Xz", 0x12ab);
EXPECT_STREQ("a0X12ABz", buf);
async_safe_format_buffer(buf, sizeof(buf), "a%08xz", 0x123456);
EXPECT_STREQ("a00123456z", buf);