Second: if the return value of vsnprintf() is greater than or equal to the
passed size, the resulting string is truncated.
So, in order to see if some extra space is needed, the check needs to be
changed.
Signed-off-by: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx>
---
Un-tested
v2: - Use printbuf_remaining_size() instead of hand-writing it. [Brian Foster]
- Reword the commit log, hoping it is clearer.
- Synch with -next-20240215
v1: https://lore.kernel.org/all/0f40108bed3e084057223bdbe32c4b37f8500ff3.1694845203.git.christophe.jaillet@xxxxxxxxxx/
---
fs/bcachefs/printbuf.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/fs/bcachefs/printbuf.c b/fs/bcachefs/printbuf.c
index b27d22925929..8cee9c2f88c4 100644
--- a/fs/bcachefs/printbuf.c
+++ b/fs/bcachefs/printbuf.c
@@ -55,9 +55,10 @@ void bch2_prt_vprintf(struct printbuf *out, const char *fmt, va_list args)
va_list args2;
va_copy(args2, args);
- len = vsnprintf(out->buf + out->pos, printbuf_remaining(out), fmt, args2);
+ len = vsnprintf(out->buf + out->pos, printbuf_remaining_size(out),
+ fmt, args2);
va_end(args2);
- } while (len + 1 >= printbuf_remaining(out) &&
+ } while (len >= printbuf_remaining_size(out) &&
!bch2_printbuf_make_room(out, len + 1));
len = min_t(size_t, len,
@@ -72,9 +73,10 @@ void bch2_prt_printf(struct printbuf *out, const char *fmt, ...)
do {
va_start(args, fmt);
- len = vsnprintf(out->buf + out->pos, printbuf_remaining(out), fmt, args);
+ len = vsnprintf(out->buf + out->pos, printbuf_remaining_size(out),
+ fmt, args);
va_end(args);
- } while (len + 1 >= printbuf_remaining(out) &&
+ } while (len >= printbuf_remaining_size(out) &&
!bch2_printbuf_make_room(out, len + 1));
len = min_t(size_t, len,
--
2.43.2