{"record":{"id":"faf976e7303589df","repo":"kovidgoyal/kitty","slug":"incomplete-signal-read-from-signalfd","errorCode":null,"errorMessage":"Incomplete signal read from signalfd","messagePattern":"Incomplete signal read from signalfd","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kitty/loop-utils.c","lineNumber":155,"sourceCode":"\n\nvoid\nread_signals(int fd, handle_signal_func callback, void *data) {\n#ifdef HAS_SIGNAL_FD\n    static struct signalfd_siginfo fdsi[32];\n    siginfo_t si;\n    while (true) {\n        ssize_t s = read(fd, &fdsi, sizeof(fdsi));\n        if (s < 0) {\n            if (errno == EINTR) continue;\n            if (errno == EAGAIN) break;\n            log_error(\"Call to read() from read_signals() failed with error: %s\", strerror(errno));\n            break;\n        }\n        if (s == 0) break;\n        size_t num_signals = s / sizeof(struct signalfd_siginfo);\n        if (num_signals == 0 || num_signals * sizeof(struct signalfd_siginfo) != (size_t)s) {\n            log_error(\"Incomplete signal read from signalfd\");\n            break;\n        }\n        for (size_t i = 0; i < num_signals; i++) {\n            si.si_signo = fdsi[i].ssi_signo;\n            si.si_code = fdsi[i].ssi_code;\n            si.si_pid = fdsi[i].ssi_pid;\n            si.si_uid = fdsi[i].ssi_uid;\n            si.si_addr = (void *)(uintptr_t)fdsi[i].ssi_addr;\n            si.si_status = fdsi[i].ssi_status;\n            si.si_value.sival_int = fdsi[i].ssi_int;\n            if (!callback(&si, data)) break;\n        }\n    }\n#else\n    static char buf[sizeof(siginfo_t) * 8];\n    static size_t buf_pos = 0;\n    while (true) {\n        ssize_t len = read(fd, buf + buf_pos, sizeof(buf) - buf_pos);","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/loop-utils.c#L137-L173","documentation":"read() from signalfd returned a size that is zero or not a whole multiple of sizeof(struct signalfd_siginfo), which should never happen with a correctly sized buffer; the loop bails for this iteration.","triggerScenarios":"Kernel/libc inconsistency or memory corruption producing a partial signalfd_siginfo record.","commonSituations":"Essentially never observed; would indicate a kernel bug, incompatible libc, or memory corruption.","solutions":["Rule out kernel/libc oddities (reboot, update system)","Upgrade kitty","Report upstream with kernel version if reproducible"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Nothing user-side; keep kernel and kitty updated"],"tags":["kitty","signalfd","linux","internal"],"backgroundTag":"partial-read","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}