1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-02-15 04:42:06 +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)
{
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) {
return log_ERRNO();
dispd_session_destroy(s);
}
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;
}
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[] = {
[RTSP_M1_REQUEST_SINK_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);
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)

View file

@ -36,11 +36,12 @@ static int dispd_sink_set_session(struct dispd_sink *sink,
if(session) {
r = dispd_add_session(dispd_get(), session);
if(0 > r) {
return r;
return log_ERR(r);
}
}
if(sink->session) {
dispd_fn_sink_detach(sink);
dispd_remove_session_by_id(dispd_get(),
dispd_session_get_id(sink->session),
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)
{
struct dispd_sink *sink;
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;
}

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_free(struct dispd_sink *s);
int dispd_fn_sink_detach(struct dispd_sink *s);
#endif /* DISP_DISP_H */