diff -Nru transmission-2.13/debian/changelog transmission-2.13/debian/changelog --- transmission-2.13/debian/changelog 2011-03-22 18:59:26.000000000 +0100 +++ transmission-2.13/debian/changelog 2011-03-29 03:02:59.000000000 +0200 @@ -1,3 +1,10 @@ +transmission (2.13-0ubuntu8) natty; urgency=low + + * debian/patches/0113-fix_support_for_ipv6_trackers.patch: + - update patch to fix the crash it has introduced. (LP: #740614) + + -- Krzysztof Klimonda Tue, 29 Mar 2011 03:02:27 +0200 + transmission (2.13-0ubuntu7) natty; urgency=low * debian/patches/0108-sync_web_interface_turtle_mode_with_gui.patch diff -Nru transmission-2.13/debian/patches/0113-fix_support_for_ipv6_trackers.patch transmission-2.13/debian/patches/0113-fix_support_for_ipv6_trackers.patch --- transmission-2.13/debian/patches/0113-fix_support_for_ipv6_trackers.patch 2011-03-22 18:20:12.000000000 +0100 +++ transmission-2.13/debian/patches/0113-fix_support_for_ipv6_trackers.patch 2011-03-29 02:59:29.000000000 +0200 @@ -2,87 +2,132 @@ Origin: upstream, https://trac.transmissionbt.com/changeset/11611 Bug: https://trac.transmissionbt.com/ticket/3528 -Index: /branches/2.1x/libtransmission/web.c -=================================================================== ---- a/libtransmission/web.c (revision 11398) -+++ b/libtransmission/web.c (revision 11611) -@@ -143,4 +143,5 @@ - { - const tr_address * addr; -+ tr_bool is_default_value; - CURL * e = curl_easy_init( ); - const long verbose = getenv( "TR_CURL_VERBOSE" ) != NULL; -@@ -167,5 +168,7 @@ - curl_easy_setopt( e, CURLOPT_WRITEFUNCTION, writeFunc ); - -- if(( addr = tr_sessionGetPublicAddress( s, TR_AF_INET ))) -+ if((( addr = tr_sessionGetPublicAddress( s, TR_AF_INET, &is_default_value ))) && !is_default_value ) -+ curl_easy_setopt( e, CURLOPT_INTERFACE, tr_ntop_non_ts( addr ) ); -+ else if ((( addr = tr_sessionGetPublicAddress( s, TR_AF_INET6, &is_default_value ))) && !is_default_value ) - curl_easy_setopt( e, CURLOPT_INTERFACE, tr_ntop_non_ts( addr ) ); - -Index: /branches/2.1x/libtransmission/session.c -=================================================================== ---- a/libtransmission/session.c (revision 11496) -+++ b/libtransmission/session.c (revision 11611) -@@ -218,14 +218,29 @@ - - const tr_address* --tr_sessionGetPublicAddress( const tr_session * session, int tr_af_type ) --{ -+tr_sessionGetPublicAddress( const tr_session * session, int tr_af_type, tr_bool * is_default_value ) -+{ -+ const char * default_value; - const struct tr_bindinfo * bindinfo; - - switch( tr_af_type ) - { -- case TR_AF_INET: bindinfo = session->public_ipv4; break; -- case TR_AF_INET6: bindinfo = session->public_ipv6; break; -- default: bindinfo = NULL; break; -- } -+ case TR_AF_INET: -+ bindinfo = session->public_ipv4; -+ default_value = TR_DEFAULT_BIND_ADDRESS_IPV4; -+ break; -+ -+ case TR_AF_INET6: -+ bindinfo = session->public_ipv6; -+ default_value = TR_DEFAULT_BIND_ADDRESS_IPV6; -+ break; -+ -+ default: -+ bindinfo = NULL; -+ default_value = ""; -+ break; -+ } -+ -+ if( is_default_value != NULL ) -+ *is_default_value = !strcmp( default_value, tr_ntop_non_ts( &bindinfo->addr ) ); - - return bindinfo ? &bindinfo->addr : NULL; -Index: /branches/2.1x/libtransmission/net.c -=================================================================== ---- a/libtransmission/net.c (revision 11494) -+++ b/libtransmission/net.c (revision 11611) -@@ -317,5 +317,5 @@ - - /* set source address */ -- source_addr = tr_sessionGetPublicAddress( session, addr->type ); -+ source_addr = tr_sessionGetPublicAddress( session, addr->type, NULL ); - assert( source_addr ); - sourcelen = setup_sockaddr( source_addr, 0, &source_sock ); -Index: /branches/2.1x/libtransmission/session.h -=================================================================== ---- a/libtransmission/session.h (revision 11368) -+++ b/libtransmission/session.h (revision 11611) -@@ -219,5 +219,8 @@ - tr_bool tr_sessionIsLocked( const tr_session * ); - --const struct tr_address* tr_sessionGetPublicAddress( const tr_session *, int tr_af_type ); -+const struct tr_address* tr_sessionGetPublicAddress( const tr_session * session, -+ int tr_af_type, -+ tr_bool * is_default_value ); -+ - - struct tr_bindsockets * tr_sessionGetBindSockets( tr_session * ); +Index: natty/libtransmission/web.c +=================================================================== +--- natty.orig/libtransmission/web.c 2011-03-23 17:54:09.849397697 +0100 ++++ natty/libtransmission/web.c 2011-03-23 17:56:46.866176298 +0100 +@@ -142,6 +142,7 @@ + createEasy( tr_session * s, struct tr_web_task * task ) + { + const tr_address * addr; ++ tr_bool is_default_value; + CURL * e = curl_easy_init( ); + const long verbose = getenv( "TR_CURL_VERBOSE" ) != NULL; + char * cookie_filename = tr_buildPath( s->configDir, "cookies.txt", NULL ); +@@ -166,7 +167,9 @@ + curl_easy_setopt( e, CURLOPT_WRITEDATA, task ); + curl_easy_setopt( e, CURLOPT_WRITEFUNCTION, writeFunc ); + +- if(( addr = tr_sessionGetPublicAddress( s, TR_AF_INET ))) ++ if((( addr = tr_sessionGetPublicAddress( s, TR_AF_INET, &is_default_value ))) && !is_default_value ) ++ curl_easy_setopt( e, CURLOPT_INTERFACE, tr_ntop_non_ts( addr ) ); ++ else if ((( addr = tr_sessionGetPublicAddress( s, TR_AF_INET6, &is_default_value ))) && !is_default_value ) + curl_easy_setopt( e, CURLOPT_INTERFACE, tr_ntop_non_ts( addr ) ); + + if( task->range ) +Index: natty/libtransmission/session.c +=================================================================== +--- natty.orig/libtransmission/session.c 2011-03-23 17:54:09.841397657 +0100 ++++ natty/libtransmission/session.c 2011-03-29 02:57:46.943933483 +0200 +@@ -217,17 +217,32 @@ + } + + const tr_address* +-tr_sessionGetPublicAddress( const tr_session * session, int tr_af_type ) ++tr_sessionGetPublicAddress( const tr_session * session, int tr_af_type, tr_bool * is_default_value ) + { ++ const char * default_value; + const struct tr_bindinfo * bindinfo; + + switch( tr_af_type ) + { +- case TR_AF_INET: bindinfo = session->public_ipv4; break; +- case TR_AF_INET6: bindinfo = session->public_ipv6; break; +- default: bindinfo = NULL; break; ++ case TR_AF_INET: ++ bindinfo = session->public_ipv4; ++ default_value = TR_DEFAULT_BIND_ADDRESS_IPV4; ++ break; ++ ++ case TR_AF_INET6: ++ bindinfo = session->public_ipv6; ++ default_value = TR_DEFAULT_BIND_ADDRESS_IPV6; ++ break; ++ ++ default: ++ bindinfo = NULL; ++ default_value = ""; ++ break; + } + ++ if( is_default_value != NULL && bindinfo ) ++ *is_default_value = !tr_strcmp0( default_value, tr_ntop_non_ts( &bindinfo->addr ) ); ++ + return bindinfo ? &bindinfo->addr : NULL; + } + +Index: natty/libtransmission/net.c +=================================================================== +--- natty.orig/libtransmission/net.c 2011-03-23 17:54:09.861397763 +0100 ++++ natty/libtransmission/net.c 2011-03-23 17:56:46.866176298 +0100 +@@ -316,7 +316,7 @@ + addrlen = setup_sockaddr( addr, port, &sock ); + + /* set source address */ +- source_addr = tr_sessionGetPublicAddress( session, addr->type ); ++ source_addr = tr_sessionGetPublicAddress( session, addr->type, NULL ); + assert( source_addr ); + sourcelen = setup_sockaddr( source_addr, 0, &source_sock ); + if( bind( s, ( struct sockaddr * ) &source_sock, sourcelen ) ) +Index: natty/libtransmission/session.h +=================================================================== +--- natty.orig/libtransmission/session.h 2011-03-23 17:54:09.829397603 +0100 ++++ natty/libtransmission/session.h 2011-03-23 17:56:46.866176298 +0100 +@@ -218,7 +218,10 @@ + + tr_bool tr_sessionIsLocked( const tr_session * ); + +-const struct tr_address* tr_sessionGetPublicAddress( const tr_session *, int tr_af_type ); ++const struct tr_address* tr_sessionGetPublicAddress( const tr_session * session, ++ int tr_af_type, ++ tr_bool * is_default_value ); ++ + + struct tr_bindsockets * tr_sessionGetBindSockets( tr_session * ); + +Index: natty/libtransmission/utils.c +=================================================================== +--- natty.orig/libtransmission/utils.c 2011-03-29 02:58:37.340183383 +0200 ++++ natty/libtransmission/utils.c 2011-03-29 02:59:25.928424313 +0200 +@@ -768,6 +768,15 @@ + return ret; + } + ++int ++tr_strcmp0( const char * str1, const char * str2 ) ++{ ++ if( str1 && str2 ) return strcmp( str1, str2 ); ++ if( str1 ) return 1; ++ if( str2 ) return -1; ++ return 0; ++} ++ + /**** + ***** + ****/ +Index: natty/libtransmission/utils.h +=================================================================== +--- natty.orig/libtransmission/utils.h 2011-03-29 02:57:52.203959568 +0200 ++++ natty/libtransmission/utils.h 2011-03-29 02:58:35.136172464 +0200 +@@ -331,6 +331,11 @@ + char* tr_strndup( const void * in, int len ) TR_GNUC_MALLOC; + + /** ++* @brief like strcmp() but gracefully handles NULL strings ++*/ ++int tr_strcmp0( const char * str1, const char * str2 ); ++ ++/** + * @brief make a newly-allocated copy of a string + * @param in is a void* so that callers can pass in both signed & unsigned without a cast + * @return a newly-allocated copy of `in' that can be freed with tr_free()