Skip to content

Commit

Permalink
Fix truncating last character in the StderrLogger (#12620)
Browse files Browse the repository at this point in the history
Summary:
This PR fixes a bug in the StderrLogger that truncated the last character in the logline. The problem was that we provided an incorrect max size parameter into the vsnprintf function. The size didn't take into account the null byte that the function automatically adds.

Before fix
```
** File Read Latency Histogram By Level [default] **
2024/05/04-18:50:24.209304 4788 [/db_impl/db_impl.cc:498] Shutdown: canceling all background wor
2024/05/04-18:50:24.209598 4788 [/db_impl/db_impl.cc:692] Shutdown complet
```

After fix
```
** File Read Latency Histogram By Level [default] **

2024/05/04-18:51:19.814584 4d4d [/db_impl/db_impl.cc:498] Shutdown: canceling all background work
2024/05/04-18:51:19.815528 4d4d [/db_impl/db_impl.cc:692] Shutdown complete
```

Pull Request resolved: #12620

Test Plan:
tested on examples/simple_example.cc with StderrLogger
Fixes: #12576

Reviewed By: jaykorean

Differential Revision: D56972332

Pulled By: ajkr

fbshipit-source-id: 70405e8231ae6e90d24fe0b351bc8e749176bd15
  • Loading branch information
PatrikValo authored and facebook-github-bot committed May 6, 2024
1 parent 7bf6d4c commit 3fdc724
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions util/stderr_logger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,12 @@ void StderrLogger::Logv(const char* format, va_list ap) {

va_list ap_copy;
va_copy(ap_copy, ap);
const size_t log_suffix_len = vsnprintf(nullptr, 0, format, ap_copy);
const size_t log_suffix_len = vsnprintf(nullptr, 0, format, ap_copy) + 1;
va_end(ap_copy);

// Allocate space for the context, log_prefix, and log itself
// Extra byte for null termination
size_t buf_len = ctx_len + log_prefix_len + log_suffix_len + 1;
size_t buf_len = ctx_len + log_prefix_len + log_suffix_len;
std::unique_ptr<char[]> buf(new char[buf_len]);

// If the logger was created without a prefix, the prefix is a nullptr
Expand All @@ -55,8 +55,7 @@ void StderrLogger::Logv(const char* format, va_list ap) {
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min,
t.tm_sec, static_cast<int>(now_tv.tv_usec),
static_cast<long long unsigned int>(thread_id), prefix);
written += vsnprintf(buf.get() + written, log_suffix_len, format, ap);
buf[written] = '\0';
vsnprintf(buf.get() + written, log_suffix_len, format, ap);

fprintf(stderr, "%s%c", buf.get(), '\n');
}
Expand Down

0 comments on commit 3fdc724

Please sign in to comment.