165 lines
4.8 KiB
Plaintext
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;
|