mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 20:20:07 +00:00
pjproject: Upgrade to 2.8.
This change brings in PJSIP 2.8, removes all the patches that were merged upstream, and makes a minor change to support a breaking change that was done. ASTERISK-28059 Change-Id: I5097772b11b0f95c3c1f52df6400158666f0a189
This commit is contained in:
85
configure
vendored
85
configure
vendored
@@ -912,6 +912,10 @@ PBX_POPT
|
|||||||
POPT_DIR
|
POPT_DIR
|
||||||
POPT_INCLUDE
|
POPT_INCLUDE
|
||||||
POPT_LIB
|
POPT_LIB
|
||||||
|
PBX_PJSIP_ENDPOINT_COMPACT_FORM
|
||||||
|
PJSIP_ENDPOINT_COMPACT_FORM_DIR
|
||||||
|
PJSIP_ENDPOINT_COMPACT_FORM_INCLUDE
|
||||||
|
PJSIP_ENDPOINT_COMPACT_FORM_LIB
|
||||||
PBX_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS
|
PBX_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS
|
||||||
PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS_DIR
|
PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS_DIR
|
||||||
PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS_INCLUDE
|
PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS_INCLUDE
|
||||||
@@ -1315,6 +1319,7 @@ infodir
|
|||||||
docdir
|
docdir
|
||||||
oldincludedir
|
oldincludedir
|
||||||
includedir
|
includedir
|
||||||
|
runstatedir
|
||||||
localstatedir
|
localstatedir
|
||||||
sharedstatedir
|
sharedstatedir
|
||||||
sysconfdir
|
sysconfdir
|
||||||
@@ -1501,6 +1506,7 @@ datadir='${datarootdir}'
|
|||||||
sysconfdir='${prefix}/etc'
|
sysconfdir='${prefix}/etc'
|
||||||
sharedstatedir='${prefix}/com'
|
sharedstatedir='${prefix}/com'
|
||||||
localstatedir='${prefix}/var'
|
localstatedir='${prefix}/var'
|
||||||
|
runstatedir='${localstatedir}/run'
|
||||||
includedir='${prefix}/include'
|
includedir='${prefix}/include'
|
||||||
oldincludedir='/usr/include'
|
oldincludedir='/usr/include'
|
||||||
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
||||||
@@ -1753,6 +1759,15 @@ do
|
|||||||
| -silent | --silent | --silen | --sile | --sil)
|
| -silent | --silent | --silen | --sile | --sil)
|
||||||
silent=yes ;;
|
silent=yes ;;
|
||||||
|
|
||||||
|
-runstatedir | --runstatedir | --runstatedi | --runstated \
|
||||||
|
| --runstate | --runstat | --runsta | --runst | --runs \
|
||||||
|
| --run | --ru | --r)
|
||||||
|
ac_prev=runstatedir ;;
|
||||||
|
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
|
||||||
|
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
|
||||||
|
| --run=* | --ru=* | --r=*)
|
||||||
|
runstatedir=$ac_optarg ;;
|
||||||
|
|
||||||
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
||||||
ac_prev=sbindir ;;
|
ac_prev=sbindir ;;
|
||||||
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
||||||
@@ -1890,7 +1905,7 @@ fi
|
|||||||
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
||||||
datadir sysconfdir sharedstatedir localstatedir includedir \
|
datadir sysconfdir sharedstatedir localstatedir includedir \
|
||||||
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
||||||
libdir localedir mandir
|
libdir localedir mandir runstatedir
|
||||||
do
|
do
|
||||||
eval ac_val=\$$ac_var
|
eval ac_val=\$$ac_var
|
||||||
# Remove trailing slashes.
|
# Remove trailing slashes.
|
||||||
@@ -2043,6 +2058,7 @@ Fine tuning of the installation directories:
|
|||||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||||
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
||||||
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
||||||
|
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
|
||||||
--libdir=DIR object code libraries [EPREFIX/lib]
|
--libdir=DIR object code libraries [EPREFIX/lib]
|
||||||
--includedir=DIR C header files [PREFIX/include]
|
--includedir=DIR C header files [PREFIX/include]
|
||||||
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
||||||
@@ -9406,6 +9422,9 @@ $as_echo "#define HAVE_PJSIP_TSX_LAYER_FIND_TSX2 1" >>confdefs.h
|
|||||||
$as_echo "#define HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS 1" >>confdefs.h
|
$as_echo "#define HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS 1" >>confdefs.h
|
||||||
|
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_PJSIP_ENDPOINT_COMPACT_FORM 1" >>confdefs.h
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -11548,6 +11567,18 @@ PBX_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS=0
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PJSIP_ENDPOINT_COMPACT_FORM_DESCRIP="PJSIP Compact Form Support on Endpoint"
|
||||||
|
PJSIP_ENDPOINT_COMPACT_FORM_OPTION=pjsip
|
||||||
|
PJSIP_ENDPOINT_COMPACT_FORM_DIR=${PJPROJECT_DIR}
|
||||||
|
|
||||||
|
PBX_PJSIP_ENDPOINT_COMPACT_FORM=0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@@ -15016,7 +15047,7 @@ else
|
|||||||
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
||||||
since some C++ compilers masquerading as C compilers
|
since some C++ compilers masquerading as C compilers
|
||||||
incorrectly reject 9223372036854775807. */
|
incorrectly reject 9223372036854775807. */
|
||||||
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
|
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
|
||||||
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
||||||
&& LARGE_OFF_T % 2147483647 == 1)
|
&& LARGE_OFF_T % 2147483647 == 1)
|
||||||
? 1 : -1];
|
? 1 : -1];
|
||||||
@@ -15062,7 +15093,7 @@ else
|
|||||||
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
||||||
since some C++ compilers masquerading as C compilers
|
since some C++ compilers masquerading as C compilers
|
||||||
incorrectly reject 9223372036854775807. */
|
incorrectly reject 9223372036854775807. */
|
||||||
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
|
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
|
||||||
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
||||||
&& LARGE_OFF_T % 2147483647 == 1)
|
&& LARGE_OFF_T % 2147483647 == 1)
|
||||||
? 1 : -1];
|
? 1 : -1];
|
||||||
@@ -15086,7 +15117,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|||||||
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
||||||
since some C++ compilers masquerading as C compilers
|
since some C++ compilers masquerading as C compilers
|
||||||
incorrectly reject 9223372036854775807. */
|
incorrectly reject 9223372036854775807. */
|
||||||
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
|
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
|
||||||
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
||||||
&& LARGE_OFF_T % 2147483647 == 1)
|
&& LARGE_OFF_T % 2147483647 == 1)
|
||||||
? 1 : -1];
|
? 1 : -1];
|
||||||
@@ -15131,7 +15162,7 @@ else
|
|||||||
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
||||||
since some C++ compilers masquerading as C compilers
|
since some C++ compilers masquerading as C compilers
|
||||||
incorrectly reject 9223372036854775807. */
|
incorrectly reject 9223372036854775807. */
|
||||||
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
|
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
|
||||||
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
||||||
&& LARGE_OFF_T % 2147483647 == 1)
|
&& LARGE_OFF_T % 2147483647 == 1)
|
||||||
? 1 : -1];
|
? 1 : -1];
|
||||||
@@ -15155,7 +15186,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|||||||
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
We can't simply define LARGE_OFF_T to be 9223372036854775807,
|
||||||
since some C++ compilers masquerading as C compilers
|
since some C++ compilers masquerading as C compilers
|
||||||
incorrectly reject 9223372036854775807. */
|
incorrectly reject 9223372036854775807. */
|
||||||
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
|
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
|
||||||
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
|
||||||
&& LARGE_OFF_T % 2147483647 == 1)
|
&& LARGE_OFF_T % 2147483647 == 1)
|
||||||
? 1 : -1];
|
? 1 : -1];
|
||||||
@@ -16455,6 +16486,8 @@ main ()
|
|||||||
if (*(data + i) != *(data3 + i))
|
if (*(data + i) != *(data3 + i))
|
||||||
return 14;
|
return 14;
|
||||||
close (fd);
|
close (fd);
|
||||||
|
free (data);
|
||||||
|
free (data3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
_ACEOF
|
_ACEOF
|
||||||
@@ -25415,6 +25448,46 @@ $as_echo "#define HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS 1" >>confdefs.h
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
CPPFLAGS="${saved_cppflags}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x${PBX_PJSIP_ENDPOINT_COMPACT_FORM}" != "x1" -a "${USE_PJSIP_ENDPOINT_COMPACT_FORM}" != "no"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if \"pjsip_cfg()->endpt.use_compact_form = PJ_TRUE;\" compiles using pjsip.h" >&5
|
||||||
|
$as_echo_n "checking if \"pjsip_cfg()->endpt.use_compact_form = PJ_TRUE;\" compiles using pjsip.h... " >&6; }
|
||||||
|
saved_cppflags="${CPPFLAGS}"
|
||||||
|
if test "x${PJSIP_ENDPOINT_COMPACT_FORM_DIR}" != "x"; then
|
||||||
|
PJSIP_ENDPOINT_COMPACT_FORM_INCLUDE="-I${PJSIP_ENDPOINT_COMPACT_FORM_DIR}/include"
|
||||||
|
fi
|
||||||
|
CPPFLAGS="${CPPFLAGS} ${PJSIP_ENDPOINT_COMPACT_FORM_INCLUDE}"
|
||||||
|
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <pjsip.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
pjsip_cfg()->endpt.use_compact_form = PJ_TRUE;;
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
PBX_PJSIP_ENDPOINT_COMPACT_FORM=1
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_PJSIP_ENDPOINT_COMPACT_FORM 1" >>confdefs.h
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
else
|
else
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
$as_echo "no" >&6; }
|
$as_echo "no" >&6; }
|
||||||
|
@@ -537,6 +537,7 @@ AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_INV_SESSION_REF], [PJSIP INVITE Session Refere
|
|||||||
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_AUTH_CLT_DEINIT], [pjsip_auth_clt_deinit support], [PJPROJECT], [pjsip])
|
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_AUTH_CLT_DEINIT], [pjsip_auth_clt_deinit support], [PJPROJECT], [pjsip])
|
||||||
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TSX_LAYER_FIND_TSX2], [pjsip_tsx_layer_find_tsx2 support], [PJPROJECT], [pjsip])
|
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TSX_LAYER_FIND_TSX2], [pjsip_tsx_layer_find_tsx2 support], [PJPROJECT], [pjsip])
|
||||||
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], [PJSIP INVITE Accept Multiple SDP Answers], [PJPROJECT], [pjsip])
|
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], [PJSIP INVITE Accept Multiple SDP Answers], [PJPROJECT], [pjsip])
|
||||||
|
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_ENDPOINT_COMPACT_FORM], [PJSIP Compact Form Support on Endpoint], [PJPROJECT], [pjsip])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AST_EXT_LIB_SETUP([POPT], [popt], [popt])
|
AST_EXT_LIB_SETUP([POPT], [popt], [popt])
|
||||||
@@ -2359,6 +2360,7 @@ if test "$USE_PJPROJECT" != "no" ; then
|
|||||||
LIBS="${LIBS} ${PJPROJECT_LIB}"
|
LIBS="${LIBS} ${PJPROJECT_LIB}"
|
||||||
AST_C_COMPILE_CHECK([PJSIP_TLS_TRANSPORT_PROTO], [struct pjsip_tls_setting setting; int proto; proto = setting.proto;], [pjsip.h])
|
AST_C_COMPILE_CHECK([PJSIP_TLS_TRANSPORT_PROTO], [struct pjsip_tls_setting setting; int proto; proto = setting.proto;], [pjsip.h])
|
||||||
AST_C_COMPILE_CHECK([PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], [pjsip_cfg()->endpt.accept_multiple_sdp_answers = 0;], [pjsip.h])
|
AST_C_COMPILE_CHECK([PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], [pjsip_cfg()->endpt.accept_multiple_sdp_answers = 0;], [pjsip.h])
|
||||||
|
AST_C_COMPILE_CHECK([PJSIP_ENDPOINT_COMPACT_FORM], [pjsip_cfg()->endpt.use_compact_form = PJ_TRUE;], [pjsip.h])
|
||||||
LIBS="${saved_libs}"
|
LIBS="${saved_libs}"
|
||||||
CPPFLAGS="${saved_cppflags}"
|
CPPFLAGS="${saved_cppflags}"
|
||||||
|
|
||||||
|
@@ -592,6 +592,9 @@
|
|||||||
Lock feature. */
|
Lock feature. */
|
||||||
#undef HAVE_PJSIP_DLG_CREATE_UAS_AND_INC_LOCK
|
#undef HAVE_PJSIP_DLG_CREATE_UAS_AND_INC_LOCK
|
||||||
|
|
||||||
|
/* Define if your system has the PJSIP_ENDPOINT_COMPACT_FORM headers. */
|
||||||
|
#undef HAVE_PJSIP_ENDPOINT_COMPACT_FORM
|
||||||
|
|
||||||
/* Define to 1 if PJPROJECT has the PJSIP EVSUB Group Lock support feature. */
|
/* Define to 1 if PJPROJECT has the PJSIP EVSUB Group Lock support feature. */
|
||||||
#undef HAVE_PJSIP_EVSUB_GRP_LOCK
|
#undef HAVE_PJSIP_EVSUB_GRP_LOCK
|
||||||
|
|
||||||
|
14
menuselect/configure
vendored
14
menuselect/configure
vendored
@@ -692,6 +692,7 @@ infodir
|
|||||||
docdir
|
docdir
|
||||||
oldincludedir
|
oldincludedir
|
||||||
includedir
|
includedir
|
||||||
|
runstatedir
|
||||||
localstatedir
|
localstatedir
|
||||||
sharedstatedir
|
sharedstatedir
|
||||||
sysconfdir
|
sysconfdir
|
||||||
@@ -772,6 +773,7 @@ datadir='${datarootdir}'
|
|||||||
sysconfdir='${prefix}/etc'
|
sysconfdir='${prefix}/etc'
|
||||||
sharedstatedir='${prefix}/com'
|
sharedstatedir='${prefix}/com'
|
||||||
localstatedir='${prefix}/var'
|
localstatedir='${prefix}/var'
|
||||||
|
runstatedir='${localstatedir}/run'
|
||||||
includedir='${prefix}/include'
|
includedir='${prefix}/include'
|
||||||
oldincludedir='/usr/include'
|
oldincludedir='/usr/include'
|
||||||
docdir='${datarootdir}/doc/${PACKAGE}'
|
docdir='${datarootdir}/doc/${PACKAGE}'
|
||||||
@@ -1024,6 +1026,15 @@ do
|
|||||||
| -silent | --silent | --silen | --sile | --sil)
|
| -silent | --silent | --silen | --sile | --sil)
|
||||||
silent=yes ;;
|
silent=yes ;;
|
||||||
|
|
||||||
|
-runstatedir | --runstatedir | --runstatedi | --runstated \
|
||||||
|
| --runstate | --runstat | --runsta | --runst | --runs \
|
||||||
|
| --run | --ru | --r)
|
||||||
|
ac_prev=runstatedir ;;
|
||||||
|
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
|
||||||
|
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
|
||||||
|
| --run=* | --ru=* | --r=*)
|
||||||
|
runstatedir=$ac_optarg ;;
|
||||||
|
|
||||||
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
||||||
ac_prev=sbindir ;;
|
ac_prev=sbindir ;;
|
||||||
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
||||||
@@ -1161,7 +1172,7 @@ fi
|
|||||||
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
||||||
datadir sysconfdir sharedstatedir localstatedir includedir \
|
datadir sysconfdir sharedstatedir localstatedir includedir \
|
||||||
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
||||||
libdir localedir mandir
|
libdir localedir mandir runstatedir
|
||||||
do
|
do
|
||||||
eval ac_val=\$$ac_var
|
eval ac_val=\$$ac_var
|
||||||
# Remove trailing slashes.
|
# Remove trailing slashes.
|
||||||
@@ -1314,6 +1325,7 @@ Fine tuning of the installation directories:
|
|||||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||||
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
||||||
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
||||||
|
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
|
||||||
--libdir=DIR object code libraries [EPREFIX/lib]
|
--libdir=DIR object code libraries [EPREFIX/lib]
|
||||||
--includedir=DIR C header files [PREFIX/include]
|
--includedir=DIR C header files [PREFIX/include]
|
||||||
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
||||||
|
@@ -114,9 +114,13 @@ static int system_apply(const struct ast_sorcery *system_sorcery, void *obj)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (system->compactheaders) {
|
if (system->compactheaders) {
|
||||||
|
#ifdef HAVE_PJSIP_ENDPOINT_COMPACT_FORM
|
||||||
|
pjsip_cfg()->endpt.use_compact_form = PJ_TRUE;
|
||||||
|
#else
|
||||||
extern pj_bool_t pjsip_use_compact_form;
|
extern pj_bool_t pjsip_use_compact_form;
|
||||||
|
|
||||||
pjsip_use_compact_form = PJ_TRUE;
|
pjsip_use_compact_form = PJ_TRUE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
sip_threadpool_options.initial_size = system->threadpool.initial_size;
|
sip_threadpool_options.initial_size = system->threadpool.initial_size;
|
||||||
|
1
third-party/pjproject/Makefile.rules
vendored
1
third-party/pjproject/Makefile.rules
vendored
@@ -30,7 +30,6 @@ PJPROJECT_CONFIG_OPTS = $(PJPROJECT_CONFIGURE_OPTS) --prefix=/opt/pjproject \
|
|||||||
--disable-v4l2 \
|
--disable-v4l2 \
|
||||||
--disable-sound \
|
--disable-sound \
|
||||||
--disable-ext-sound \
|
--disable-ext-sound \
|
||||||
--disable-oss \
|
|
||||||
--disable-sdl \
|
--disable-sdl \
|
||||||
--disable-libyuv \
|
--disable-libyuv \
|
||||||
--disable-ffmpeg \
|
--disable-ffmpeg \
|
||||||
|
1
third-party/pjproject/configure.m4
vendored
1
third-party/pjproject/configure.m4
vendored
@@ -105,6 +105,7 @@ AC_DEFUN([_PJPROJECT_CONFIGURE],
|
|||||||
AC_DEFINE([HAVE_PJSIP_AUTH_CLT_DEINIT], 1, [Define if your system has pjsip_auth_clt_deinit declared.])
|
AC_DEFINE([HAVE_PJSIP_AUTH_CLT_DEINIT], 1, [Define if your system has pjsip_auth_clt_deinit declared.])
|
||||||
AC_DEFINE([HAVE_PJSIP_TSX_LAYER_FIND_TSX2], 1, [Define if your system has pjsip_tsx_layer_find_tsx2 declared.])
|
AC_DEFINE([HAVE_PJSIP_TSX_LAYER_FIND_TSX2], 1, [Define if your system has pjsip_tsx_layer_find_tsx2 declared.])
|
||||||
AC_DEFINE([HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], 1, [Define if your system has HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS declared.])
|
AC_DEFINE([HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], 1, [Define if your system has HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS declared.])
|
||||||
|
AC_DEFINE([HAVE_PJSIP_ENDPOINT_COMPACT_FORM], 1, [Define if your system has HAVE_PJSIP_ENDPOINT_COMPACT_FORM declared.])
|
||||||
|
|
||||||
AC_SUBST([PJPROJECT_BUNDLED])
|
AC_SUBST([PJPROJECT_BUNDLED])
|
||||||
AC_SUBST([PJPROJECT_DIR])
|
AC_SUBST([PJPROJECT_DIR])
|
||||||
|
@@ -8,7 +8,7 @@ Subject: [PATCH 1/3] 0000-remove-third-party.patch
|
|||||||
1 file changed, 107 deletions(-)
|
1 file changed, 107 deletions(-)
|
||||||
|
|
||||||
diff --git a/build.mak.in b/build.mak.in
|
diff --git a/build.mak.in b/build.mak.in
|
||||||
index 6c263a9..36e7ff4 100644
|
index 80ccad12..41ec64ea 100644
|
||||||
--- a/build.mak.in
|
--- a/build.mak.in
|
||||||
+++ b/build.mak.in
|
+++ b/build.mak.in
|
||||||
@@ -1,4 +1,3 @@
|
@@ -1,4 +1,3 @@
|
||||||
@@ -16,7 +16,7 @@ index 6c263a9..36e7ff4 100644
|
|||||||
include $(PJDIR)/version.mak
|
include $(PJDIR)/version.mak
|
||||||
export PJ_DIR := $(PJDIR)
|
export PJ_DIR := $(PJDIR)
|
||||||
|
|
||||||
@@ -28,19 +27,6 @@ export APP_THIRD_PARTY_EXT :=
|
@@ -37,19 +36,6 @@ export APP_THIRD_PARTY_EXT :=
|
||||||
export APP_THIRD_PARTY_LIBS :=
|
export APP_THIRD_PARTY_LIBS :=
|
||||||
export APP_THIRD_PARTY_LIB_FILES :=
|
export APP_THIRD_PARTY_LIB_FILES :=
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ index 6c263a9..36e7ff4 100644
|
|||||||
ifeq (@ac_pjmedia_resample@,libresample)
|
ifeq (@ac_pjmedia_resample@,libresample)
|
||||||
APP_THIRD_PARTY_LIB_FILES += $(PJ_DIR)/third_party/lib/libresample-$(LIB_SUFFIX)
|
APP_THIRD_PARTY_LIB_FILES += $(PJ_DIR)/third_party/lib/libresample-$(LIB_SUFFIX)
|
||||||
ifeq ($(PJ_SHARED_LIBRARIES),)
|
ifeq ($(PJ_SHARED_LIBRARIES),)
|
||||||
@@ -57,99 +43,6 @@ APP_THIRD_PARTY_LIB_FILES += $(PJ_DIR)/third_party/lib/libresample.$(SHLIB_SUFFI
|
@@ -66,89 +52,6 @@ APP_THIRD_PARTY_LIB_FILES += $(PJ_DIR)/third_party/lib/libresample.$(SHLIB_SUFFI
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -89,19 +89,9 @@ index 6c263a9..36e7ff4 100644
|
|||||||
-endif
|
-endif
|
||||||
-endif
|
-endif
|
||||||
-
|
-
|
||||||
-ifneq ($(findstring pa,@ac_pjmedia_snd@),)
|
|
||||||
-ifeq (@ac_external_pa@,1)
|
-ifeq (@ac_external_pa@,1)
|
||||||
-# External PA
|
-# External PA
|
||||||
-APP_THIRD_PARTY_EXT += -lportaudio
|
-APP_THIRD_PARTY_EXT += -lportaudio
|
||||||
-else
|
|
||||||
-APP_THIRD_PARTY_LIB_FILES += $(PJ_DIR)/third_party/lib/libportaudio-$(LIB_SUFFIX)
|
|
||||||
-ifeq ($(PJ_SHARED_LIBRARIES),)
|
|
||||||
-APP_THIRD_PARTY_LIBS += -lportaudio-$(TARGET_NAME)
|
|
||||||
-else
|
|
||||||
-APP_THIRD_PARTY_LIBS += -lportaudio
|
|
||||||
-APP_THIRD_PARTY_LIB_FILES += $(PJ_DIR)/third_party/lib/libportaudio.$(SHLIB_SUFFIX).$(PJ_VERSION_MAJOR) $(PJ_DIR)/third_party/lib/libportaudio.$(SHLIB_SUFFIX)
|
|
||||||
-endif
|
|
||||||
-endif
|
|
||||||
-endif
|
-endif
|
||||||
-
|
-
|
||||||
-ifneq (@ac_no_yuv@,1)
|
-ifneq (@ac_no_yuv@,1)
|
||||||
@@ -136,6 +126,3 @@ index 6c263a9..36e7ff4 100644
|
|||||||
# Additional flags
|
# Additional flags
|
||||||
@ac_build_mak_vars@
|
@ac_build_mak_vars@
|
||||||
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
||||||
|
14
third-party/pjproject/patches/0000-solaris.patch
vendored
14
third-party/pjproject/patches/0000-solaris.patch
vendored
@@ -40,7 +40,6 @@ Updated by ASTERISK-27997
|
|||||||
---
|
---
|
||||||
pjlib/include/pj/sock.h | 8 +++++++-
|
pjlib/include/pj/sock.h | 8 +++++++-
|
||||||
pjlib/src/pj/sock_bsd.c | 2 +-
|
pjlib/src/pj/sock_bsd.c | 2 +-
|
||||||
pjlib/src/pj/sock_linux_kernel.c | 2 +-
|
|
||||||
pjlib/src/pj/sock_symbian.cpp | 2 +-
|
pjlib/src/pj/sock_symbian.cpp | 2 +-
|
||||||
pjlib/src/pj/sock_uwp.cpp | 2 +-
|
pjlib/src/pj/sock_uwp.cpp | 2 +-
|
||||||
pjsip/src/test/transport_test.c | 2 +-
|
pjsip/src/test/transport_test.c | 2 +-
|
||||||
@@ -92,19 +91,6 @@ index 95c3804..daefc54 100644
|
|||||||
{
|
{
|
||||||
char tempaddr[PJ_INET_ADDRSTRLEN];
|
char tempaddr[PJ_INET_ADDRSTRLEN];
|
||||||
|
|
||||||
diff --git a/pjlib/src/pj/sock_linux_kernel.c b/pjlib/src/pj/sock_linux_kernel.c
|
|
||||||
index 899b486..10d84cd 100644
|
|
||||||
--- a/pjlib/src/pj/sock_linux_kernel.c
|
|
||||||
+++ b/pjlib/src/pj/sock_linux_kernel.c
|
|
||||||
@@ -149,7 +149,7 @@ PJ_DEF(char*) pj_inet_ntoa(pj_in_addr in)
|
|
||||||
* numbers-and-dots notation into binary data and stores it in the structure
|
|
||||||
* that inp points to.
|
|
||||||
*/
|
|
||||||
-PJ_DEF(int) pj_inet_aton(const pj_str_t *ccp, struct pj_in_addr *addr)
|
|
||||||
+PJ_DEF(int) pj_inet_aton(const pj_str_t *ccp, pj_in_addr *addr)
|
|
||||||
{
|
|
||||||
pj_uint32_t val;
|
|
||||||
int base, n;
|
|
||||||
diff --git a/pjlib/src/pj/sock_symbian.cpp b/pjlib/src/pj/sock_symbian.cpp
|
diff --git a/pjlib/src/pj/sock_symbian.cpp b/pjlib/src/pj/sock_symbian.cpp
|
||||||
index 09239b0..e72bbda 100644
|
index 09239b0..e72bbda 100644
|
||||||
--- a/pjlib/src/pj/sock_symbian.cpp
|
--- a/pjlib/src/pj/sock_symbian.cpp
|
||||||
|
@@ -1,41 +0,0 @@
|
|||||||
From 186f82627c40d0c3a56a6a94ce55c055ad1f7620 Mon Sep 17 00:00:00 2001
|
|
||||||
From: George Joseph <gjoseph@digium.com>
|
|
||||||
Date: Fri, 10 Nov 2017 09:26:29 -0700
|
|
||||||
Subject: [PATCH] sip_parser: Fix return code in pjsip_find_msg and add
|
|
||||||
"volatile"
|
|
||||||
|
|
||||||
The default return code for pjsip_find_msg was PJ_SUCCESS so if
|
|
||||||
a Content-Length header wasn't found at all, pjsip_find_msg was
|
|
||||||
returning PJ_SUCCESS instead of PJSIP_EMISSINGHDR.
|
|
||||||
|
|
||||||
Also added the volatile keyword to a few variables what are used
|
|
||||||
both insude and outsude the PJ_TRY/PJ_CATCH block.
|
|
||||||
---
|
|
||||||
pjsip/src/pjsip/sip_parser.c | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/pjsip/src/pjsip/sip_parser.c b/pjsip/src/pjsip/sip_parser.c
|
|
||||||
index f9a0e65b5..f65ffca5a 100644
|
|
||||||
--- a/pjsip/src/pjsip/sip_parser.c
|
|
||||||
+++ b/pjsip/src/pjsip/sip_parser.c
|
|
||||||
@@ -834,13 +834,13 @@ PJ_DEF(pj_status_t) pjsip_find_msg( const char *buf, pj_size_t size,
|
|
||||||
pj_bool_t is_datagram, pj_size_t *msg_size)
|
|
||||||
{
|
|
||||||
#if PJ_HAS_TCP
|
|
||||||
- const char *hdr_end;
|
|
||||||
- const char *body_start;
|
|
||||||
+ const char *volatile hdr_end;
|
|
||||||
+ const char *volatile body_start;
|
|
||||||
const char *pos;
|
|
||||||
- const char *line;
|
|
||||||
+ const char *volatile line;
|
|
||||||
int content_length = -1;
|
|
||||||
pj_str_t cur_msg;
|
|
||||||
- pj_status_t status = PJ_SUCCESS;
|
|
||||||
+ volatile pj_status_t status = PJSIP_EMISSINGHDR;
|
|
||||||
const pj_str_t end_hdr = { "\n\r\n", 3};
|
|
||||||
|
|
||||||
*msg_size = size;
|
|
||||||
--
|
|
||||||
2.13.6
|
|
||||||
|
|
@@ -1,27 +0,0 @@
|
|||||||
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
|
|
||||||
index e4bec24..a39b56e 100644
|
|
||||||
--- a/pjsip/src/pjsip/sip_transport.c
|
|
||||||
+++ b/pjsip/src/pjsip/sip_transport.c
|
|
||||||
@@ -957,7 +957,21 @@ static pj_bool_t is_transport_valid(pjsip_tpmgr *tpmgr, pjsip_transport *tp,
|
|
||||||
const pjsip_transport_key *key,
|
|
||||||
int key_len)
|
|
||||||
{
|
|
||||||
- return (pj_hash_get(tpmgr->table, key, key_len, NULL) == (void*)tp);
|
|
||||||
+ transport *tp_iter;
|
|
||||||
+
|
|
||||||
+ if (pj_hash_get(tpmgr->table, key, key_len, NULL) == (void*)tp) {
|
|
||||||
+ return PJ_TRUE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ tp_iter = tpmgr->tp_list.next;
|
|
||||||
+ while (tp_iter != &tpmgr->tp_list) {
|
|
||||||
+ if (tp_iter->tp == tp) {
|
|
||||||
+ return PJ_TRUE;
|
|
||||||
+ }
|
|
||||||
+ tp_iter = tp_iter->next;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return PJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
@@ -1,17 +0,0 @@
|
|||||||
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
index c9686a0..fc52a63 100644
|
|
||||||
--- a/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
+++ b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
@@ -4156,9 +4156,10 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e)
|
|
||||||
status = pjsip_inv_send_msg(inv, cancel);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (dlg->remote.info->tag.slen) {
|
|
||||||
+ if (tsx->status_code != 100) {
|
|
||||||
|
|
||||||
- inv_set_state(inv, PJSIP_INV_STATE_EARLY, e);
|
|
||||||
+ if (dlg->remote.info->tag.slen)
|
|
||||||
+ inv_set_state(inv, PJSIP_INV_STATE_EARLY, e);
|
|
||||||
|
|
||||||
inv_check_sdp_in_incoming_msg(inv, tsx,
|
|
||||||
e->body.tsx_state.src.rdata);
|
|
@@ -1,71 +0,0 @@
|
|||||||
commit ca0b723e92bd76bbda1bbd14477a829eaeeb675e
|
|
||||||
Author: Joshua Colp <jcolp@digium.com>
|
|
||||||
Date: Wed Dec 13 10:58:57 2017 +0000
|
|
||||||
|
|
||||||
Ignore transport error on completed transaction.
|
|
||||||
Don't disconnect call if transport error happens on transaction that is not initial INVITE transaction.
|
|
||||||
|
|
||||||
Scenario:
|
|
||||||
|
|
||||||
DNS lookup returning two servers.
|
|
||||||
Sending INVITE to first server over TCP.
|
|
||||||
Response received with code 503 (Service Unavailable).
|
|
||||||
Failover to second server, sending second INVITE after restarting the session.
|
|
||||||
TCP connection for the first INVITE getting disconnected and causing call disconnection (while second INVITE is still outstanding).
|
|
||||||
|
|
||||||
This is a backport of 5714 from upstream PJSIP.
|
|
||||||
|
|
||||||
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
index ac4d1949..0173cb4c 100644
|
|
||||||
--- a/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
+++ b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
@@ -4254,8 +4254,7 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e)
|
|
||||||
if ((tsx->status_code == PJSIP_SC_CALL_TSX_DOES_NOT_EXIST &&
|
|
||||||
tsx->method.id != PJSIP_CANCEL_METHOD) ||
|
|
||||||
tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT ||
|
|
||||||
- tsx->status_code == PJSIP_SC_TSX_TIMEOUT ||
|
|
||||||
- tsx->status_code == PJSIP_SC_TSX_TRANSPORT_ERROR)
|
|
||||||
+ tsx->status_code == PJSIP_SC_TSX_TIMEOUT)
|
|
||||||
{
|
|
||||||
inv_set_cause(inv, tsx->status_code, &tsx->status_text);
|
|
||||||
inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e);
|
|
||||||
diff --git a/pjsip/src/pjsip/sip_transaction.c b/pjsip/src/pjsip/sip_transaction.c
|
|
||||||
index 7ac3d1b7..d52b12a7 100644
|
|
||||||
--- a/pjsip/src/pjsip/sip_transaction.c
|
|
||||||
+++ b/pjsip/src/pjsip/sip_transaction.c
|
|
||||||
@@ -2044,9 +2044,14 @@ static void transport_callback(void *token, pjsip_tx_data *tdata,
|
|
||||||
*/
|
|
||||||
lock_timer(tsx);
|
|
||||||
tsx->transport_err = (pj_status_t)-sent;
|
|
||||||
- tsx_cancel_timer(tsx, &tsx->timeout_timer);
|
|
||||||
- tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
|
|
||||||
- TRANSPORT_ERR_TIMER);
|
|
||||||
+ /* Don't cancel timeout timer if tsx state is already
|
|
||||||
+ * PJSIP_TSX_STATE_COMPLETED (see #2076).
|
|
||||||
+ */
|
|
||||||
+ if (tsx->state < PJSIP_TSX_STATE_COMPLETED) {
|
|
||||||
+ tsx_cancel_timer(tsx, &tsx->timeout_timer);
|
|
||||||
+ tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
|
|
||||||
+ TRANSPORT_ERR_TIMER);
|
|
||||||
+ }
|
|
||||||
unlock_timer(tsx);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -2077,9 +2082,14 @@ static void tsx_tp_state_callback( pjsip_transport *tp,
|
|
||||||
*/
|
|
||||||
lock_timer(tsx);
|
|
||||||
tsx->transport_err = info->status;
|
|
||||||
- tsx_cancel_timer(tsx, &tsx->timeout_timer);
|
|
||||||
- tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
|
|
||||||
- TRANSPORT_ERR_TIMER);
|
|
||||||
+ /* Don't cancel timeout timer if tsx state is already
|
|
||||||
+ * PJSIP_TSX_STATE_COMPLETED (see #2076).
|
|
||||||
+ */
|
|
||||||
+ if (tsx->state < PJSIP_TSX_STATE_COMPLETED) {
|
|
||||||
+ tsx_cancel_timer(tsx, &tsx->timeout_timer);
|
|
||||||
+ tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
|
|
||||||
+ TRANSPORT_ERR_TIMER);
|
|
||||||
+ }
|
|
||||||
unlock_timer(tsx);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,56 +0,0 @@
|
|||||||
From 88409082a4cbf27b308c76c148270ee72fdcb503 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Riza Sulistyo <riza@teluu.com>
|
|
||||||
Date: Wed, 17 Jan 2018 11:30:52 +0000
|
|
||||||
Subject: [PATCH] r5727 svn backport sip_msg: Prevent crash on header without
|
|
||||||
vptr
|
|
||||||
|
|
||||||
Re #2059 (misc): Prevent corrupt header from causing a crash when printed.
|
|
||||||
Thanks to George Joseph for the patch.
|
|
||||||
|
|
||||||
Occasionally a header with no vptr gets into the list of header. This
|
|
||||||
causes a crash when printing them. We still need to figure out how
|
|
||||||
the header got there but this patch at least prevents the crash by checking
|
|
||||||
for a non-NULL vptr before attempting to call its print function.
|
|
||||||
---
|
|
||||||
pjsip/src/pjsip/sip_msg.c | 11 +++++++++--
|
|
||||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/pjsip/src/pjsip/sip_msg.c b/pjsip/src/pjsip/sip_msg.c
|
|
||||||
index a13f80e..8819dd9 100644
|
|
||||||
--- a/pjsip/src/pjsip/sip_msg.c
|
|
||||||
+++ b/pjsip/src/pjsip/sip_msg.c
|
|
||||||
@@ -26,6 +26,7 @@
|
|
||||||
#include <pj/string.h>
|
|
||||||
#include <pj/pool.h>
|
|
||||||
#include <pj/assert.h>
|
|
||||||
+#include <pj/log.h>
|
|
||||||
#include <pjlib-util/string.h>
|
|
||||||
|
|
||||||
PJ_DEF_DATA(const pjsip_method) pjsip_invite_method =
|
|
||||||
@@ -461,8 +462,13 @@ PJ_DEF(pj_ssize_t) pjsip_msg_print( const pjsip_msg *msg,
|
|
||||||
/* Print each of the headers. */
|
|
||||||
for (hdr=msg->hdr.next; hdr!=&msg->hdr; hdr=hdr->next) {
|
|
||||||
len = pjsip_hdr_print_on(hdr, p, end-p);
|
|
||||||
- if (len < 0)
|
|
||||||
- return -1;
|
|
||||||
+ if (len < 0) {
|
|
||||||
+ if (len == -2) {
|
|
||||||
+ PJ_LOG(5, ("sip_msg", "Header with no vptr encountered!! "\
|
|
||||||
+ "Current buffer: %.*s", (int)(p-buf), buf));
|
|
||||||
+ }
|
|
||||||
+ return len;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (len > 0) {
|
|
||||||
p += len;
|
|
||||||
@@ -578,6 +584,7 @@ PJ_DEF(void*) pjsip_hdr_shallow_clone( pj_pool_t *pool, const void *hdr_ptr )
|
|
||||||
PJ_DEF(int) pjsip_hdr_print_on( void *hdr_ptr, char *buf, pj_size_t len)
|
|
||||||
{
|
|
||||||
pjsip_hdr *hdr = (pjsip_hdr*) hdr_ptr;
|
|
||||||
+ PJ_ASSERT_RETURN(hdr->vptr, -2);
|
|
||||||
return (*hdr->vptr->print_on)(hdr_ptr, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@@ -1,114 +0,0 @@
|
|||||||
From 67485f3a6c711f67a40ff46288cb6be1658023bd Mon Sep 17 00:00:00 2001
|
|
||||||
From: nanang <nanang@localhost>
|
|
||||||
Date: Mon, 26 Mar 2018 10:33:50 +0000
|
|
||||||
Subject: [PATCH] Close #2101: - set atomic's mutex to NULL in atomic destroy
|
|
||||||
- added few sanity checks to the atomic functions.
|
|
||||||
|
|
||||||
---
|
|
||||||
pjlib/src/pj/os_core_unix.c | 20 ++++++++++++++++++--
|
|
||||||
pjlib/src/pj/os_core_win32.c | 4 ++++
|
|
||||||
2 files changed, 22 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/pjlib/src/pj/os_core_unix.c b/pjlib/src/pj/os_core_unix.c
|
|
||||||
index ebfe84348..c17ad4ef0 100644
|
|
||||||
--- a/pjlib/src/pj/os_core_unix.c
|
|
||||||
+++ b/pjlib/src/pj/os_core_unix.c
|
|
||||||
@@ -879,9 +879,16 @@ PJ_DEF(pj_status_t) pj_atomic_create( pj_pool_t *pool,
|
|
||||||
*/
|
|
||||||
PJ_DEF(pj_status_t) pj_atomic_destroy( pj_atomic_t *atomic_var )
|
|
||||||
{
|
|
||||||
+ pj_status_t status;
|
|
||||||
+
|
|
||||||
PJ_ASSERT_RETURN(atomic_var, PJ_EINVAL);
|
|
||||||
+
|
|
||||||
#if PJ_HAS_THREADS
|
|
||||||
- return pj_mutex_destroy( atomic_var->mutex );
|
|
||||||
+ status = pj_mutex_destroy( atomic_var->mutex );
|
|
||||||
+ if (status == PJ_SUCCESS) {
|
|
||||||
+ atomic_var->mutex = NULL;
|
|
||||||
+ }
|
|
||||||
+ return status;
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
@@ -892,10 +899,16 @@ PJ_DEF(pj_status_t) pj_atomic_destroy( pj_atomic_t *atomic_var )
|
|
||||||
*/
|
|
||||||
PJ_DEF(void) pj_atomic_set(pj_atomic_t *atomic_var, pj_atomic_value_t value)
|
|
||||||
{
|
|
||||||
+ pj_status_t status;
|
|
||||||
+
|
|
||||||
PJ_CHECK_STACK();
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
|
|
||||||
#if PJ_HAS_THREADS
|
|
||||||
- pj_mutex_lock( atomic_var->mutex );
|
|
||||||
+ status = pj_mutex_lock( atomic_var->mutex );
|
|
||||||
+ if (status != PJ_SUCCESS) {
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
#endif
|
|
||||||
atomic_var->value = value;
|
|
||||||
#if PJ_HAS_THREADS
|
|
||||||
@@ -946,6 +959,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_inc_and_get(pj_atomic_t *atomic_var)
|
|
||||||
*/
|
|
||||||
PJ_DEF(void) pj_atomic_inc(pj_atomic_t *atomic_var)
|
|
||||||
{
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
pj_atomic_inc_and_get(atomic_var);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -974,6 +988,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_dec_and_get(pj_atomic_t *atomic_var)
|
|
||||||
*/
|
|
||||||
PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var)
|
|
||||||
{
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
pj_atomic_dec_and_get(atomic_var);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1005,6 +1020,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_add_and_get( pj_atomic_t *atomic_var,
|
|
||||||
PJ_DEF(void) pj_atomic_add( pj_atomic_t *atomic_var,
|
|
||||||
pj_atomic_value_t value )
|
|
||||||
{
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
pj_atomic_add_and_get(atomic_var, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/pjlib/src/pj/os_core_win32.c b/pjlib/src/pj/os_core_win32.c
|
|
||||||
index 1cb6004d3..8c934b34d 100644
|
|
||||||
--- a/pjlib/src/pj/os_core_win32.c
|
|
||||||
+++ b/pjlib/src/pj/os_core_win32.c
|
|
||||||
@@ -750,6 +750,7 @@ PJ_DEF(pj_status_t) pj_atomic_destroy( pj_atomic_t *var )
|
|
||||||
PJ_DEF(void) pj_atomic_set( pj_atomic_t *atomic_var, pj_atomic_value_t value)
|
|
||||||
{
|
|
||||||
PJ_CHECK_STACK();
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
|
|
||||||
InterlockedExchange(&atomic_var->value, value);
|
|
||||||
}
|
|
||||||
@@ -784,6 +785,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_inc_and_get(pj_atomic_t *atomic_var)
|
|
||||||
*/
|
|
||||||
PJ_DEF(void) pj_atomic_inc(pj_atomic_t *atomic_var)
|
|
||||||
{
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
pj_atomic_inc_and_get(atomic_var);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -806,6 +808,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_dec_and_get(pj_atomic_t *atomic_var)
|
|
||||||
*/
|
|
||||||
PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var)
|
|
||||||
{
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
pj_atomic_dec_and_get(atomic_var);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -815,6 +818,7 @@ PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var)
|
|
||||||
PJ_DEF(void) pj_atomic_add( pj_atomic_t *atomic_var,
|
|
||||||
pj_atomic_value_t value )
|
|
||||||
{
|
|
||||||
+ PJ_ASSERT_ON_FAIL(atomic_var, return);
|
|
||||||
#if defined(PJ_WIN32_WINNT) && PJ_WIN32_WINNT >= 0x0400
|
|
||||||
InterlockedExchangeAdd( &atomic_var->value, value );
|
|
||||||
#else
|
|
||||||
--
|
|
||||||
2.14.3
|
|
||||||
|
|
@@ -1,31 +0,0 @@
|
|||||||
From beaa7874ff8e3b1d2951218c94e7e6bbba9c0531 Mon Sep 17 00:00:00 2001
|
|
||||||
From: George Joseph <gjoseph@digium.com>
|
|
||||||
Date: Sun, 25 Mar 2018 12:30:05 -0600
|
|
||||||
Subject: [PATCH] sip_transaction: In tsx_timer_callback, check if tsx is
|
|
||||||
already gone
|
|
||||||
|
|
||||||
There have been cases that when the transaction timer callback is called
|
|
||||||
the tsx is already destroyed. This causes a crash. We now check the
|
|
||||||
tsx state and return if the tsx is already destroyed.
|
|
||||||
---
|
|
||||||
pjsip/src/pjsip/sip_transaction.c | 4 ++++
|
|
||||||
1 file changed, 4 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/pjsip/src/pjsip/sip_transaction.c b/pjsip/src/pjsip/sip_transaction.c
|
|
||||||
index d52b12a72..6d4cdc65f 100644
|
|
||||||
--- a/pjsip/src/pjsip/sip_transaction.c
|
|
||||||
+++ b/pjsip/src/pjsip/sip_transaction.c
|
|
||||||
@@ -1119,6 +1119,10 @@ static void tsx_timer_callback( pj_timer_heap_t *theap, pj_timer_entry *entry)
|
|
||||||
|
|
||||||
PJ_UNUSED_ARG(theap);
|
|
||||||
|
|
||||||
+ if (tsx->state >= PJSIP_TSX_STATE_DESTROYED) {
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (entry->id == TRANSPORT_ERR_TIMER) {
|
|
||||||
/* Posted transport error event */
|
|
||||||
entry->id = 0;
|
|
||||||
--
|
|
||||||
2.14.3
|
|
||||||
|
|
@@ -1,215 +0,0 @@
|
|||||||
From 13e20772cd3c8735a6b78e30391a33f3eba4c023 Mon Sep 17 00:00:00 2001
|
|
||||||
From: George Joseph <gjoseph@digium.com>
|
|
||||||
Date: Fri, 22 Jun 2018 09:33:34 -0600
|
|
||||||
Subject: [PATCH] sip_inv: Add option to accept updated SDP on same To tag
|
|
||||||
|
|
||||||
Currently, setting pjsip_cfg()->endpt.follow_early_media_fork allows
|
|
||||||
sip_inv to process media updates when the To tag is different. There
|
|
||||||
are some cases where media updates need to be processed when the tags
|
|
||||||
are the same. Since removing the requirement for different tags would
|
|
||||||
change default behavior, a new option "accept_multiple_sdp_answers"
|
|
||||||
has been added along with a new pjsip_inv_session flag
|
|
||||||
"updated_sdp_answer" to indicate under which condition we're
|
|
||||||
updating.
|
|
||||||
|
|
||||||
The logic was also updated to more closely follow RFC6337 in that
|
|
||||||
if 100rel is efffect, do not accept updated SDPs.
|
|
||||||
|
|
||||||
See
|
|
||||||
https://tools.ietf.org/html/rfc6337#section-3.1.1
|
|
||||||
for more information.
|
|
||||||
---
|
|
||||||
pjsip/include/pjsip-ua/sip_inv.h | 2 ++
|
|
||||||
pjsip/include/pjsip/sip_config.h | 25 ++++++++++++++++
|
|
||||||
pjsip/src/pjsip-ua/sip_inv.c | 62 +++++++++++++++++++++++++---------------
|
|
||||||
pjsip/src/pjsip/sip_config.c | 3 +-
|
|
||||||
4 files changed, 68 insertions(+), 24 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/pjsip/include/pjsip-ua/sip_inv.h b/pjsip/include/pjsip-ua/sip_inv.h
|
|
||||||
index 1bb7b8adc..77ef070c3 100644
|
|
||||||
--- a/pjsip/include/pjsip-ua/sip_inv.h
|
|
||||||
+++ b/pjsip/include/pjsip-ua/sip_inv.h
|
|
||||||
@@ -442,6 +442,8 @@ struct pjsip_inv_session
|
|
||||||
pj_bool_t following_fork; /**< Internal, following
|
|
||||||
forked media? */
|
|
||||||
pj_atomic_t *ref_cnt; /**< Reference counter. */
|
|
||||||
+ pj_bool_t updated_sdp_answer; /**< SDP answer just been
|
|
||||||
+ updated? */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/pjsip/include/pjsip/sip_config.h b/pjsip/include/pjsip/sip_config.h
|
|
||||||
index b3a9468e2..b7cf6feed 100644
|
|
||||||
--- a/pjsip/include/pjsip/sip_config.h
|
|
||||||
+++ b/pjsip/include/pjsip/sip_config.h
|
|
||||||
@@ -157,6 +157,17 @@ typedef struct pjsip_cfg_t
|
|
||||||
*/
|
|
||||||
pj_bool_t disable_secure_dlg_check;
|
|
||||||
|
|
||||||
+ /**
|
|
||||||
+ * Accept multiple SDP answers on non-reliable 18X responses and the 2XX
|
|
||||||
+ * response when they are all received from the same source (same To tag).
|
|
||||||
+ *
|
|
||||||
+ * See also:
|
|
||||||
+ * https://tools.ietf.org/html/rfc6337#section-3.1.1
|
|
||||||
+ *
|
|
||||||
+ * Default is PJSIP_ACCEPT_MULTIPLE_SDP_ANSWERS.
|
|
||||||
+ */
|
|
||||||
+ pj_bool_t accept_multiple_sdp_answers;
|
|
||||||
+
|
|
||||||
} endpt;
|
|
||||||
|
|
||||||
/** Transaction layer settings. */
|
|
||||||
@@ -402,6 +413,20 @@ PJ_INLINE(pjsip_cfg_t*) pjsip_cfg(void)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * Accept multiple SDP answers on non-reliable 18X responses and the 2XX
|
|
||||||
+ * response when they are all received from the same source (same To tag).
|
|
||||||
+ *
|
|
||||||
+ * This option can also be controlled at run-time by the
|
|
||||||
+ * \a accept_multiple_sdp_answers setting in pjsip_cfg_t.
|
|
||||||
+ *
|
|
||||||
+ * Default is PJ_FALSE.
|
|
||||||
+ */
|
|
||||||
+#ifndef PJSIP_ACCEPT_MULTIPLE_SDP_ANSWERS
|
|
||||||
+# define PJSIP_ACCEPT_MULTIPLE_SDP_ANSWERS PJ_TRUE
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* Specify whether "alias" param should be added to the Via header
|
|
||||||
* in any outgoing request with connection oriented transport.
|
|
||||||
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
index c9686a088..c22726bad 100644
|
|
||||||
--- a/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
+++ b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
@@ -162,6 +162,7 @@ struct tsx_inv_data
|
|
||||||
pj_bool_t retrying; /* Resend (e.g. due to 401/407) */
|
|
||||||
pj_str_t done_tag; /* To tag in RX response with answer */
|
|
||||||
pj_bool_t done_early;/* Negotiation was done for early med? */
|
|
||||||
+ pj_bool_t done_early_rel;/* Early med was realiable? */
|
|
||||||
pj_bool_t has_sdp; /* Message with SDP? */
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -2000,18 +2001,20 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
|
|
||||||
|
|
||||||
/* Initialize info that we are following forked media */
|
|
||||||
inv->following_fork = PJ_FALSE;
|
|
||||||
+ inv->updated_sdp_answer = PJ_FALSE;
|
|
||||||
|
|
||||||
/* MUST NOT do multiple SDP offer/answer in a single transaction,
|
|
||||||
- * EXCEPT if:
|
|
||||||
- * - this is an initial UAC INVITE transaction (i.e. not re-INVITE), and
|
|
||||||
- * - the previous negotiation was done on an early media (18x) and
|
|
||||||
- * this response is a final/2xx response, and
|
|
||||||
- * - the 2xx response has different To tag than the 18x response
|
|
||||||
- * (i.e. the request has forked).
|
|
||||||
+ * EXCEPT previous nego was in 18x (early media) and any of the following
|
|
||||||
+ * condition is met:
|
|
||||||
+ * - Non-forking scenario:
|
|
||||||
+ * - 'accept_multiple_sdp_answers' is set, and
|
|
||||||
+ * - previous early response was not reliable (rfc6337 section 3.1.1).
|
|
||||||
+ * - Forking scenario:
|
|
||||||
+ * - This response has different To tag than the previous response, and
|
|
||||||
+ * - This response is 18x/2xx (early or final). If this is 18x,
|
|
||||||
+ * only do multiple SDP nego if 'follow_early_media_fork' is set.
|
|
||||||
*
|
|
||||||
- * The exception above is to add a rudimentary support for early media
|
|
||||||
- * forking (sample case: custom ringback). See this ticket for more
|
|
||||||
- * info: http://trac.pjsip.org/repos/ticket/657
|
|
||||||
+ * See also ticket #657, #1644, #1764 for more info.
|
|
||||||
*/
|
|
||||||
if (tsx_inv_data->sdp_done) {
|
|
||||||
pj_str_t res_tag;
|
|
||||||
@@ -2020,21 +2023,29 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
|
|
||||||
res_tag = rdata->msg_info.to->tag;
|
|
||||||
st_code = rdata->msg_info.msg->line.status.code;
|
|
||||||
|
|
||||||
- /* Allow final/early response after SDP has been negotiated in early
|
|
||||||
- * media, IF this response is a final/early response with different
|
|
||||||
- * tag.
|
|
||||||
- * See ticket #1644 and #1764 for forked early media case.
|
|
||||||
- */
|
|
||||||
- if (tsx->role == PJSIP_ROLE_UAC &&
|
|
||||||
- (st_code/100 == 2 ||
|
|
||||||
- (st_code/10 == 18 /* st_code == 18x */
|
|
||||||
- && pjsip_cfg()->endpt.follow_early_media_fork)) &&
|
|
||||||
- tsx_inv_data->done_early &&
|
|
||||||
- pj_stricmp(&tsx_inv_data->done_tag, &res_tag))
|
|
||||||
+ if (tsx->role == PJSIP_ROLE_UAC && tsx_inv_data->done_early &&
|
|
||||||
+ (
|
|
||||||
+ /* Non-forking scenario */
|
|
||||||
+ (
|
|
||||||
+ !tsx_inv_data->done_early_rel &&
|
|
||||||
+ (st_code/100 == 2 || st_code/10 == 18) &&
|
|
||||||
+ pjsip_cfg()->endpt.accept_multiple_sdp_answers &&
|
|
||||||
+ !pj_stricmp(&tsx_inv_data->done_tag, &res_tag)
|
|
||||||
+ )
|
|
||||||
+ ||
|
|
||||||
+ /* Forking scenario */
|
|
||||||
+ (
|
|
||||||
+ (st_code/100 == 2 ||
|
|
||||||
+ (st_code/10 == 18 &&
|
|
||||||
+ pjsip_cfg()->endpt.follow_early_media_fork)) &&
|
|
||||||
+ pj_stricmp(&tsx_inv_data->done_tag, &res_tag)
|
|
||||||
+ )
|
|
||||||
+ )
|
|
||||||
+ )
|
|
||||||
{
|
|
||||||
const pjmedia_sdp_session *reoffer_sdp = NULL;
|
|
||||||
|
|
||||||
- PJ_LOG(4,(inv->obj_name, "Received forked %s response "
|
|
||||||
+ PJ_LOG(4,(inv->obj_name, "Received %s response "
|
|
||||||
"after SDP negotiation has been done in early "
|
|
||||||
"media. Renegotiating SDP..",
|
|
||||||
(st_code/10==18? "early" : "final" )));
|
|
||||||
@@ -2054,7 +2065,9 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
- inv->following_fork = PJ_TRUE;
|
|
||||||
+ inv->following_fork = !!pj_stricmp(&tsx_inv_data->done_tag,
|
|
||||||
+ &res_tag);
|
|
||||||
+ inv->updated_sdp_answer = PJ_TRUE;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
@@ -2135,6 +2148,7 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
|
|
||||||
PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER)
|
|
||||||
{
|
|
||||||
int status_code;
|
|
||||||
+ pjsip_msg *msg = rdata->msg_info.msg;
|
|
||||||
|
|
||||||
/* This is an answer.
|
|
||||||
* Process and negotiate remote answer.
|
|
||||||
@@ -2161,8 +2175,10 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
|
|
||||||
*/
|
|
||||||
|
|
||||||
tsx_inv_data->sdp_done = 1;
|
|
||||||
- status_code = rdata->msg_info.msg->line.status.code;
|
|
||||||
+ status_code = msg->line.status.code;
|
|
||||||
tsx_inv_data->done_early = (status_code/100==1);
|
|
||||||
+ tsx_inv_data->done_early_rel = tsx_inv_data->done_early &&
|
|
||||||
+ pjsip_100rel_is_reliable(rdata);
|
|
||||||
pj_strdup(tsx->pool, &tsx_inv_data->done_tag,
|
|
||||||
&rdata->msg_info.to->tag);
|
|
||||||
|
|
||||||
diff --git a/pjsip/src/pjsip/sip_config.c b/pjsip/src/pjsip/sip_config.c
|
|
||||||
index 3576f351e..316824a00 100644
|
|
||||||
--- a/pjsip/src/pjsip/sip_config.c
|
|
||||||
+++ b/pjsip/src/pjsip/sip_config.c
|
|
||||||
@@ -34,7 +34,8 @@ pjsip_cfg_t pjsip_sip_cfg_var =
|
|
||||||
PJSIP_FOLLOW_EARLY_MEDIA_FORK,
|
|
||||||
PJSIP_REQ_HAS_VIA_ALIAS,
|
|
||||||
PJSIP_RESOLVE_HOSTNAME_TO_GET_INTERFACE,
|
|
||||||
- 0
|
|
||||||
+ 0,
|
|
||||||
+ PJSIP_ACCEPT_MULTIPLE_SDP_ANSWERS
|
|
||||||
},
|
|
||||||
|
|
||||||
/* Transaction settings */
|
|
||||||
--
|
|
||||||
2.14.4
|
|
||||||
|
|
@@ -1,203 +0,0 @@
|
|||||||
From 3c9ad14b32ddb881559c05ea742aba3153a8cb8f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Riza Sulistyo <riza@teluu.com>
|
|
||||||
Date: Wed, 1 Aug 2018 10:49:51 -0500
|
|
||||||
Subject: [PATCH] r5851 svn backport sip_inv.c: Fix race condition in 183
|
|
||||||
re-transmission deadlock
|
|
||||||
|
|
||||||
Fixed #2137: Race condition in 183 re-transmission can result in a deadlock.
|
|
||||||
|
|
||||||
The tdata containing the response can be shared by both the dialog
|
|
||||||
object and the tsx object. In order to prevent the race condition
|
|
||||||
between the tsx retransmission and the dialog sending a response,
|
|
||||||
clone the tdata before modifying it for the dialog send response.
|
|
||||||
|
|
||||||
ASTERISK-27966
|
|
||||||
---
|
|
||||||
pjsip/include/pjsip/sip_transport.h | 16 +++++++++++++
|
|
||||||
pjsip/src/pjsip-ua/sip_100rel.c | 43 +--------------------------------
|
|
||||||
pjsip/src/pjsip-ua/sip_inv.c | 14 ++++++++++-
|
|
||||||
pjsip/src/pjsip/sip_transport.c | 47 +++++++++++++++++++++++++++++++++++++
|
|
||||||
4 files changed, 77 insertions(+), 43 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/pjsip/include/pjsip/sip_transport.h b/pjsip/include/pjsip/sip_transport.h
|
|
||||||
index 10a50ef..36581dc 100644
|
|
||||||
--- a/pjsip/include/pjsip/sip_transport.h
|
|
||||||
+++ b/pjsip/include/pjsip/sip_transport.h
|
|
||||||
@@ -721,6 +721,22 @@ PJ_DECL(char*) pjsip_tx_data_get_info( pjsip_tx_data *tdata );
|
|
||||||
PJ_DECL(pj_status_t) pjsip_tx_data_set_transport(pjsip_tx_data *tdata,
|
|
||||||
const pjsip_tpselector *sel);
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * Clone pjsip_tx_data. This will duplicate the message contents of
|
|
||||||
+ * pjsip_tx_data (pjsip_tx_data.msg) and add reference count to the tdata.
|
|
||||||
+ * Once application has finished using the cloned pjsip_tx_data,
|
|
||||||
+ * it must release it by calling #pjsip_tx_data_dec_ref().
|
|
||||||
+ * Currently, this will only clone response message.
|
|
||||||
+ *
|
|
||||||
+ * @param src The source to be cloned.
|
|
||||||
+ * @param flags Optional flags. Must be zero for now.
|
|
||||||
+ * @param p_rdata Pointer to receive the cloned tdata.
|
|
||||||
+ *
|
|
||||||
+ * @return PJ_SUCCESS on success or the appropriate error.
|
|
||||||
+ */
|
|
||||||
+PJ_DECL(pj_status_t) pjsip_tx_data_clone(const pjsip_tx_data *src,
|
|
||||||
+ unsigned flags,
|
|
||||||
+ pjsip_tx_data **p_rdata);
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
diff --git a/pjsip/src/pjsip-ua/sip_100rel.c b/pjsip/src/pjsip-ua/sip_100rel.c
|
|
||||||
index eb9e587..7bf0ad1 100644
|
|
||||||
--- a/pjsip/src/pjsip-ua/sip_100rel.c
|
|
||||||
+++ b/pjsip/src/pjsip-ua/sip_100rel.c
|
|
||||||
@@ -634,47 +634,6 @@ static void on_retransmit(pj_timer_heap_t *timer_heap,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-/* Clone response. */
|
|
||||||
-static pjsip_tx_data *clone_tdata(dlg_data *dd,
|
|
||||||
- const pjsip_tx_data *src)
|
|
||||||
-{
|
|
||||||
- pjsip_tx_data *dst;
|
|
||||||
- const pjsip_hdr *hsrc;
|
|
||||||
- pjsip_msg *msg;
|
|
||||||
- pj_status_t status;
|
|
||||||
-
|
|
||||||
- status = pjsip_endpt_create_tdata(dd->inv->dlg->endpt, &dst);
|
|
||||||
- if (status != PJ_SUCCESS)
|
|
||||||
- return NULL;
|
|
||||||
-
|
|
||||||
- msg = pjsip_msg_create(dst->pool, PJSIP_RESPONSE_MSG);
|
|
||||||
- dst->msg = msg;
|
|
||||||
- pjsip_tx_data_add_ref(dst);
|
|
||||||
-
|
|
||||||
- /* Duplicate status line */
|
|
||||||
- msg->line.status.code = src->msg->line.status.code;
|
|
||||||
- pj_strdup(dst->pool, &msg->line.status.reason,
|
|
||||||
- &src->msg->line.status.reason);
|
|
||||||
-
|
|
||||||
- /* Duplicate all headers */
|
|
||||||
- hsrc = src->msg->hdr.next;
|
|
||||||
- while (hsrc != &src->msg->hdr) {
|
|
||||||
- pjsip_hdr *h = (pjsip_hdr*) pjsip_hdr_clone(dst->pool, hsrc);
|
|
||||||
- pjsip_msg_add_hdr(msg, h);
|
|
||||||
- hsrc = hsrc->next;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /* Duplicate message body */
|
|
||||||
- if (src->msg->body)
|
|
||||||
- msg->body = pjsip_msg_body_clone(dst->pool, src->msg->body);
|
|
||||||
-
|
|
||||||
- PJ_LOG(5,(dd->inv->dlg->obj_name,
|
|
||||||
- "Reliable response %s created",
|
|
||||||
- pjsip_tx_data_get_info(dst)));
|
|
||||||
-
|
|
||||||
- return dst;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
|
|
||||||
/* Check if any pending response in transmission list has SDP */
|
|
||||||
static pj_bool_t has_sdp(dlg_data *dd)
|
|
||||||
@@ -725,7 +684,7 @@ PJ_DEF(pj_status_t) pjsip_100rel_tx_response(pjsip_inv_session *inv,
|
|
||||||
* if it wants to send another response.
|
|
||||||
*/
|
|
||||||
old_tdata = tdata;
|
|
||||||
- tdata = clone_tdata(dd, old_tdata);
|
|
||||||
+ pjsip_tx_data_clone(old_tdata, 0, &tdata);
|
|
||||||
pjsip_tx_data_dec_ref(old_tdata);
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
index 16a0e17..da28903 100644
|
|
||||||
--- a/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
+++ b/pjsip/src/pjsip-ua/sip_inv.c
|
|
||||||
@@ -2382,6 +2382,7 @@ PJ_DEF(pj_status_t) pjsip_inv_answer( pjsip_inv_session *inv,
|
|
||||||
pjsip_tx_data **p_tdata )
|
|
||||||
{
|
|
||||||
pjsip_tx_data *last_res;
|
|
||||||
+ pjsip_tx_data *old_res;
|
|
||||||
pj_status_t status;
|
|
||||||
|
|
||||||
/* Verify arguments. */
|
|
||||||
@@ -2397,8 +2398,19 @@ PJ_DEF(pj_status_t) pjsip_inv_answer( pjsip_inv_session *inv,
|
|
||||||
|
|
||||||
pjsip_dlg_inc_lock(inv->dlg);
|
|
||||||
|
|
||||||
+ /* Clone last response.
|
|
||||||
+ * The tdata (last_answer) is a shared object used by the transaction.
|
|
||||||
+ * Modifying a shared object might lead to a deadlock.
|
|
||||||
+ * Refer to ticket #2137 for more detail.
|
|
||||||
+ */
|
|
||||||
+ status = pjsip_tx_data_clone(inv->last_answer, 0, &last_res);
|
|
||||||
+ if (status != PJ_SUCCESS)
|
|
||||||
+ goto on_return;
|
|
||||||
+ old_res = inv->last_answer;
|
|
||||||
+ inv->last_answer = last_res;
|
|
||||||
+ pjsip_tx_data_dec_ref(old_res);
|
|
||||||
+
|
|
||||||
/* Modify last response. */
|
|
||||||
- last_res = inv->last_answer;
|
|
||||||
status = pjsip_dlg_modify_response(inv->dlg, last_res, st_code, st_text);
|
|
||||||
if (status != PJ_SUCCESS)
|
|
||||||
goto on_return;
|
|
||||||
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
|
|
||||||
index f350fe7..3a8baca 100644
|
|
||||||
--- a/pjsip/src/pjsip/sip_transport.c
|
|
||||||
+++ b/pjsip/src/pjsip/sip_transport.c
|
|
||||||
@@ -643,6 +643,53 @@ PJ_DEF(pj_status_t) pjsip_tx_data_set_transport(pjsip_tx_data *tdata,
|
|
||||||
return PJ_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* Clone pjsip_tx_data. */
|
|
||||||
+PJ_DEF(pj_status_t) pjsip_tx_data_clone(const pjsip_tx_data *src,
|
|
||||||
+ unsigned flags,
|
|
||||||
+ pjsip_tx_data ** p_tdata)
|
|
||||||
+{
|
|
||||||
+ pjsip_tx_data *dst;
|
|
||||||
+ const pjsip_hdr *hsrc;
|
|
||||||
+ pjsip_msg *msg;
|
|
||||||
+ pj_status_t status;
|
|
||||||
+
|
|
||||||
+ PJ_UNUSED_ARG(flags);
|
|
||||||
+
|
|
||||||
+ status = pjsip_tx_data_create(src->mgr, p_tdata);
|
|
||||||
+ if (status != PJ_SUCCESS)
|
|
||||||
+ return status;
|
|
||||||
+
|
|
||||||
+ dst = *p_tdata;
|
|
||||||
+
|
|
||||||
+ msg = pjsip_msg_create(dst->pool, PJSIP_RESPONSE_MSG);
|
|
||||||
+ dst->msg = msg;
|
|
||||||
+ pjsip_tx_data_add_ref(dst);
|
|
||||||
+
|
|
||||||
+ /* Duplicate status line */
|
|
||||||
+ msg->line.status.code = src->msg->line.status.code;
|
|
||||||
+ pj_strdup(dst->pool, &msg->line.status.reason,
|
|
||||||
+ &src->msg->line.status.reason);
|
|
||||||
+
|
|
||||||
+ /* Duplicate all headers */
|
|
||||||
+ hsrc = src->msg->hdr.next;
|
|
||||||
+ while (hsrc != &src->msg->hdr) {
|
|
||||||
+ pjsip_hdr *h = (pjsip_hdr*) pjsip_hdr_clone(dst->pool, hsrc);
|
|
||||||
+ pjsip_msg_add_hdr(msg, h);
|
|
||||||
+ hsrc = hsrc->next;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Duplicate message body */
|
|
||||||
+ if (src->msg->body)
|
|
||||||
+ msg->body = pjsip_msg_body_clone(dst->pool, src->msg->body);
|
|
||||||
+
|
|
||||||
+ dst->is_pending = src->is_pending;
|
|
||||||
+
|
|
||||||
+ PJ_LOG(5,(THIS_FILE,
|
|
||||||
+ "Tx data %s cloned",
|
|
||||||
+ pjsip_tx_data_get_info(dst)));
|
|
||||||
+
|
|
||||||
+ return PJ_SUCCESS;
|
|
||||||
+}
|
|
||||||
|
|
||||||
PJ_DEF(char*) pjsip_rx_data_get_info(pjsip_rx_data *rdata)
|
|
||||||
{
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@@ -1,2 +0,0 @@
|
|||||||
8119f0d91a00b6f553099e6ee5358ade *pjproject-2.7.2.zip
|
|
||||||
fa3f0bc098c4bff48ddd92db1c016a7a pjproject-2.7.2.tar.bz2
|
|
2
third-party/pjproject/pjproject-2.8.tar.bz2.md5
vendored
Normal file
2
third-party/pjproject/pjproject-2.8.tar.bz2.md5
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
1d3cb8fd2752c724dc8798900f102e75 *pjproject-2.8.zip
|
||||||
|
6487d54213f270d307eaa60efc9f56f3 pjproject-2.8.tar.bz2
|
2
third-party/versions.mak
vendored
2
third-party/versions.mak
vendored
@@ -1,2 +1,2 @@
|
|||||||
JANSSON_VERSION = 2.11
|
JANSSON_VERSION = 2.11
|
||||||
PJPROJECT_VERSION = 2.7.2
|
PJPROJECT_VERSION = 2.8
|
||||||
|
Reference in New Issue
Block a user