1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-03-09 23:38:56 +00:00

miracle-dispd: fix session life-cycle managed issue

when a session is destroyed due to peer free event, dispd_out_session must
detach from sink to it won't cause double free.

Change-Id: I71ad7e977fa71ec84f12f5e914786aa24a650f34
This commit is contained in:
Derek Dai 2017-05-16 09:51:46 +08:00
parent 13b0de7dec
commit 65535afa44
No known key found for this signature in database
GPG key ID: E109CC97553EF009
5 changed files with 29 additions and 5 deletions

View file

@ -728,9 +728,14 @@ static int dispd_dbus_session_teardown(sd_bus_message *m,
sd_bus_error *ret_error) sd_bus_error *ret_error)
{ {
struct dispd_session *s = userdata; struct dispd_session *s = userdata;
int r = dispd_session_teardown(s); int r = 0;
if(dispd_session_is_established(s)) {
r = dispd_session_teardown(s);
}
if(0 > r) { if(0 > r) {
return log_ERRNO(); dispd_session_destroy(s);
} }
r = sd_bus_reply_method_return(m, NULL); r = sd_bus_reply_method_return(m, NULL);

View file

@ -902,6 +902,17 @@ static int dispd_out_session_request_set_parameter(struct dispd_session *s,
return 0; return 0;
} }
int dispd_fn_sink_detach(struct dispd_sink *sink)
{
assert_ret(sink);
assert_ret(dispd_is_out_session(sink->session));
dispd_out_session(sink->session)->sink = NULL;
return 0;
}
static const struct rtsp_dispatch_entry out_session_rtsp_disp_tbl[] = { static const struct rtsp_dispatch_entry out_session_rtsp_disp_tbl[] = {
[RTSP_M1_REQUEST_SINK_OPTIONS] = { [RTSP_M1_REQUEST_SINK_OPTIONS] = {
.request = dispd_out_session_request_options, .request = dispd_out_session_request_options,

View file

@ -165,7 +165,8 @@ bool dispd_session_is_established(struct dispd_session *s)
{ {
assert_retv(dispd_is_session(s), false); assert_retv(dispd_is_session(s), false);
return DISPD_SESSION_STATE_ESTABLISHED <= s->state; return DISPD_SESSION_STATE_ESTABLISHED <= s->state &&
DISPD_SESSION_STATE_TEARING_DOWN > s->state;
} }
int dispd_session_resume(struct dispd_session *s) int dispd_session_resume(struct dispd_session *s)

View file

@ -36,11 +36,12 @@ static int dispd_sink_set_session(struct dispd_sink *sink,
if(session) { if(session) {
r = dispd_add_session(dispd_get(), session); r = dispd_add_session(dispd_get(), session);
if(0 > r) { if(0 > r) {
return r; return log_ERR(r);
} }
} }
if(sink->session) { if(sink->session) {
dispd_fn_sink_detach(sink);
dispd_remove_session_by_id(dispd_get(), dispd_remove_session_by_id(dispd_get(),
dispd_session_get_id(sink->session), dispd_session_get_id(sink->session),
NULL); NULL);
@ -152,9 +153,14 @@ int dispd_sink_create_session(struct dispd_sink *sink, struct dispd_session **ou
int dispd_fn_out_session_ended(struct dispd_session *s) int dispd_fn_out_session_ended(struct dispd_session *s)
{ {
struct dispd_sink *sink;
assert_ret(dispd_is_out_session(s)); assert_ret(dispd_is_out_session(s));
dispd_sink_set_session(dispd_out_session_get_sink(s), NULL); sink = dispd_out_session_get_sink(s);
if(sink) {
dispd_sink_set_session(sink, NULL);
}
return 0; return 0;
} }

View file

@ -216,5 +216,6 @@ int dispd_fn_out_session_ended(struct dispd_session *s);
int dispd_fn_sink_new(struct dispd_sink *s); int dispd_fn_sink_new(struct dispd_sink *s);
int dispd_fn_sink_free(struct dispd_sink *s); int dispd_fn_sink_free(struct dispd_sink *s);
int dispd_fn_sink_detach(struct dispd_sink *s);
#endif /* DISP_DISP_H */ #endif /* DISP_DISP_H */