Fixed possible socket leak in tcp_connect, added disconnect function to properly clean-up socket/tls resources on disconnect)

This commit is contained in:
Martin Fleisz 2011-08-24 08:07:55 -07:00
parent d4ae0b376e
commit 36e929f69c
5 changed files with 20 additions and 7 deletions

View File

@ -344,6 +344,7 @@ int dfreerdp_run(freerdp* instance)
freerdp_chanman_free(chanman);
df_free(dfi);
gdi_free(instance);
instance->Disconnect(instance);
freerdp_free(instance);
return 0;

View File

@ -597,6 +597,7 @@ int xfreerdp_run(freerdp* instance)
freerdp_chanman_close(chanman, instance);
freerdp_chanman_free(chanman);
instance->Disconnect(instance);
freerdp_free(instance);
xf_free(xfi);

View File

@ -44,6 +44,7 @@ typedef boolean (*pcGetFileDescriptor)(freerdp* instance, void** rfds, int* rcou
typedef boolean (*pcCheckFileDescriptor)(freerdp* instance);
typedef int (*pcSendChannelData)(freerdp* instance, int channelId, uint8* data, int size);
typedef int (*pcReceiveChannelData)(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size);
typedef void (*pcDisconnect)(freerdp* instance);
struct rdp_freerdp
{
@ -64,6 +65,7 @@ struct rdp_freerdp
pcCheckFileDescriptor CheckFileDescriptor;
pcSendChannelData SendChannelData;
pcReceiveChannelData ReceiveChannelData;
pcDisconnect Disconnect;
};
FREERDP_API freerdp* freerdp_new();

View File

@ -70,6 +70,14 @@ static int freerdp_send_channel_data(freerdp* instance, int channel_id, uint8* d
return rdp_send_channel_data(instance->rdp, channel_id, data, size);
}
void freerdp_disconnect(freerdp* instance)
{
rdpRdp* rdp;
rdp = (rdpRdp*) instance->rdp;
transport_disconnect(rdp->transport);
}
freerdp* freerdp_new()
{
freerdp* instance;
@ -88,6 +96,7 @@ freerdp* freerdp_new()
instance->GetFileDescriptor = freerdp_get_fds;
instance->CheckFileDescriptor = freerdp_check_fds;
instance->SendChannelData = freerdp_send_channel_data;
instance->Disconnect = freerdp_disconnect;
input_register_client_callbacks(rdp->input);
}

View File

@ -102,7 +102,6 @@ void tcp_get_mac_address(rdpTcp * tcp)
boolean tcp_connect(rdpTcp* tcp, const char* hostname, uint16 port)
{
int status;
int sockfd = -1;
char servname[10];
struct addrinfo hints = { 0 };
struct addrinfo * res, * ai;
@ -119,30 +118,31 @@ boolean tcp_connect(rdpTcp* tcp, const char* hostname, uint16 port)
return False;
}
tcp->sockfd = -1;
for (ai = res; ai; ai = ai->ai_next)
{
sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
tcp->sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
if (sockfd < 0)
if (tcp->sockfd < 0)
continue;
if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) == 0)
if (connect(tcp->sockfd, ai->ai_addr, ai->ai_addrlen) == 0)
{
printf("connected to %s:%s\n", hostname, servname);
break;
}
sockfd = -1;
close(tcp->sockfd);
tcp->sockfd = -1;
}
freeaddrinfo(res);
if (sockfd == -1)
if (tcp->sockfd == -1)
{
printf("unable to connect to %s:%s\n", hostname, servname);
return False;
}
tcp->sockfd = sockfd;
tcp_get_ip_address(tcp);
tcp_get_mac_address(tcp);