fastfetch-cli / fastfetch

A maintained, feature-rich and performance oriented, neofetch like system information tool.
MIT License
10.42k stars 404 forks source link

[BUG] Segfault on Alpine with Kitty in TerminalFont #1321

Closed UltimateNyn closed 3 weeks ago

UltimateNyn commented 3 weeks ago

General description of bug:

Often helpful information:

Screenshot: image

The content of the configuration file you use (if any): I have no configuratoin file

Output of fastfetch -c ci.jsonc --format json:

zsh: segmentation fault  fastfetch -c ci.jsonc --format json

Output of fastfetch --list-features:

threads
vulkan
wayland
xcb-randr
xcb
x11
drm
drm_amdgpu
gio
dconf
dbus
imagemagick7
chafa
zlib
xfconf
sqlite3
egl
osmesa
opencl
libpulse
libddcutil
libelf
libzfs
System yyjson
linux/videodev2
linux/wireless

If fastfatch crashed or froze

Paste the stacktrace here. You may get it with: I couldn't get the stacktrace with the provided gdb command but I can paste it from the normal gdb bt output. It's from commit 5f3ce500229a58468bb32e6541952fd1af309c45 (latest commit on dev) and was built with the same options as in the Alpine package except that Release was replaced by Debug

#0  0x00007ffff7f8b01e in vfscanf (f=f@entry=0x7fffffffd5b0, fmt=<optimized out>, ap=0x7fffffffd6f0) at src/stdio/vfscanf.c:265
#1  0x00007ffff7fbc687 in vsscanf (s=<optimized out>, fmt=<optimized out>, ap=<optimized out>) at src/stdio/vsscanf.c:24
#2  0x00005555556f880d in ffGetTerminalResponse (request=0x55555576cf20 "\033P+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65\033\\", nParams=2,
    format=0x55555576cef0 "\033P1+r%*[^=]=%512[^\033]\033\\\033P1+r%*[^=]=%512[^\033]\033\\") at /tmp/a/fastfetch/src/common/io/io_unix.c:219
#3  0x000055555559104a in detectKitty (exe=0x555555818830 <result+16>, result=0x7fffffffe120) at /tmp/a/fastfetch/src/detection/terminalfont/terminalfont.c:82
#4  0x00005555555917f0 in detectTerminalFontCommon (terminal=0x555555818820 <result>, terminalFont=0x7fffffffe120) at /tmp/a/fastfetch/src/detection/terminalfont/terminalfont.c:238
#5  0x000055555559187c in ffDetectTerminalFont (result=0x7fffffffe120) at /tmp/a/fastfetch/src/detection/terminalfont/terminalfont.c:256
#6  0x000055555568f51c in ffPrintTerminalFont (options=0x555555816e00 <instance+9184>) at /tmp/a/fastfetch/src/modules/terminalfont/terminalfont.c:17
#7  0x000055555557b48a in parseStructureCommand (line=0x7ffff7ffebac "TerminalFont", fn=0x55555557a6f4 <genJsonResult>, jsonDoc=0x0) at /tmp/a/fastfetch/src/common/commandoption.c:97
#8  0x000055555557b599 in ffPrintCommandOption (data=0x7fffffffe470, jsonDoc=0x0) at /tmp/a/fastfetch/src/common/commandoption.c:120
#9  0x000055555572fd57 in run (data=0x7fffffffe470) at /tmp/a/fastfetch/src/fastfetch.c:671
#10 0x0000555555730630 in main (argc=1, argv=0x7fffffffe4d8) at /tmp/a/fastfetch/src/fastfetch.c:731

If you are able to identify which module crashed, the strace can be helpful too. The TerminalFont module seems to be the one crashing (based on the Backtrace and stdout output).

Command strace ./build/fastfetch --multithreading false -s "TerminalFont" --pipe returns:

