slurp_battery_info: Fix reading uninitialised memory (#531)

Fixes valgrind-found bug of the `for (walk = buf, ...` loop
reading all of `buf` even though `buf` is null-terminated string
(an only partly initialised char array).

    valgrind ./i3status -c ../etc/i3status.conf --run-once

    Conditional jump or move depends on uninitialised value(s)
      at 0x40F15A: slurp_battery_info (print_battery_info.c:164)
      by 0x40FA07: slurp_all_batteries (print_battery_info.c:558)
      by 0x40FCA6: print_battery_info (print_battery_info.c:612)
      by 0x409CA2: main (i3status.c:753)
This commit is contained in:
Niklas Hambüchen 2024-09-09 16:43:25 +02:00 committed by GitHub
parent ccac36f457
commit d53da19a79
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 7 additions and 1 deletions

View File

@ -19,7 +19,8 @@
}
/*
* Reads size bytes into the destination buffer from filename.
* Reads (size - 1) bytes into the destination buffer from filename,
* and null-terminate it.
*
* On success, true is returned. Otherwise, false is returned and the content
* of destination is left untouched.

View File

@ -161,6 +161,11 @@ static bool slurp_battery_info(battery_info_ctx_t *ctx, struct battery_info *bat
}
for (walk = buf, last = buf; (walk - buf) < 1024; walk++) {
// `*walk` (slice of `buf`) is only initialised until `null` written by `slurp()`
if (*walk == '\0') {
break;
}
if (*walk == '\n') {
last = walk + 1;
continue;