commit 6e36691e96e68846c1334dc9f635814572421ea5
parent cb77fdfab1f23fb964fda156884d711202178d15
Author: Antoine Amarilli <a3nm@a3nm.net>
Date: Tue, 7 Feb 2012 01:30:05 +0100
compile against libircclient, fix possible buffer overflows
Diffstat:
irctk.c | | | 42 | +++++++++++++++--------------------------- |
1 file changed, 15 insertions(+), 27 deletions(-)
diff --git a/irctk.c b/irctk.c
@@ -14,6 +14,7 @@
#include <sys/time.h>
#include <libircclient/libircclient.h>
+#include <libircclient/libirc_rfcnumeric.h>
#include <unistd.h>
#include <pthread.h>
@@ -512,7 +513,7 @@ int cmd_msg_chan(irc_session_t *s, char *target, const char* line)
int cmd_msg(irc_session_t *s, char* target, const char* line)
{
int i = 0;
- char *msg[MAX_LEN]; /* TODO TODO TODO !! */
+ char *msg[2*MAX_LEN+2];
/* Manage the fact that target may be "" */
if (!target[0])
@@ -528,10 +529,9 @@ int cmd_msg(irc_session_t *s, char* target, const char* line)
if (line[0] != '\n')
{
msg[0] = 0;
- /*TODO USE strncat better!! */
- strncat(msg, args.last_nick_in, 1000);
+ strncat(msg, args.last_nick_in, MAX_LEN-1);
strcat(msg, ": ");
- strncat(msg, line, 3000);
+ strncat(msg, line, MAX_LEN-1);
line = msg;
} else {
args.last_nick_in[0] = 0;
@@ -568,19 +568,8 @@ THREAD_FUNCTION(irc_listen)
void dump_event (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
{
- char buf[512]; // TODO danger
- int cnt;
- int rsl;
-
- buf[0] = '\0';
-
- for ( cnt = 0; cnt < count; cnt++ )
- {
- if ( cnt )
- strcat (buf, "|");
-
- strcat (buf, params[cnt]);
- }
+ int cnt = 0;
+ int rsl; // TODO use
if (atoi(event) == LIBIRC_RFC_ERR_ERRONEUSNICKNAME)
{
@@ -607,8 +596,7 @@ void dump_event (irc_session_t * session, const char * event, const char * origi
}
}
-
- debug("Event \"%s\", origin: \"%s\", params: %d [%s]", event, origin ? origin : "NULL", cnt, buf);
+ debug("Event \"%s\", origin: \"%s\", params: %d", event, origin ? origin : "NULL", cnt);
}
void event_nick (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
@@ -812,9 +800,9 @@ void event_channel (irc_session_t * session, const char * event, const char * or
printf("%s\n", pruned);
}
if (strcmp(params[0], args.nick)) // if addressed in our private chan, reply on the sender's priv chan
- strcpy(args.last_chan_in, params[0]);
- else strcpy(args.last_chan_in, origin?origin:"someone");
- strcpy(args.last_nick_in, origin?origin:"someone");
+ strncpy(args.last_chan_in, params[0], MAX_LEN-1);
+ else strncpy(args.last_chan_in, origin?origin:"someone", MAX_LEN-1);
+ strncpy(args.last_nick_in, origin?origin:"someone", MAX_LEN-1);
fflush(stdout);
}
@@ -994,8 +982,8 @@ int start (int max_wait)
debug("ready", line);
- /* TODO don't do that but a buffer of things to send, so we can save
- * to whom we are sending what despite the delays */
+ /* TODO don't do that but have a buffer of things to send, so we can save to
+ * whom we are sending what despite the delays */
/* TODO no wait on empty lines */
@@ -1016,7 +1004,7 @@ int start (int max_wait)
msg = line + i + 1;
line[i-1] = 0;
cmd_msg(s, target, msg);
- strcpy(args.last_chans_out, target);
+ strncpy(args.last_chans_out, target, MAX_LEN-1);
} else {
/* No target specified, we attempt the default */
cmd_msg(s, "", line);
@@ -1046,8 +1034,8 @@ int main (int argc, char **argv)
//debug_args();
argp_parse (&argp, argc, argv, 0, 0, &args);
- strcpy(args.last_chan_in, first_chan());
- strcpy(args.last_chans_out, first_chan());
+ strncpy(args.last_chan_in, first_chan(), MAX_LEN-1);
+ strncpy(args.last_chans_out, first_chan(), MAX_LEN-1);
//debug_args();