From 591851cd5e6234052bf5a11e52e6eb8d6d55fe62 Mon Sep 17 00:00:00 2001 From: Bernardo Meurer Costa Date: Sat, 11 Oct 2025 19:36:51 +0000 Subject: [PATCH] fix(libstore/find-cycles): use readFull for robust file reading Replaced raw `read()` with `readFull()` helper, which properly handles partial reads and `EINTR`. The previous code manually checked for errors but didn't handle the case where `read()` returns fewer bytes than requested. --- src/libstore/build/find-cycles.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/libstore/build/find-cycles.cc b/src/libstore/build/find-cycles.cc index d4562896c..75f4fedb4 100644 --- a/src/libstore/build/find-cycles.cc +++ b/src/libstore/build/find-cycles.cc @@ -107,14 +107,13 @@ void scanForCycleEdges2(const std::string & path, CycleEdgeScanSink & sink) // Stream file contents into sink // RefScanSink handles buffer boundaries automatically std::vector buf(65536); - while (true) { - ssize_t n = read(fd.get(), buf.data(), buf.size()); - if (n == -1) - throw SysError("reading file '%1%'", path); - if (n == 0) - break; + size_t remaining = st.st_size; - sink(std::string_view(buf.data(), n)); + while (remaining > 0) { + size_t toRead = std::min(remaining, buf.size()); + readFull(fd.get(), buf.data(), toRead); + sink(std::string_view(buf.data(), toRead)); + remaining -= toRead; } } else if (S_ISDIR(st.st_mode)) { // Handle directories - recursively scan contents