* maybe_escape_markup: Make function memory-safe
This fixes#492 and an additional buffer overflow that can happen when
pango markup is enabled.
Using config
```
general {
output_format = "none"
markup = "pango"
}
order += "wireless _first_"
wireless _first_ {
format_up = "W: (%quality at %essid, %bitrate) %ip"
}
```
and renaming my phone's hotspot to `Hello world &<<<<<<hello world>>`
i3status will throw an AddressSanitizer error:
```
==1373240==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7411d720923e at pc 0x7411daa7cee9 bp 0x7ffdae6ce070 sp 0x7ffdae6cd800
WRITE of size 5 at 0x7411d720923e thread T0
#0 0x7411daa7cee8 in __interceptor_vsprintf /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:1765
#1 0x7411daa7d0ff in __interceptor_sprintf /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:1808
#2 0x653b2764cdaf in maybe_escape_markup ../src/output.c:102
#3 0x653b27677df9 in print_wireless_info ../src/print_wireless_info.c:607
#4 0x653b27640bf1 in main ../i3status.c:709
#5 0x7411da641ccf (/usr/lib/libc.so.6+0x25ccf) (BuildId: 6542915cee3354fbcf2b3ac5542201faec43b5c9)
#6 0x7411da641d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: 6542915cee3354fbcf2b3ac5542201faec43b5c9)
#7 0x653b27633f24 in _start (/tmp/xx/i3status/build/i3status+0x4ff24) (BuildId: c737ce6288265fa02a7617c66f51ddd16b5a8275)
Address 0x7411d720923e is located in stack of thread T0 at offset 574 in frame
#0 0x653b276750ed in print_wireless_info ../src/print_wireless_info.c:513
This frame has 10 object(s):
[48, 56) 'tmp' (line 604)
[80, 168) 'info' (line 516)
[208, 320) 'placeholders' (line 623)
[352, 382) 'string_quality' (line 569)
[416, 446) 'string_signal' (line 570)
[480, 510) 'string_noise' (line 571)
[544, 574) 'string_essid' (line 572) <== Memory access at offset 574 overflows this variable
[608, 638) 'string_frequency' (line 573)
[672, 702) 'string_ip' (line 574)
[736, 766) 'string_bitrate' (line 575)
```
With pango disabled, the error is thrown elsewhere (#492):
```
==1366779==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7bab43a0923e at pc 0x7bab4727cee9 bp 0x7ffc289d2540 sp 0x7ffc289d1cd0
WRITE of size 33 at 0x7bab43a0923e thread T0
#0 0x7bab4727cee8 in __interceptor_vsprintf /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:1765
#1 0x7bab4727d0ff in __interceptor_sprintf /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:1808
#2 0x5dd180858aa4 in maybe_escape_markup ../src/output.c:93
#3 0x5dd180883df9 in print_wireless_info ../src/print_wireless_info.c:607
#4 0x5dd18084cbf1 in main ../i3status.c:709
#5 0x7bab46843ccf (/usr/lib/libc.so.6+0x25ccf) (BuildId: 6542915cee3354fbcf2b3ac5542201faec43b5c9)
#6 0x7bab46843d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: 6542915cee3354fbcf2b3ac5542201faec43b5c9)
#7 0x5dd18083ff24 in _start (/tmp/xx/i3status/build/i3status+0x4ff24) (BuildId: c737ce6288265fa02a7617c66f51ddd16b5a8275)
Address 0x7bab43a0923e is located in stack of thread T0 at offset 574 in frame
#0 0x5dd1808810ed in print_wireless_info ../src/print_wireless_info.c:513
This frame has 10 object(s):
[48, 56) 'tmp' (line 604)
[80, 168) 'info' (line 516)
[208, 320) 'placeholders' (line 623)
[352, 382) 'string_quality' (line 569)
[416, 446) 'string_signal' (line 570)
[480, 510) 'string_noise' (line 571)
[544, 574) 'string_essid' (line 572) <== Memory access at offset 574 overflows this variable
[608, 638) 'string_frequency' (line 573)
[672, 702) 'string_ip' (line 574)
[736, 766) 'string_bitrate' (line 575)
```
With the patch output is correct:
```
W: ( 72% at Hello world &<<<<<<hello world>>, 1,2009 Gb/s) 192.168.26.237
```
and
```
W: ( 73% at Hello world &<<<<<<hello world>>, 1,1342 Gb/s) 192.168.26.237
```
The patch changes the maybe_escape_markup function to use dynamic
allocation instead of a static buffer. Confusing pointer arithmetic is
replaced with index-based memory access. The `buffer` pointer does not
move around except for `realloc`ations.
Fixes#492Closes#525 (alternative PR)
* Revert to snprintf
On some systems, a battery's charging regulator may not charge a battery
even though it is not full. This might be the case because it was
configured to stop charging at a capacity threshold, or e.g. because
environmental conditions do not allow for charging the battery.
This commit adds this status (called 'idle') and adds support for
detecting the status on Linux.
- unused variable ‘walk’ [-Wunused-variable]
- implicit declaration of built-in function ‘free’
[-Wimplicit-function-declaration]
- initialization discards ‘const’ qualifier from pointer target type
[-Wdiscarded-qualifiers]
- variable 'ram_used' is used uninitialized whenever 'if' condition is
false [-Wsometimes-uninitialized]. This is actually easily reproducible
by specifying `memory_used_method = "XXX"`.
- comparison of integers of different signs: 'int' and 'unsigned long'
[-Wsign-compare] (for `exponent`)
Previously the format placeholders were auto-converted to the maximum possible
unit, e.g. /proc/meminfo reports MemTotal of 16307104kB which will get
converted to 15.6GiB. It is now possible to specifiy the target unit, e.g. Mi,
which will be used for the conversion - in the example it would lead to
15924.9MiB.
The resulting number can now be further formatted via the decimal option. It
allows to specify the number of decimals to use, e.g. 15.6GiB vs. 15GiB or
15924.9MiB vs. 15925MiB.
Added a function to print file contents to status bar without newlines.
Added tests for print file contents function
Added manpage entry for file contents
This commit implements the %devicename specifier for the volume module
for both PulseAudio and ALSA. This way, i3status will be able to display
the specific device that corresponds to the volume indicator.
Note that this is not implemented for the OSS API but is left in a state
where someone can pick it up for the future.
This change addresses the issue #199 asking for multiple CPU support. It
takes an arbitrary CPU number and outputs its usage using the same
arithmetics as for CPU aggregation. It currently doesn't support
FreeBSD.
Using title number all, this enables aggregates. Note that FreeBSD and
OpenBSD previously only reported aggregates, so this is bringing Linux
and NetBSD that functionality.
Changes the default battery reporting to the aggregate since most
users probably don't care about individual batteries. For single-battery
systems there should be no change.
Fixes one obvious memory leak in NetBSD.
Currently i3status differentiates wireless and wired devices based
on the existence of wireless directory inside the device's sysfs
directory. This approach seems to cause 3g modems to be incorrectly
identified as the first ethernet device.
This commit solves this problem by using DEVTYPE variable from
uevent file.
Signed-off-by: Cihangir Akturk <cakturk@gmail.com>
CPU usage had previously not supported the color option. Add support
for a "degraded" state above which the degraded color is used, and a
higher "bad" state above which the "bad" color is used. One possible
use for these might be indicating whether one or all cores are
saturated.
Unlike the color settings for other, these are set high enough to be
disabled by default. This is done because i3status determines CPU
usage over only the last display interval, which means that, a user
with a low refresh rate might see frequent, potentially-annoying color
changes.