commit:     411ec16fd4f149da43dd0121649db3943d724088
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Dec 13 13:09:54 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Dec 13 13:09:54 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=411ec16f

Fix CUSE read error handling

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 steve.cxx | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/steve.cxx b/steve.cxx
index b2ef505..d2a20da 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -88,6 +88,7 @@ struct steve_process {
 };
 
 struct steve_state {
+       int retval{0};
        const char *dev_name{"steve"};
        bool verbose;
        uint64_t jobs;
@@ -722,8 +723,16 @@ static void steve_handle_sigusr1(evutil_socket_t, short, 
void *userdata) {
 static void steve_handle_cuse(evutil_socket_t, short, void *userdata) {
        steve_state *state = static_cast<steve_state *>(userdata);
 
-       if (fuse_session_receive_buf(state->session, &state->buf) > 0)
-               fuse_session_process_buf(state->session, &state->buf);
+       int rd = fuse_session_receive_buf(state->session, &state->buf);
+       if (rd <= 0) {
+               state->retval = 1;
+               perror("Reading from CUSE failed");
+               if (event_base_loopbreak(state->evb) == -1) {
+                       std::print(stderr, "event_base_loopbreak() failed, 
forcing hard exit");
+                       exit(1);
+               }
+       }
+       fuse_session_process_buf(state->session, &state->buf);
 }
 
 static void steve_handle_recheck(evutil_socket_t, short, void *userdata) {
@@ -960,5 +969,5 @@ int main(int argc, char **argv)
 
        event_base_dispatch(evb.get());
        fuse_session_unmount(session.get());
-       return 0;
+       return state.retval;
 }

Reply via email to