mirror of
https://github.com/obgm/libcoap.git
synced 2026-11-15 04:39:42 +03:00
coap_session.c: fix session release
coap_session_t uses reference counting hence client sessions must be released by coap_session_release() instead of directly calling coap_session_free().
This commit is contained in:
1 parent
08f7f5c2ce
commit
46c908af8f
1 file changed
+8
-8
+8
-8
@@ -447,6 +447,8 @@ coap_session_create_client(
|
|||||||
if (!session)
|
if (!session)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
coap_session_reference(session);
|
||||||
|
|
||||||
if (proto == COAP_PROTO_UDP || proto == COAP_PROTO_DTLS) {
|
if (proto == COAP_PROTO_UDP || proto == COAP_PROTO_DTLS) {
|
||||||
if (!coap_socket_connect_udp(&session->sock, &session->local_if, server,
|
if (!coap_socket_connect_udp(&session->sock, &session->local_if, server,
|
||||||
proto == COAP_PROTO_DTLS ? COAPS_DEFAULT_PORT : COAP_DEFAULT_PORT,
|
proto == COAP_PROTO_DTLS ? COAPS_DEFAULT_PORT : COAP_DEFAULT_PORT,
|
||||||
@@ -461,7 +463,6 @@ coap_session_create_client(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session->ref = 1;
|
|
||||||
session->sock.flags |= COAP_SOCKET_NOT_EMPTY | COAP_SOCKET_CONNECTED | COAP_SOCKET_WANT_READ;
|
session->sock.flags |= COAP_SOCKET_NOT_EMPTY | COAP_SOCKET_CONNECTED | COAP_SOCKET_WANT_READ;
|
||||||
if (local_if)
|
if (local_if)
|
||||||
session->sock.flags |= COAP_SOCKET_BOUND;
|
session->sock.flags |= COAP_SOCKET_BOUND;
|
||||||
@@ -469,8 +470,7 @@ coap_session_create_client(
|
|||||||
return session;
|
return session;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (session)
|
coap_session_release(session);
|
||||||
coap_session_free(session);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,7 +483,7 @@ coap_session_connect(coap_session_t *session) {
|
|||||||
if (session->tls) {
|
if (session->tls) {
|
||||||
session->state = COAP_SESSION_STATE_HANDSHAKE;
|
session->state = COAP_SESSION_STATE_HANDSHAKE;
|
||||||
} else {
|
} else {
|
||||||
coap_session_free(session);
|
coap_session_release(session);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else if (session->proto == COAP_PROTO_TCP || session->proto == COAP_PROTO_TLS) {
|
} else if (session->proto == COAP_PROTO_TCP || session->proto == COAP_PROTO_TLS) {
|
||||||
@@ -499,7 +499,7 @@ coap_session_connect(coap_session_t *session) {
|
|||||||
coap_session_send_csm(session);
|
coap_session_send_csm(session);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
coap_session_free(session);
|
coap_session_release(session);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -524,7 +524,7 @@ coap_session_accept(coap_session_t *session) {
|
|||||||
coap_session_send_csm(session);
|
coap_session_send_csm(session);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
coap_session_free(session);
|
coap_session_release(session);
|
||||||
session = NULL;
|
session = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -626,6 +626,7 @@ coap_session_t *coap_new_server_session(
|
|||||||
&ep->bind_addr, NULL, NULL, 0, ctx, ep );
|
&ep->bind_addr, NULL, NULL, 0, ctx, ep );
|
||||||
if (!session)
|
if (!session)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (!coap_socket_accept_tcp(&ep->sock, &session->sock,
|
if (!coap_socket_accept_tcp(&ep->sock, &session->sock,
|
||||||
&session->local_addr, &session->remote_addr))
|
&session->local_addr, &session->remote_addr))
|
||||||
goto error;
|
goto error;
|
||||||
@@ -639,8 +640,7 @@ coap_session_t *coap_new_server_session(
|
|||||||
return session;
|
return session;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (session)
|
coap_session_free(session);
|
||||||
coap_session_free(session);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user