--- a/libidav/session.c Sat Feb 14 18:11:29 2026 +0100 +++ b/libidav/session.c Sat Jun 20 19:00:56 2026 +0200 @@ -38,6 +38,7 @@ #include "session.h" #include "resource.h" #include "methods.h" +#include "atomic.h" DavSession* dav_session_new(DavContext *context, char *base_url) { if(!base_url) { @@ -95,6 +96,9 @@ // add to context dav_context_add_session(context, sn); sn->context = context; + dav_context_ref(context); + + sn->ref = 1; return sn; } @@ -138,10 +142,23 @@ // add to context dav_context_add_session(sn->context, newsn); newsn->context = sn->context; + dav_context_ref(sn->context); + + newsn->ref = 1; return newsn; } +void dav_session_ref(DavSession *sn) { + dav_atomic_inc32(&sn->ref); +} + +void dav_session_unref(DavSession *sn) { + if(dav_atomic_dec32(&sn->ref) == 0) { + dav_session_destroy(sn); + } +} + void dav_session_set_auth(DavSession *sn, const char *user, const char *password) { if(user && password) { dav_session_set_auth_s(sn, cx_str(user), cx_str(password)); @@ -344,15 +361,19 @@ void dav_session_destroy(DavSession *sn) { // remove session from context - if (dav_context_remove_session(sn->context, sn)) { + DavContext *ctx = sn->context; + dav_context_ref(ctx); + if (dav_context_remove_session(ctx, sn)) { fprintf(stderr, "Error: session not found in ctx->sessions\n"); dav_session_destructor(sn); } + dav_context_unref(ctx); } void dav_session_destructor(DavSession *sn) { cxMempoolFree(sn->mp); curl_easy_cleanup(sn->handle); + dav_context_unref(sn->context); free(sn); }