commit:     91fe0302cdf417a9106c868f5d7d75ad34a94cbe
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 25 19:52:48 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Nov 25 19:52:48 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=91fe0302

Limit FUSE buffer memory leak

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

 steve.cxx | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/steve.cxx b/steve.cxx
index 555a0ba..51ece95 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -72,6 +72,11 @@ struct steve_state {
        std::deque<steve_poll_waiter> poll_waiters;
        std::unordered_map<uint64_t, steve_process> processes;
        struct event_base *evb;
+
+       /* to workaround lack of fuse_buf_free(), keep a global buffer */
+       /* https://github.com/libfuse/libfuse/issues/1373 */
+       struct fuse_session *session;
+       struct fuse_buf buf{0};
 };
 
 static void steve_wake_waiters(steve_state *state)
@@ -318,11 +323,10 @@ static void steve_handle_sigusr1(evutil_socket_t, short, 
void *userdata) {
 }
 
 static void steve_handle_cuse(evutil_socket_t, short, void *userdata) {
-       struct fuse_session *session = static_cast<struct fuse_session 
*>(userdata);
-       struct fuse_buf buf = {0};
+       steve_state *state = static_cast<steve_state *>(userdata);
 
-       if (fuse_session_receive_buf(session, &buf) > 0)
-               fuse_session_process_buf(session, &buf);
+       if (fuse_session_receive_buf(state->session, &state->buf) > 0)
+               fuse_session_process_buf(state->session, &state->buf);
 }
 
 static const char *steve_usage =
@@ -423,9 +427,10 @@ int main(int argc, char **argv)
                fprintf(stderr, "failed to initialize FUSE");
                return 1;
        }
+       state.session = session.get();
 
        std::unique_ptr<struct event, std::function<void(struct event*)>>
-               cuse_event{event_new(evb.get(), cuse_fd, EV_READ|EV_PERSIST, 
steve_handle_cuse, session.get()), event_free};
+               cuse_event{event_new(evb.get(), cuse_fd, EV_READ|EV_PERSIST, 
steve_handle_cuse, &state), event_free};
        if (!cuse_event) {
                fprintf(stderr, "failed to initialize CUSE handler");
                return 1;

Reply via email to