execve("./build/fastfetch", ["./build/fastfetch", "--multithreading", "false", "-s", "TerminalFont", "--pipe"], 0x7ffc4b95b8e8 /* 57 vars */) = 0
arch_prctl(ARCH_SET_FS, 0x7f0e70aafb28) = 0
set_tid_address(0x7f0e70aaff90)         = 3433
brk(NULL)                               = 0x55f193c42000
brk(0x55f193c44000)                     = 0x55f193c44000
mmap(0x55f193c42000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x55f193c42000
mprotect(0x7f0e70aac000, 4096, PROT_READ) = 0
mprotect(0x55f15df7b000, 90112, PROT_READ) = 0
getuid()                                = 1000
open("/etc/passwd", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e70a0a000
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
read(3, "root:x:0:0:root:/root:/bin/ash\nb"..., 1024) = 1024
read(3, "gin\nsmmsp:x:209:209:smmsp:/var/s"..., 1024) = 1024
lseek(3, -438, SEEK_CUR)                = 1610
close(3)                                = 0
munmap(0x7f0e70a0a000, 4096)            = 0
uname({sysname="Linux", nodename="cursed-temperature", ...}) = 0
readlink("/proc/self/exe", "/tmp/a/fastfetch/build/fastfetch", 4096) = 32
mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e70a04000
readlink("/tmp", 0x7ffdf6cac320, 4068)  = -1 EINVAL (Invalid argument)
readlink("/tmp/a", 0x7ffdf6cac320, 4070) = -1 EINVAL (Invalid argument)
readlink("/tmp/a/fastfetch", 0x7ffdf6cac320, 4080) = -1 EINVAL (Invalid argument)
readlink("/tmp/a/fastfetch/build", 0x7ffdf6cac320, 4086) = -1 EINVAL (Invalid argument)
readlink("/tmp/a/fastfetch/build/fastfetch", 0x7ffdf6cac320, 4096) = -1 EINVAL (Invalid argument)
stat("/home/nyn/.config/", {st_mode=S_IFDIR|0755, st_size=190, ...}) = 0
stat("/home/nyn/", {st_mode=S_IFDIR|0700, st_size=214, ...}) = 0
stat("/etc/xdg/", {st_mode=S_IFDIR|0755, st_size=9, ...}) = 0
stat("/etc/", {st_mode=S_IFDIR|0755, st_size=201, ...}) = 0
stat("/etc/", {st_mode=S_IFDIR|0755, st_size=201, ...}) = 0
stat("/home/nyn/.local/share/", {st_mode=S_IFDIR|0755, st_size=99, ...}) = 0
stat("/tmp/a/fastfetch/share", 0x7ffdf6cae1b0) = -1 ENOENT (No such file or directory)
stat("/home/nyn/", {st_mode=S_IFDIR|0700, st_size=214, ...}) = 0
stat("/home/nyn/.local/share/flatpak/exports/share", 0x7ffdf6cae160) = -1 ENOENT (No such file or directory)
stat("/var/lib/flatpak/exports/share", {st_mode=S_IFDIR|0755, st_size=5, ...}) = 0
stat("/usr/local/share", {st_mode=S_IFDIR|0755, st_size=13, ...}) = 0
stat("/usr/share", {st_mode=S_IFDIR|0755, st_size=259, ...}) = 0
stat("/usr/local/share/", {st_mode=S_IFDIR|0755, st_size=13, ...}) = 0
stat("/usr/share/", {st_mode=S_IFDIR|0755, st_size=259, ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=50, ws_col=210, ws_xpixel=1890, ws_ypixel=1000}) = 0
open("/home/nyn/.config/fastfetch/config.jsonc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/home/nyn/fastfetch/config.jsonc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/etc/xdg/fastfetch/config.jsonc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/etc/fastfetch/config.jsonc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
rt_sigprocmask(SIG_UNBLOCK, [RT_1 RT_2], NULL, 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x55f15dcfaefe, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f0e70a695a4}, NULL, 8) = 0
rt_sigaction(SIGTERM, {sa_handler=0x55f15dcfaefe, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f0e70a695a4}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=0x55f15dcfaefe, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f0e70a695a4}, NULL, 8) = 0
open("/bedrock/etc/bedrock-release", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/etc/os-release", O_RDONLY|O_LARGEFILE) = 3
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e70a03000
read(3, "NAME=\"Alpine Linux\"\nID=alpine\nVE"..., 1024) = 201
read(3, "", 1024)                       = 0
close(3)                                = 0
munmap(0x7f0e70a03000, 4096)            = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e70a02000
) = 778, "       .hddddddddddddddddddddddh"..., 778       .hddddddddddddddddddddddh.
munmap(0x7f0e70a02000, 8192)            = 0
mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e70a00000
ioctl(1, TIOCGWINSZ, {ws_row=50, ws_col=210, ws_xpixel=1890, ws_ypixel=1000}) = 0
readlink("/proc/self/fd/1", "/dev/pts/4", 32) = 10
stat("/dev/pts/4", {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x4), ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x4), ...}) = 0
getppid()                               = 3430
open("/proc/3430/stat", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
read(3, "3430 (strace) S 470 3430 470 348"..., 8191) = 320
close(3)                                = 0
open("/proc/470/stat", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
read(3, "470 (zsh) S 20983 470 470 34820 "..., 8191) = 330
close(3)                                = 0
open("/proc/470/cmdline", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "/bin/zsh\0", 4095)             = 9
read(3, "", 4086)                       = 0
close(3)                                = 0
readlink("/proc/470/exe", "/bin/zsh", 4096) = 8
open("/etc/ld-musl-x86_64.path", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib/libelf.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/libelf.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/libelf.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFREG|0755, st_size=87992, ...}) = 0
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
mmap(NULL, 94208, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0e709e9000
mmap(0x7f0e709ec000, 53248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7f0e709ec000
mmap(0x7f0e709f9000, 20480, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x10000) = 0x7f0e709f9000
mmap(0x7f0e709fe000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x14000) = 0x7f0e709fe000
close(3)                                = 0
open("/lib/libz.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/libz.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/libz.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFREG|0755, st_size=104280, ...}) = 0
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
mmap(NULL, 110592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0e709ce000
mmap(0x7f0e709d1000, 61440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7f0e709d1000
mmap(0x7f0e709e0000, 28672, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x12000) = 0x7f0e709e0000
mmap(0x7f0e709e7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x18000) = 0x7f0e709e7000
close(3)                                = 0
open("/lib/libzstd.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/libzstd.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/libzstd.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFREG|0755, st_size=710336, ...}) = 0
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
mmap(NULL, 716800, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0e7091f000
mmap(0x7f0e70923000, 618496, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7f0e70923000
mmap(0x7f0e709ba000, 73728, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x9b000) = 0x7f0e709ba000
mmap(0x7f0e709cc000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xac000) = 0x7f0e709cc000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e7091e000
mprotect(0x7f0e709fe000, 4096, PROT_READ) = 0
mprotect(0x7f0e709e7000, 4096, PROT_READ) = 0
mprotect(0x7f0e709cc000, 4096, PROT_READ) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
membarrier(MEMBARRIER_CMD_PRIVATE_EXPEDITED, 0) = -1 EPERM (Operation not permitted)
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], ~[KILL STOP RTMIN RT_1 RT_2], 8) = 0
rt_sigaction(SIGRT_2, {sa_handler=0x7f0e70a4e5ac, sa_mask=~[], sa_flags=SA_RESTORER|SA_ONSTACK|SA_RESTART, sa_restorer=0x7f0e70a695a4}, NULL, 8) = 0
rt_sigaction(SIGRT_2, {sa_handler=SIG_IGN, sa_mask=~[], sa_flags=SA_RESTORER|SA_ONSTACK|SA_RESTART, sa_restorer=0x7f0e70a695a4}, NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, ~[KILL STOP RTMIN RT_1 RT_2], NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
open("/bin/zsh", O_RDONLY|O_LARGEFILE)  = 3
fcntl(3, F_GETFD)                       = 0
fstat(3, {st_mode=S_IFREG|0755, st_size=624192, ...}) = 0
pread64(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0006\360\0\0\0\0\0\0"..., 64, 0) = 64
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e7091c000
pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1664, 622528) = 1664
pread64(3, "\0.shstrtab\0.interp\0.note.gnu.pro"..., 234, 622293) = 234
mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e70914000
pread64(3, "bad pattern : %s\0no such hash ta"..., 30180, 499712) = 30180
munmap(0x7f0e70914000, 32768)           = 0
munmap(0x7f0e7091c000, 8192)            = 0
close(3)                                = 0
open("/proc/20983/stat", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
read(3, "20983 (kitty) S 1 20982 20982 0 "..., 8191) = 331
close(3)                                = 0
open("/proc/20983/cmdline", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "kitty\0", 4095)                = 6
read(3, "", 4089)                       = 0
close(3)                                = 0
mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0e7091a000
readlink("/proc/20983/exe", "/usr/bin/kitty", 4096) = 14
open("/usr/lib64/kitty/kitty/constants.py", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/dev/tty", O_RDWR|O_NOCTTY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
ioctl(3, TCGETS, {c_iflag=ICRNL|IXON|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0
ioctl(3, TCSETSF, {c_iflag=ICRNL|IXON|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0
write(3, "\33P+q6b697474792d71756572792d7665"..., 44) = 44
poll([{fd=3, events=POLLIN}], 1, 100)   = 1 ([{fd=3, revents=POLLIN}])
read(3, "\33P1+r6b697474792d71756572792d766"..., 1023) = 58
write(3, "\33P+q6b697474792d71756572792d666f"..., 95) = 95
poll([{fd=3, events=POLLIN}], 1, 100)   = 1 ([{fd=3, revents=POLLIN}])
read(3, "\33P1+r6b697474792d71756572792d666"..., 1023) = 148
ioctl(1, TIOCGWINSZ, {ws_row=50, ws_col=210, ws_xpixel=1890, ws_ypixel=1000}) = 0
writev(1, [{iov_base="\33[44CTerminal Font: NotoSansMono"..., iov_len=47}, {iov_base="\n", iov_len=1}], 2                                            Terminal Font: NotoSansMono-Regular (11pt)
) = 48
writev(1, [{iov_base="", iov_len=0}, {iov_base="\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", iov_len=19}], 2

) = 19
ioctl(3, TCSETSF, {c_iflag=ICRNL|IXON|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0
munmap(0x7f0e70a04000, 28672)           = 0
exit_group(0)                           = ?
+++ exited with 0 +++
CarterLi commented 3 weeks ago

Seems a dup of #1289 and should have been fixed in 29ae56e

Can you test the newest dev build?

UltimateNyn commented 3 weeks ago

It also crashes in that commit specifically for me image

CarterLi commented 3 weeks ago

Strange, I can't reproduce it myself.

Can you paste the output of echo -e '\eP+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65\e\\' for debugging?

CarterLi commented 3 weeks ago

Does this patch help?

diff --git a/src/detection/terminalfont/terminalfont.c b/src/detection/terminalfont/terminalfont.c
index e992f789..fbd02636 100644
--- a/src/detection/terminalfont/terminalfont.c
+++ b/src/detection/terminalfont/terminalfont.c
@@ -77,12 +77,12 @@ FF_MAYBE_UNUSED static bool detectKitty(const FFstrbuf* exe, FFTerminalFontResul
     FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate();
     FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate();

-    char fontHex[512] = "", sizeHex[512] = "";
+    char fontHex[1024] = "", sizeHex[1024] = "";
     // https://github.com/fastfetch-cli/fastfetch/discussions/1030#discussioncomment-9845233
     if (ffGetTerminalResponse(
         "\eP+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65\e\\", // kitty-query-font_family;kitty-query-font_size
         2,
-        "\eP1+r%*[^=]=%512[^\e]\e\\\eP1+r%*[^=]=%512[^\e]\e\\", fontHex, sizeHex) == NULL && *fontHex && *sizeHex)
+        "\eP1+r%*[^=]=%1023[^\e]\e\\\eP1+r%*[^=]=%1023[^\e]\e\\", fontHex, sizeHex) == NULL && *fontHex && *sizeHex)
     {
         // decode hex string
         for (const char* p = fontHex; p[0] && p[1]; p += 2)
UltimateNyn commented 3 weeks ago

It seems like it does something strange due to shell stuff. ZSH: image

Sometimes it also returns ^[P1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172^[\ image

Bash: :1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172^[\ image

UltimateNyn commented 3 weeks ago

Wait I will test the patch now

CarterLi commented 3 weeks ago

It seems like it does something strange due to shell stuff. ZSH: image

Sometimes it also returns ^[P1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172^[\ image

Bash: :1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172^[\ image

Sorry. There should not be a whitespace after 792d7

UltimateNyn commented 3 weeks ago

Still crashes with the patch

UltimateNyn commented 3 weeks ago

Zsh output: 6cho65=3131 -e 'echo -e '\eP+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65\e\\'\eP+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65\e\\' image

Bash output: :1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172^[\^[P1+r6b697474792d71756572792d666f6e745f73697a65=3131^[\ image

CarterLi commented 3 weeks ago

It's HackNFM-Regular (11pt)

The code works completely fine for me. Really don't know how to debug it...

CarterLi commented 3 weeks ago

Let me add some debug output

UltimateNyn commented 3 weeks ago

Also added a fprintf(stderr, "Buffer for query %s is %s\n", request, buffer); already just before the crashing vsscanf. The output is

Buffer for query ^[P+q6b697474792d71756572792d76657273696f6e^[\ is ^[P1+r6b697474792d71756572792d76657273696f6e=302e33362e34^[\
Buffer for query ^[P+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65^[\ is ^[P1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172^[\
Buffer for query ^[P+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65^[\ is ^[P1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172^[\^[P1+r6b697474792d71756572792d666f6e745f73697a65=3131^[\

(Captured via a stderr redirect and outputted with cat -v)

CarterLi commented 3 weeks ago

Doesn't seem problematic.

Please follow instructions bellow:

  1. apply this patch
diff --git a/src/common/io/io_unix.c b/src/common/io/io_unix.c
index c29b43a9..537da1a1 100644
--- a/src/common/io/io_unix.c
+++ b/src/common/io/io_unix.c
@@ -11,6 +11,7 @@
 #else
 #include <sys/select.h>
 #endif
+#include <signal.h>

 #if FF_HAVE_WORDEXP
     #include <wordexp.h>
@@ -216,6 +217,8 @@ const char* ffGetTerminalResponse(const char* request, int nParams, const char*
         bytesRead += (size_t) nRead;
         buffer[bytesRead] = '\0';

+        if (strstr(buffer, "\e\\\eP1")) raise(SIGTRAP);
+
         int ret = vsscanf(buffer, format, args);
         if (ret <= 0)
         {
  1. Compile fastfetch in debug mode with cmake . -DCMAKE_BUILD_TYPE=Debug
  2. Maximum your terminal
  3. gdb ./fastfetch
  4. run -s terminalfont -l none
  5. bt full
  6. Paste the screenshot

It should be like

image

UltimateNyn commented 3 weeks ago

Output as text:

#0  __restore_sigs (set=set@entry=0x7fffffffd5e0) at ./arch/x86_64/syscall_arch.h:40
No locals.
#1  0x00007ffff7fb6e1b in raise (sig=<optimized out>) at src/signal/raise.c:11
        set = {__bits = {0, 0, 0, 0, 0, 18446744073709551615, 0, 140737488344916, 0, 140737353870517, 140737354128228, 0, 18446744073709551615, 5, 140737488346048, 93824994182567}}
        ret = 0
#2  0x00005555556f8828 in ffGetTerminalResponse (request=0x55555576cf20 "\033P+q6b697474792d71756572792d666f6e745f66616d696c79;6b697474792d71756572792d666f6e745f73697a65\033\\", nParams=2, 
    format=0x55555576cef0 "\033P1+r%*[^=]=%512[^\033]\033\\\033P1+r%*[^=]=%512[^\033]\033\\") at /tmp/a/fastfetch/src/common/io/io_unix.c:220
        nRead = 54
        ret = 1
        buffer = "\033P1+r6b697474792d71756572792d666f6e745f66616d696c79=4861636b4e464d2d526567756c6172\033\\\033P1+r6b697474792d71756572792d666f6e745f73697a65=3131\033\\\000\367\377\177\000\000So\205%\000\000\000\000\260\331\377\377\377\177\000\000\000\000\000\000\000\000\000\000\260\331\377\377\377\177\000\0004\000\000\000\000\000\000\000\210\f\370\367\377\177\000\000\260\331\377\377\377\177\000\000"...
        bytesRead = 138
        args = {{gp_offset = 32, fp_offset = 48, overflow_arg_area = 0x7fffffffdbd0, reg_save_area = 0x7fffffffdb10}}
#3  0x000055555559105a in detectKitty (exe=0x555555818830 <result+16>, result=0x7fffffffe0f0) at /tmp/a/fastfetch/src/detection/terminalfont/terminalfont.c:82
        fontName = {allocated = 0, length = 0, chars = 0x5555557c1814 ""}
        fontSize = {allocated = 0, length = 0, chars = 0x5555557c1814 ""}
        fontHex = "4861636b4e464d2d526567756c6172", '\000' <repeats 481 times>
        sizeHex = '\000' <repeats 511 times>
#4  0x0000555555591800 in detectTerminalFontCommon (terminal=0x555555818820 <result>, terminalFont=0x7fffffffe0f0) at /tmp/a/fastfetch/src/detection/terminalfont/terminalfont.c:238
No locals.
#5  0x000055555559188c in ffDetectTerminalFont (result=0x7fffffffe0f0) at /tmp/a/fastfetch/src/detection/terminalfont/terminalfont.c:256
        terminal = 0x555555818820 <result>
#6  0x000055555568f52c in ffPrintTerminalFont (options=0x555555816e00 <instance+9184>) at /tmp/a/fastfetch/src/modules/terminalfont/terminalfont.c:17
        terminalFont = {error = {allocated = 0, length = 0, chars = 0x5555557c1814 ""}, font = {pretty = {allocated = 0, length = 0, chars = 0x5555557c1814 ""}, name = {allocated = 0, length = 0, 
              chars = 0x5555557c1814 ""}, size = {allocated = 0, length = 0, chars = 0x5555557c1814 ""}, styles = {data = 0x0, elementSize = 16, length = 0, capacity = 0}}, fallback = {pretty = {allocated = 0, 
              length = 0, chars = 0x5555557c1814 ""}, name = {allocated = 0, length = 0, chars = 0x5555557c1814 ""}, size = {allocated = 0, length = 0, chars = 0x5555557c1814 ""}, styles = {data = 0x0, 
              elementSize = 16, length = 0, capacity = 0}}}
#7  0x000055555557b49a in parseStructureCommand (line=0x555555818ce0 "terminalfont", fn=0x55555557a704 <genJsonResult>, jsonDoc=0x0) at /tmp/a/fastfetch/src/common/commandoption.c:97
        baseInfo = 0x555555816e00 <instance+9184>
        modules = 0x5555558142c8 <T+8>
#8  0x000055555557b5a9 in ffPrintCommandOption (data=0x7fffffffe440, jsonDoc=0x0) at /tmp/a/fastfetch/src/common/commandoption.c:120
        colonIndex = 12
        ms = 0
        thres = -1
        startIndex = 0
#9  0x000055555572fd92 in run (data=0x7fffffffe440) at /tmp/a/fastfetch/src/fastfetch.c:671
        useJsonConfig = false
#10 0x000055555573066b in main (argc=5, argv=0x7fffffffe4a8) at /tmp/a/fastfetch/src/fastfetch.c:731
        data = {structure = {allocated = 32, length = 12, chars = 0x555555818ce0 "terminalfont"}, configLoaded = false}

image

CarterLi commented 3 weeks ago

I think I know what the problem is. It's because I'm reusing va_arg. Completely missed that...

CarterLi commented 3 weeks ago

Please test the dev branch

UltimateNyn commented 3 weeks ago

It's now working without crash. Thank you