mirror of
https://github.com/transmission/transmission
synced 2025-02-02 20:43:51 +00:00
Fix a case where NAT-PMP could falsely report a mapped port.
This commit is contained in:
parent
027a9f8cec
commit
7af80be925
1 changed files with 8 additions and 1 deletions
|
@ -78,6 +78,7 @@ struct tr_natpmp_s
|
||||||
#define PMP_STATE_TMPFAIL 7
|
#define PMP_STATE_TMPFAIL 7
|
||||||
char state;
|
char state;
|
||||||
unsigned int active : 1;
|
unsigned int active : 1;
|
||||||
|
unsigned int mapped : 1;
|
||||||
struct in_addr dest;
|
struct in_addr dest;
|
||||||
int newport;
|
int newport;
|
||||||
int mappedport;
|
int mappedport;
|
||||||
|
@ -220,7 +221,7 @@ tr_natpmpStatus( tr_natpmp_t * pmp )
|
||||||
ret = ( PMP_STATE_DELETING == pmp->state ?
|
ret = ( PMP_STATE_DELETING == pmp->state ?
|
||||||
TR_NAT_TRAVERSAL_UNMAPPING : TR_NAT_TRAVERSAL_DISABLED );
|
TR_NAT_TRAVERSAL_UNMAPPING : TR_NAT_TRAVERSAL_DISABLED );
|
||||||
}
|
}
|
||||||
else if( 0 < pmp->mappedport )
|
else if( pmp->mapped )
|
||||||
{
|
{
|
||||||
ret = TR_NAT_TRAVERSAL_MAPPED;
|
ret = TR_NAT_TRAVERSAL_MAPPED;
|
||||||
}
|
}
|
||||||
|
@ -242,6 +243,8 @@ tr_natpmpStatus( tr_natpmp_t * pmp )
|
||||||
break;
|
break;
|
||||||
case PMP_STATE_MAPPED:
|
case PMP_STATE_MAPPED:
|
||||||
default:
|
default:
|
||||||
|
/* if pmp->state is PMP_STATE_MAPPED then pmp->mapped
|
||||||
|
should be true */
|
||||||
assert( 0 );
|
assert( 0 );
|
||||||
ret = TR_NAT_TRAVERSAL_ERROR;
|
ret = TR_NAT_TRAVERSAL_ERROR;
|
||||||
break;
|
break;
|
||||||
|
@ -354,6 +357,7 @@ tr_natpmpPulse( tr_natpmp_t * pmp )
|
||||||
pmp->mappedport = pmp->req->port;
|
pmp->mappedport = pmp->req->port;
|
||||||
killreq( &pmp->req );
|
killreq( &pmp->req );
|
||||||
pmp->state = PMP_STATE_MAPPED;
|
pmp->state = PMP_STATE_MAPPED;
|
||||||
|
pmp->mapped = 1;
|
||||||
tr_dbg( "nat-pmp state add -> mapped with port %i",
|
tr_dbg( "nat-pmp state add -> mapped with port %i",
|
||||||
pmp->mappedport);
|
pmp->mappedport);
|
||||||
tr_inf( "nat-pmp mapped port %i", pmp->mappedport );
|
tr_inf( "nat-pmp mapped port %i", pmp->mappedport );
|
||||||
|
@ -383,11 +387,13 @@ tr_natpmpPulse( tr_natpmp_t * pmp )
|
||||||
case TR_NET_ERROR:
|
case TR_NET_ERROR:
|
||||||
if( pmp->req->nobodyhome )
|
if( pmp->req->nobodyhome )
|
||||||
{
|
{
|
||||||
|
pmp->mapped = 0;
|
||||||
pmp->state = PMP_STATE_NOBODYHOME;
|
pmp->state = PMP_STATE_NOBODYHOME;
|
||||||
tr_dbg( "nat-pmp state del -> nobodyhome on pulse" );
|
tr_dbg( "nat-pmp state del -> nobodyhome on pulse" );
|
||||||
}
|
}
|
||||||
else if( pmp->req->tmpfail )
|
else if( pmp->req->tmpfail )
|
||||||
{
|
{
|
||||||
|
pmp->mapped = 0;
|
||||||
pmp->state = PMP_STATE_TMPFAIL;
|
pmp->state = PMP_STATE_TMPFAIL;
|
||||||
tr_dbg( "nat-pmp state del -> err on pulse" );
|
tr_dbg( "nat-pmp state del -> err on pulse" );
|
||||||
pmp->mappedport = -1;
|
pmp->mappedport = -1;
|
||||||
|
@ -403,6 +409,7 @@ tr_natpmpPulse( tr_natpmp_t * pmp )
|
||||||
tr_dbg( "nat-pmp state del -> idle with port %i",
|
tr_dbg( "nat-pmp state del -> idle with port %i",
|
||||||
pmp->req->port);
|
pmp->req->port);
|
||||||
tr_inf( "nat-pmp unmapped port %i", pmp->req->port );
|
tr_inf( "nat-pmp unmapped port %i", pmp->req->port );
|
||||||
|
pmp->mapped = 0;
|
||||||
pmp->mappedport = -1;
|
pmp->mappedport = -1;
|
||||||
killreq( &pmp->req );
|
killreq( &pmp->req );
|
||||||
pmp->state = PMP_STATE_IDLE;
|
pmp->state = PMP_STATE_IDLE;
|
||||||
|
|
Loading…
Reference in a new issue