openbsd-ports/net/bitlbee/patches/patch-irc_c

165 lines
4.8 KiB
Plaintext

$OpenBSD: patch-irc_c,v 1.2 2004/10/21 14:48:51 naddy Exp $
--- irc.c.orig Sat Sep 25 04:48:04 2004
+++ irc.c Thu Oct 14 15:43:33 2004
@@ -44,7 +44,7 @@ irc_t *irc_new( int fd )
irc->userhash = g_hash_table_new( g_str_hash, g_str_equal );
- strcpy( irc->umode, UMODE );
+ strlcpy( irc->umode, UMODE, sizeof(irc->umode) );
irc->mynick = g_strdup( ROOT_NICK );
irc->channel = g_strdup( ROOT_CHAN );
@@ -282,7 +282,7 @@ int irc_fill_buffer( irc_t *irc )
while( select( irc->fd + 1, readfds, NULL, NULL, tv ) > 0 )
{
- st = read( irc->fd, line, 255 );
+ st = read( irc->fd, line, sizeof(line)-1);
if( st <= 0 )
return( 0 );
line[st]='\0';
@@ -290,8 +290,9 @@ int irc_fill_buffer( irc_t *irc )
irc->readbuffer = g_strdup( line );
else
{
- irc->readbuffer = bitlbee_realloc(irc->readbuffer, strlen( irc->readbuffer ) + strlen ( line ) + 1 );
- strcpy( ( irc->readbuffer+strlen( irc->readbuffer ) ), line );
+ size_t new_len = strlen(irc->readbuffer) + strlen(line) + 1;
+ irc->readbuffer = bitlbee_realloc(irc->readbuffer, new_len);
+ strlcat( irc->readbuffer, line, new_len );
}
}
return 1;
@@ -353,8 +354,9 @@ int irc_write_buffer( irc_t *irc )
}
else
{
- temp = bitlbee_alloc( size - st + 1 );
- strcpy( temp, ( irc->sendbuffer + st ) );
+ size_t new_len = size - st + 1;
+ temp = bitlbee_alloc( new_len );
+ strlcpy( temp, ( irc->sendbuffer + st ), new_len );
g_free( irc->sendbuffer );
irc->sendbuffer = temp;
}
@@ -718,8 +720,8 @@ int irc_exec( irc_t *irc, char **cmd )
* cares?
*/
- strcat( buff, u->nick );
- strcat( buff, " " );
+ strlcat( buff, u->nick, sizeof(buff) );
+ strlcat( buff, " ", sizeof(buff) );
}
}
@@ -828,7 +830,7 @@ void irc_reply( irc_t *irc, int code, ch
va_list params;
va_start( params, format );
- g_vsnprintf( text, IRC_MAX_LINE, format, params );
+ g_vsnprintf( text, sizeof(text), format, params );
va_end( params );
irc_write( irc, ":%s %03d %s %s", irc->myhost, code, irc->nick?irc->nick:"*", text );
@@ -871,9 +873,10 @@ void irc_vawrite( irc_t *irc, char *form
if( irc->quit )
return;
- g_vsnprintf( line, IRC_MAX_LINE - 3, format, params );
+ /* allow 2 for \r\n */
+ g_vsnprintf( line, sizeof(line)-2, format, params );
- strcat( line, "\r\n" );
+ strlcat( line, "\r\n", sizeof(line) );
if( irc->sendbuffer != NULL ) {
size=strlen( irc->sendbuffer ) + strlen( line );
@@ -893,7 +896,7 @@ void irc_vawrite( irc_t *irc, char *form
}
#endif
irc->sendbuffer=bitlbee_realloc( irc->sendbuffer, size + 1 );
- strcpy( ( irc->sendbuffer + strlen( irc->sendbuffer ) ), line );
+ strlcat( irc->sendbuffer, line, size+1 );
}
else
irc->sendbuffer = g_strdup(line);
@@ -1063,15 +1066,19 @@ void irc_motd( irc_t *irc )
irc_reply( irc, 375, ":- %s Message Of The Day - ", irc->myhost );
while( read( fd, linebuf + len, 1 ) == 1 )
{
- if( linebuf[len] == '\n' || len == max )
+ /* If we have a LF, output the line and START AGAIN */
+ if( linebuf[len] == '\n')
{
linebuf[len] = 0;
irc_reply( irc, 372, ":- %s", linebuf );
len = 0;
+ continue;
}
- else if( linebuf[len] == '%' )
+
+ if( linebuf[len] == '%' )
{
- read( fd, linebuf + len, 1 );
+ if (read( fd, linebuf + len, 1 ) != 1)
+ break;
if( linebuf[len] == 'h' )
add = irc->myhost;
else if( linebuf[len] == 'v' )
@@ -1080,14 +1087,30 @@ void irc_motd( irc_t *irc )
add = irc->nick;
else
add = "%";
-
- strncpy( linebuf + len, add, max - len );
+
+ /* If the expanded string would be too long, output the line */
+ if ((len + strlen(add)) > max) {
+ linebuf[len] = 0;
+ irc_reply( irc, 372, ":- %s", linebuf );
+ len = 0;
+ }
+
+ /* Append the string to the line */
+ strlcpy( linebuf + len, add, max - len );
while( linebuf[++len] );
}
- else if( len < max )
+ else
{
len ++;
}
+
+ /* If we have reached the maximum, output the line */
+ if( len == max )
+ {
+ linebuf[len] = 0;
+ irc_reply( irc, 372, ":- %s", linebuf );
+ len = 0;
+ }
}
irc_reply( irc, 376, ":End of MOTD" );
closesocket( fd );
@@ -1361,8 +1384,8 @@ int buddy_send_handler( irc_t *irc, user
u->sendbuf = bitlbee_realloc( u->sendbuf, u->sendbuf_len );
}
- strcat( u->sendbuf, msg );
- strcat( u->sendbuf, "\n" );
+ strlcat( u->sendbuf, msg, u->sendbuf_len );
+ strlcat( u->sendbuf, "\n", u->sendbuf_len );
if( u->sendbuf_timer > 0 )
g_source_remove( u->sendbuf_timer );
@@ -1426,7 +1449,7 @@ int irc_msgfrom( irc_t *irc, char *nick,
if( !u->is_private && nick_cmp( u->nick, irc->mynick ) != 0 )
{
- int len = strlen( irc->nick) + 3;
+ size_t len = strlen( irc->nick) + 3;
prefix = bitlbee_alloc( len );
g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( irc, "to_char" ) );
prefix[len-1] = 0;