Re: SEGV in pjsip due to race condition (+ patch)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Martin,

I've committed the patch in ticket #2079
(https://trac.pjsip.org/repos/ticket/2079).

Thanks for such detailed report and analysis as well as the patch.
And thanks to Oren for bumping this post up.

Best regards,
Ming

On Sun, Jan 7, 2018 at 9:07 PM, Oren Barash <oren.elbitsystems@xxxxxxxxx> wrote:
> Hello All,
>
> I am also experiencing SEGV on Android regarding the same issue.
> After phone loses signal, when getting it back the phone might connect to
> and 2g network, the jump to 3g or 4g.
> When it “jumps” between networks, the android ConnectivityManager publishes
> network disconnection and then connection.
>
> So when we try to remove the account and re create it, in some rear
> situation PJSIP just crushes with SEGV.
>
> What the PJ owners think about this patch ?
>
> Thanks,
> Oren
>
>
>
>
> On 3 Jan 2018, at 16:58, Martin Oberhuber <mober.at@xxxxxxxxx> wrote:
>
> Dear PJSIP project,
>
> I've come across a SEGV in pjproject-2.6 on Linux under the following
> circumstances:
>
> An active account re-registers
> The re-registration fails (in my case, DNS resolution timeout after 10
> seconds)
> At exactly the same time, the keep-alive timer fires.
>
> The issue was consistently reproducible for me under a very high network
> load, with the re-registration interval set to 5 seconds, DNS timeout
> default (10 seconds) and keepalive interval default (15 seconds). Since 5+10
> seconds == 15 seconds, the 2 events coincide and lead to the following
> backtrace:
>
> Thread #1 (Suspended : Signal : SIGSEGV:Segmentation fault)
> keep_alive_timer_cb() at pjsua_acc.c:1,981 0x76bcb424
> pj_timer_heap_poll() at timer.c:643 0x76e43244
> pjsip_endpt_handle_events2() at sip_endpoint.c:713 0x76cc0dd8
> worker_thread() at pjsua_core.c:695 0x76bde404
>
> Thread #2
> __pthread_mutex_unlock_usercnt() at pthread_mutex_unlock.c:66 0x4940a4d8
>
> __GI___pthread_mutex_unlock() at pthread_mutex_unlock.c:315 0x4940a588
> pj_mutex_unlock() at os_core_unix.c:1,323 0x76e4241c
> PJSUA_UNLOCK() at pjsua_internal.h:584 0x76be4244
> pjsua_acc_set_registration() at pjsua_acc.c:2,682 0x76be4244
> pj::Account::getInfo() at account.cpp:737 0x76e86438
>
> Analyzing the backtrace, I found 2 problems which are fixed in attached
> patch:
>
> timer.c: pj_timer_heap_poll places the timer onto the freelist and releases
> the global lock before calling the callback -- thus the callback may operate
> on a timer already freed! Proposed fix: keep timer_entry out of the freelist
> until the callback is done.
> pjsua_acc.c: Even with the 1st issue fixed, the account registration could
> still be canceled "exactly when the callback fires", because the lock is
> released before the callback ... thus putting NULL into the ka_transport
> thus causing the SEGV. Proposed fix: protect against NULL in ka_transport.
>
> While the patch is against pjroject-2.6 , I believe that the issue is still
> in latest trunk as well.
> Please let me know what you think about the attached patch, and consider it
> for inclusion in pjproject.
>
> Thanks,
> Martin
> --
>
> Martin Oberhuber | Software Architect, Project Lead & Consultant | Austria
>
> <pjproject-2.6-timer.patch>_______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip@xxxxxxxxxxxxxxx
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>
>
>
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip@xxxxxxxxxxxxxxx
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>

_______________________________________________
Visit our blog: http://blog.pjsip.org

pjsip mailing list
pjsip@xxxxxxxxxxxxxxx
http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org




[Index of Archives]     [Asterisk Users]     [Asterisk App Development]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [Linux API]
  Powered by Linux