* [PATCH 1/2] gatppp: Check ppp instance before unref it @ 2010-07-06 9:57 Zhenhua Zhang 2010-07-06 9:57 ` [PATCH 2/2] gathdlc: Unset disconnect function in unref Zhenhua Zhang 2010-07-06 12:48 ` [PATCH 1/2] gatppp: Check ppp instance before unref it Marcel Holtmann 0 siblings, 2 replies; 7+ messages in thread From: Zhenhua Zhang @ 2010-07-06 9:57 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 435 bytes --] --- gatchat/gatppp.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c index 1d41ded..d9b1627 100644 --- a/gatchat/gatppp.c +++ b/gatchat/gatppp.c @@ -446,6 +446,9 @@ void g_at_ppp_unref(GAtPPP *ppp) { gboolean is_zero; + if (ppp == NULL) + return; + is_zero = g_atomic_int_dec_and_test(&ppp->ref_count); if (is_zero == FALSE) -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] gathdlc: Unset disconnect function in unref 2010-07-06 9:57 [PATCH 1/2] gatppp: Check ppp instance before unref it Zhenhua Zhang @ 2010-07-06 9:57 ` Zhenhua Zhang 2010-07-06 10:03 ` Zhang, Zhenhua 2010-07-06 16:28 ` Denis Kenzior 2010-07-06 12:48 ` [PATCH 1/2] gatppp: Check ppp instance before unref it Marcel Holtmann 1 sibling, 2 replies; 7+ messages in thread From: Zhenhua Zhang @ 2010-07-06 9:57 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 531 bytes --] If we destroy PPP instance from g_at_ppp_unref, we should not invoke io disconnect function. --- gatchat/gathdlc.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/gatchat/gathdlc.c b/gatchat/gathdlc.c index 08a1939..0186e46 100644 --- a/gatchat/gathdlc.c +++ b/gatchat/gathdlc.c @@ -278,6 +278,7 @@ void g_at_hdlc_unref(GAtHDLC *hdlc) hdlc->record_fd = -1; } + g_at_io_set_disconnect_function(hdlc->io, NULL, NULL); g_at_io_unref(hdlc->io); hdlc->io = NULL; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* RE: [PATCH 2/2] gathdlc: Unset disconnect function in unref 2010-07-06 9:57 ` [PATCH 2/2] gathdlc: Unset disconnect function in unref Zhenhua Zhang @ 2010-07-06 10:03 ` Zhang, Zhenhua 2010-07-06 16:45 ` Denis Kenzior 2010-07-06 16:28 ` Denis Kenzior 1 sibling, 1 reply; 7+ messages in thread From: Zhang, Zhenhua @ 2010-07-06 10:03 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 2696 bytes --] Hi, Zhenhua Zhang wrote: > If we destroy PPP instance from g_at_ppp_unref, we should not invoke > io disconnect function. --- > gatchat/gathdlc.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/gatchat/gathdlc.c b/gatchat/gathdlc.c > index 08a1939..0186e46 100644 > --- a/gatchat/gathdlc.c > +++ b/gatchat/gathdlc.c > @@ -278,6 +278,7 @@ void g_at_hdlc_unref(GAtHDLC *hdlc) > hdlc->record_fd = -1; } > > + g_at_io_set_disconnect_function(hdlc->io, NULL, NULL); > g_at_io_unref(hdlc->io); hdlc->io = NULL; Here the problem is that disconnect function could be invoked if remote IO is disconnected after our ppp instance is freed. So we should avoid to invoke io_disconnect() in below case. Entering new phase: 5 PPP: lcp: pppcp_timeout: current state 5:STOPPING PPP: lcp: pppcp_generate_event: current state 5:STOPPING PPP: event: 5 (TO-), action: 803, new_state: 3 (STOPPED) PPP: lcp: pppcp_this_layer_finished: current state 3:STOPPED Entering new phase: 0 ofonod[3114]: src/emulator.c:ppp_disconnect() Server: > \r\nNO CARRIER\r\n ofonod[3114]: Pcui:< \r\n^BOOT:20291346,0,0,0,20\r\n Server: < AT+CFUN=0\r ofonod[3114]: src/emulator.c:cfun_cb() set CFUN to 0 Server: > \r\nOK\r\n (gdb) bt #0 0x0806faf6 in pppcp_generate_event (data=0x95bfde0, event_type=DOWN, packet=0x0, len=0) at gatchat/ppp_cp.c:638 #1 0x0806e9cd in io_disconnect (user_data=0x95bfde8) at gatchat/gatppp.c:349 #2 0x001ea504 in g_source_callback_unref (cb_data=0x95a8678) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:1077 #3 0x001eaace in g_source_destroy_internal (source=0x95a86b0, context=<value optimized out>, have_lock=1) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:856 #4 0x001eaedb in g_main_dispatch (context=0x95a5f80) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:1985 #5 IA__g_main_context_dispatch (context=0x95a5f80) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:2513 #6 0x001ee730 in g_main_context_iterate (context=0x95a5f80, block=<value optimized out>, dispatch=1, self=0x95a6c58) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:2591 #7 0x001eeb9f in IA__g_main_loop_run (loop=0x95a5ef0) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:2799 #8 0x08094548 in main (argc=1, argv=0xbffb8ba4) at src/main.c:227 (gdb) frame 1 #1 0x0806e9cd in io_disconnect (user_data=0x95bfde8) at gatchat/gatppp.c:349 349 pppcp_signal_down(ppp->lcp); (gdb) p ppp $6 = <value optimized out> (gdb) info local No locals. (gdb) > -- > 1.6.3.3 > > _______________________________________________ > ofono mailing list > ofono(a)ofono.org > http://lists.ofono.org/listinfo/ofono Regards, Zhenhua ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] gathdlc: Unset disconnect function in unref 2010-07-06 10:03 ` Zhang, Zhenhua @ 2010-07-06 16:45 ` Denis Kenzior 0 siblings, 0 replies; 7+ messages in thread From: Denis Kenzior @ 2010-07-06 16:45 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 2241 bytes --] Hi Zhenhua, > Here the problem is that disconnect function could be invoked if remote IO is disconnected after our ppp instance is freed. So we should avoid to invoke io_disconnect() in below case. > > Entering new phase: 5 > PPP: lcp: pppcp_timeout: current state 5:STOPPING > PPP: lcp: pppcp_generate_event: current state 5:STOPPING > PPP: event: 5 (TO-), action: 803, new_state: 3 (STOPPED) > PPP: lcp: pppcp_this_layer_finished: current state 3:STOPPED > Entering new phase: 0 > ofonod[3114]: src/emulator.c:ppp_disconnect() > Server: > \r\nNO CARRIER\r\n > ofonod[3114]: Pcui:< \r\n^BOOT:20291346,0,0,0,20\r\n > Server: < AT+CFUN=0\r > ofonod[3114]: src/emulator.c:cfun_cb() set CFUN to 0 > Server: > \r\nOK\r\n > > > (gdb) bt > #0 0x0806faf6 in pppcp_generate_event (data=0x95bfde0, event_type=DOWN, packet=0x0, len=0) > at gatchat/ppp_cp.c:638 > #1 0x0806e9cd in io_disconnect (user_data=0x95bfde8) at gatchat/gatppp.c:349 > #2 0x001ea504 in g_source_callback_unref (cb_data=0x95a8678) > at /build/buildd/glib2.0-2.22.3/glib/gmain.c:1077 > #3 0x001eaace in g_source_destroy_internal (source=0x95a86b0, context=<value optimized out>, have_lock=1) > at /build/buildd/glib2.0-2.22.3/glib/gmain.c:856 > #4 0x001eaedb in g_main_dispatch (context=0x95a5f80) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:1985 > #5 IA__g_main_context_dispatch (context=0x95a5f80) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:2513 > #6 0x001ee730 in g_main_context_iterate (context=0x95a5f80, block=<value optimized out>, dispatch=1, > self=0x95a6c58) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:2591 > #7 0x001eeb9f in IA__g_main_loop_run (loop=0x95a5ef0) at /build/buildd/glib2.0-2.22.3/glib/gmain.c:2799 > #8 0x08094548 in main (argc=1, argv=0xbffb8ba4) at src/main.c:227 > (gdb) frame 1 > #1 0x0806e9cd in io_disconnect (user_data=0x95bfde8) at gatchat/gatppp.c:349 > 349 pppcp_signal_down(ppp->lcp); > (gdb) p ppp > $6 = <value optimized out> > (gdb) info local > No locals. > (gdb) It seems the real culprit is that GAtServer is not restoring the io_disconnect on the GAtIO object in g_at_server_resume. Why are we not seeing this crash in test-server? Regards, -Denis ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] gathdlc: Unset disconnect function in unref 2010-07-06 9:57 ` [PATCH 2/2] gathdlc: Unset disconnect function in unref Zhenhua Zhang 2010-07-06 10:03 ` Zhang, Zhenhua @ 2010-07-06 16:28 ` Denis Kenzior 2010-07-07 1:32 ` Zhang, Zhenhua 1 sibling, 1 reply; 7+ messages in thread From: Denis Kenzior @ 2010-07-06 16:28 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 586 bytes --] Hi Zhenhua, > @@ -278,6 +278,7 @@ void g_at_hdlc_unref(GAtHDLC *hdlc) > hdlc->record_fd = -1; > } > > + g_at_io_set_disconnect_function(hdlc->io, NULL, NULL); Since GAtHDLC does not set the disconnect function, this really belongs in GAtPPP. > g_at_io_unref(hdlc->io); > hdlc->io = NULL; > However, I really question why this patch is necessary. The only way the disconnect function is not reset today is if the GAtIO is refed and g_at_chat_resume is not called. We do call g_at_io_set_disconnect function in g_at_chat_resume. Regards, -Denis ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 2/2] gathdlc: Unset disconnect function in unref 2010-07-06 16:28 ` Denis Kenzior @ 2010-07-07 1:32 ` Zhang, Zhenhua 0 siblings, 0 replies; 7+ messages in thread From: Zhang, Zhenhua @ 2010-07-07 1:32 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 949 bytes --] Hi Denis, Denis Kenzior wrote: > Hi Zhenhua, > >> @@ -278,6 +278,7 @@ void g_at_hdlc_unref(GAtHDLC *hdlc) >> hdlc->record_fd = -1; } >> >> + g_at_io_set_disconnect_function(hdlc->io, NULL, NULL); > > Since GAtHDLC does not set the disconnect function, this really > belongs in GAtPPP. How about unset io_disconnect() in GAtPPP? Since GAtPPP doesn't have suspend/resume, the io_disconnect always exist until ppp is dead. >> g_at_io_unref(hdlc->io); >> hdlc->io = NULL; >> > > However, I really question why this patch is necessary. The only way > the disconnect function is not reset today is if the GAtIO is refed > and g_at_chat_resume is not called. > > We do call g_at_io_set_disconnect function in g_at_chat_resume. Good catch. I fixed it in gatserver and will send a patch out soon. Yes, after reset the disconnect function, the problem is gone. > Regards, > -Denis Regards, Zhenhua ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] gatppp: Check ppp instance before unref it 2010-07-06 9:57 [PATCH 1/2] gatppp: Check ppp instance before unref it Zhenhua Zhang 2010-07-06 9:57 ` [PATCH 2/2] gathdlc: Unset disconnect function in unref Zhenhua Zhang @ 2010-07-06 12:48 ` Marcel Holtmann 1 sibling, 0 replies; 7+ messages in thread From: Marcel Holtmann @ 2010-07-06 12:48 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 697 bytes --] Hi Zhenhua, > --- > gatchat/gatppp.c | 3 +++ > 1 files changed, 3 insertions(+), 0 deletions(-) > > diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c > index 1d41ded..d9b1627 100644 > --- a/gatchat/gatppp.c > +++ b/gatchat/gatppp.c > @@ -446,6 +446,9 @@ void g_at_ppp_unref(GAtPPP *ppp) > { > gboolean is_zero; > > + if (ppp == NULL) > + return; > + > is_zero = g_atomic_int_dec_and_test(&ppp->ref_count); > > if (is_zero == FALSE) since we have been safe-guarding this in other unref functions as well, I also applied this patch. In general the calling code is doing something wrong here if it tries to unref a NULL pointer. Regards Marcel ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-07-07 1:32 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-07-06 9:57 [PATCH 1/2] gatppp: Check ppp instance before unref it Zhenhua Zhang 2010-07-06 9:57 ` [PATCH 2/2] gathdlc: Unset disconnect function in unref Zhenhua Zhang 2010-07-06 10:03 ` Zhang, Zhenhua 2010-07-06 16:45 ` Denis Kenzior 2010-07-06 16:28 ` Denis Kenzior 2010-07-07 1:32 ` Zhang, Zhenhua 2010-07-06 12:48 ` [PATCH 1/2] gatppp: Check ppp instance before unref it Marcel Holtmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox