aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dcc.c27
-rw-r--r--lib/ftutil.c77
-rw-r--r--lib/ftutil.h12
-rw-r--r--protocols/jabber/s5bytestream.c2
-rw-r--r--protocols/msn/invitation.c2
5 files changed, 55 insertions, 65 deletions
diff --git a/dcc.c b/dcc.c
index 655c98b9..d28c3b34 100644
--- a/dcc.c
+++ b/dcc.c
@@ -61,8 +61,6 @@ unsigned int local_transfer_id=1;
*/
unsigned int receivedchunks=0, receiveddata=0;
-int max_packet_size = 0;
-
static void dcc_finish( file_transfer_t *file );
static void dcc_close( file_transfer_t *file );
gboolean dccs_send_proto( gpointer data, gint fd, b_input_condition cond );
@@ -132,7 +130,7 @@ file_transfer_t *dccs_send_start( struct im_connection *ic, char *user_nick, cha
dcc_file_transfer_t *df;
struct sockaddr_storage saddr;
char *errmsg;
- char host[INET6_ADDRSTRLEN];
+ char host[HOST_NAME_MAX];
char port[6];
if( file_size > global.conf->ft_max_size )
@@ -289,24 +287,6 @@ gboolean dcc_poll( dcc_file_transfer_t *df, int fd, short *revents )
}
/*
- * fills max_packet_size with twice the TCP maximum segment size
- */
-gboolean dcc_check_maxseg( dcc_file_transfer_t *df, int fd )
-{
- /*
- * use twice the maximum segment size as a maximum for calls to send().
- */
- if( max_packet_size == 0 )
- {
- unsigned int mpslen = sizeof( max_packet_size );
- if( getsockopt( fd, IPPROTO_TCP, TCP_MAXSEG, &max_packet_size, &mpslen ) )
- return dcc_abort( df, "getsockopt() failed" );
- max_packet_size *= 2;
- }
- return TRUE;
-}
-
-/*
* After setup, the transfer itself is handled entirely by this function.
* There are basically four things to handle: connect, receive, send, and error.
*/
@@ -334,9 +314,6 @@ gboolean dccs_send_proto( gpointer data, gint fd, b_input_condition cond )
file->status = FT_STATUS_TRANSFERRING;
sock_make_nonblocking( fd );
- if ( !dcc_check_maxseg( df, fd ) )
- return FALSE;
-
/* IM protocol callback */
if( file->accept )
file->accept( file );
@@ -445,8 +422,6 @@ gboolean dccs_recv_proto( gpointer data, gint fd, b_input_condition cond )
( ft->status & FT_STATUS_CONNECTING ) )
{
ft->status = FT_STATUS_TRANSFERRING;
- if ( !dcc_check_maxseg( df, fd ) )
- return FALSE;
//df->watch_in = b_input_add( df->fd, GAIM_INPUT_READ, dccs_recv_proto, df );
diff --git a/lib/ftutil.c b/lib/ftutil.c
index 169a6480..d59dd4e0 100644
--- a/lib/ftutil.c
+++ b/lib/ftutil.c
@@ -27,63 +27,63 @@
#include <netinet/tcp.h>
#include "lib/ftutil.h"
-/* Some ifdefs for ulibc and apparently also BSD (Thanks to Whoopie) */
-#ifndef HOST_NAME_MAX
-#include <sys/param.h>
-#ifdef MAXHOSTNAMELEN
-#define HOST_NAME_MAX MAXHOSTNAMELEN
-#else
-#define HOST_NAME_MAX 255
-#endif
-#endif
-
#define ASSERTSOCKOP(op, msg) \
if( (op) == -1 ) {\
- sprintf( errmsg , msg ": %s", strerror( errno ) ); \
+ g_snprintf( errmsg, sizeof( errmsg ), msg ": %s", strerror( errno ) ); \
return -1; }
/*
* Creates a listening socket and returns it in saddr_ptr.
*/
-int ft_listen( struct sockaddr_storage *saddr_ptr, char *hostp, char *port, int for_bitlbee_client, char **errptr )
+int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int for_bitlbee_client, char **errptr )
{
- int fd,gret,saddrlen;
+ int fd, gret, saddrlen;
struct addrinfo hints, *rp;
socklen_t ssize = sizeof( struct sockaddr_storage );
struct sockaddr_storage saddrs, *saddr = &saddrs;
static char errmsg[1024];
- char host[ HOST_NAME_MAX + 1 ];
char *ftlisten = global.conf->ft_listen;
- *errptr = errmsg;
+ if( errptr )
+ *errptr = errmsg;
- sprintf( port, "0" );
+ strcpy( port, "0" );
/* Format is <IP-A>[:<Port-A>];<IP-B>[:<Port-B>] where
* A is for connections with the bitlbee client (DCC)
* and B is for connections with IM peers.
*/
- if( ftlisten ) {
+ if( ftlisten )
+ {
char *scolon = strchr( ftlisten, ';' );
char *colon;
- if( scolon ) {
- if( for_bitlbee_client ) {
+ if( scolon )
+ {
+ if( for_bitlbee_client )
+ {
*scolon = '\0';
- sprintf( host, ftlisten );
+ strncpy( host, ftlisten, HOST_NAME_MAX );
*scolon = ';';
- } else {
- sprintf( host, scolon + 1 );
}
- } else {
- sprintf( host, ftlisten );
+ else
+ {
+ strncpy( host, scolon + 1, HOST_NAME_MAX );
+ }
+ }
+ else
+ {
+ strncpy( host, ftlisten, HOST_NAME_MAX );
}
- if( ( colon = strchr( host, ':' ) ) ) {
+ if( ( colon = strchr( host, ':' ) ) )
+ {
*colon = '\0';
- sprintf( port, colon + 1 );
+ strncpy( port, colon + 1, 5 );
}
- } else {
+ }
+ else
+ {
ASSERTSOCKOP( gethostname( host, HOST_NAME_MAX + 1 ), "gethostname()" );
}
@@ -91,7 +91,8 @@ int ft_listen( struct sockaddr_storage *saddr_ptr, char *hostp, char *port, int
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_NUMERICSERV;
- if ( ( gret = getaddrinfo( host, port, &hints, &rp ) ) != 0 ) {
+ if ( ( gret = getaddrinfo( host, port, &hints, &rp ) ) != 0 )
+ {
sprintf( errmsg, "getaddrinfo() failed: %s", gai_strerror( gret ) );
return -1;
}
@@ -103,29 +104,31 @@ int ft_listen( struct sockaddr_storage *saddr_ptr, char *hostp, char *port, int
freeaddrinfo( rp );
ASSERTSOCKOP( fd = socket( saddr->ss_family, SOCK_STREAM, 0 ), "Opening socket" );
-
ASSERTSOCKOP( bind( fd, ( struct sockaddr *)saddr, saddrlen ), "Binding socket" );
-
ASSERTSOCKOP( listen( fd, 1 ), "Making socket listen" );
if ( !inet_ntop( saddr->ss_family, saddr->ss_family == AF_INET ?
- ( void * )&( ( struct sockaddr_in * ) saddr )->sin_addr.s_addr : ( void * )&( ( struct sockaddr_in6 * ) saddr )->sin6_addr.s6_addr
- , host, INET6_ADDRSTRLEN ) ) {
- sprintf( errmsg, "inet_ntop failed on listening socket" );
+ ( void * )&( ( struct sockaddr_in * ) saddr )->sin_addr.s_addr :
+ ( void * )&( ( struct sockaddr_in6 * ) saddr )->sin6_addr.s6_addr,
+ host, HOST_NAME_MAX ) )
+ {
+ strcpy( errmsg, "inet_ntop failed on listening socket" );
return -1;
}
ASSERTSOCKOP( getsockname( fd, ( struct sockaddr *)saddr, &ssize ), "Getting socket name" );
if( saddr->ss_family == AF_INET )
- sprintf( port, "%d", ntohs( ( ( struct sockaddr_in *) saddr )->sin_port ) );
+ g_snprintf( port, 6, "%d", ntohs( ( (struct sockaddr_in *) saddr )->sin_port ) );
else
- sprintf( port, "%d", ntohs( ( ( struct sockaddr_in6 *) saddr )->sin6_port ) );
+ g_snprintf( port, 6, "%d", ntohs( ( (struct sockaddr_in6 *) saddr )->sin6_port ) );
if( saddr_ptr )
memcpy( saddr_ptr, saddr, saddrlen );
- strcpy( hostp, host );
-
+ /* I hate static-length strings.. */
+ host[HOST_NAME_MAX] = '\0';
+ port[5] = '\0';
+
return fd;
}
diff --git a/lib/ftutil.h b/lib/ftutil.h
index 636fcbd0..c4a5b02b 100644
--- a/lib/ftutil.h
+++ b/lib/ftutil.h
@@ -25,4 +25,16 @@
#define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */
#endif
+/* Some ifdefs for ulibc and apparently also BSD (Thanks to Whoopie) */
+#ifndef HOST_NAME_MAX
+#include <sys/param.h>
+#ifdef MAXHOSTNAMELEN
+#define HOST_NAME_MAX MAXHOSTNAMELEN
+#else
+#define HOST_NAME_MAX 255
+#endif
+#endif
+
+/* This function should be used with care. host should be AT LEAST a
+ char[HOST_NAME_MAX+1] and port AT LEAST a char[6]. */
int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int for_bitlbee_client, char **errptr );
diff --git a/protocols/jabber/s5bytestream.c b/protocols/jabber/s5bytestream.c
index 3c5ce503..c292e61e 100644
--- a/protocols/jabber/s5bytestream.c
+++ b/protocols/jabber/s5bytestream.c
@@ -889,7 +889,7 @@ void jabber_si_set_proxies( struct bs_transfer *bt )
char *proxysetting = g_strdup ( set_getstr( &tf->ic->acc->set, "proxy" ) );
char *proxy, *next, *errmsg = NULL;
char port[6];
- char host[INET6_ADDRSTRLEN];
+ char host[HOST_NAME_MAX+1];
jabber_streamhost_t *sh, *sh2;
GSList *streamhosts = jd->streamhosts;
diff --git a/protocols/msn/invitation.c b/protocols/msn/invitation.c
index f44155fa..d2b2a5c8 100644
--- a/protocols/msn/invitation.c
+++ b/protocols/msn/invitation.c
@@ -218,7 +218,7 @@ void msn_invitations_accept( msn_filetransfer_t *msn_file, struct msn_switchboar
file_transfer_t *file = msn_file->dcc;
char buf[1024];
unsigned int acookie = time ( NULL );
- char host[INET6_ADDRSTRLEN];
+ char host[HOST_NAME_MAX+1];
char port[6];
char *errmsg;