if (is_registered(client))
return err_alreadyregistered(client), sendbuf(client), 0;
free(client->username);
- client->username = malloc(strlen(args[0])+2);
+ size_t ulen = strlen(args[0]);
+ client->username = malloc(ulen+2);
if (!client->username)
abort();
client->umode &= ~UMODE_REGISTERED;
client->username[0] = '~';
- strcpy(client->username + 1, args[0]);
+ memcpy(client->username + 1, args[0], ulen+1);
// set realname
free(client->realname); // ditto
client->realname = mystrdup(args[3]);
void setNick(struct client_data *client, char* nickname) {
// TODO: perform basic sanitization
- if (strlen(nickname) >= MAX_NICKLEN || nickname[0] == '\0') {
+ size_t nicklen = strlen(nickname);
+ if (nicklen >= MAX_NICKLEN || nickname[0] == '\0') {
err_erroneusnickname(client, nickname), sendbuf(client);
return;
}
}
char key[MAX_NICKLEN];
- strcpy(key, nickname);
+ memcpy(key, nickname, nicklen+1);
stringlower(key);
if (trie_get(&client_map, key)) {
return; // FIXME: error
if (strchr(channel, '\7') || strchr(channel, ' ') || strchr(channel, ','))
return; // FIXME: error
- if (strlen(channel) > 32)
+ size_t chanlen = strlen(channel);
+ if (chanlen > 32)
return; // FIXME: error
char key[33];
- strcpy(key, channel);
+ memcpy(key, channel, chanlen+1);
stringlower(key);
struct channel *chan = trie_get(&channel_map, key);
int newchan = !chan;
}
struct channel *findChannel(const char *channel)
{
- if (strlen(channel) > 32)
+ size_t chanlen = strlen(channel);
+ if (chanlen > 32)
return NULL;
char key[33];
- strcpy(key, channel);
+ memcpy(key, channel, chanlen+1);
stringlower(key);
return trie_get(&channel_map, key);
}
{
// FIXME: 64-bit time_t support
char buf[26];
- strcpy(buf, ctime(&ts));
+ memcpy(buf, ctime(&ts), 26);
buf[24] = '\0';
copy_strf(&databuf, ":%s 391 %s %s :%s\r\n", hostname, client->nick, ts, buf);
}
inet_ntop(AF_INET6, &((struct sockaddr_in6*)&addr)->sin6_addr, client_addr, sizeof(client_addr));
port = ntohs(((struct sockaddr_in6*)&addr)->sin6_port);
} else {
- strcpy(client_addr, "?");
+ strcpy_lit(client_addr, "?");
port = 0;
}
fprintf(stderr, "Connection accepted from Socket: %"PRISocket", IP: %s PORT: %d\n", newSocket,
if (f) {
struct client_data *fake = allocClient();
fake->umode |= UMODE_OPER | UMODE_SECURE;
- strcpy(fake->buf, "NICK :root\r\n");
+ strcpy_lit(fake->buf, "NICK :root\r\n");
fake->bufLen = strlen(fake->buf);
parsePacket(fake);
- strcpy(fake->buf, "USER root 0 * :Patchouli Knowledge\r\n");
+ strcpy_lit(fake->buf, "USER root 0 * :Patchouli Knowledge\r\n");
fake->bufLen = strlen(fake->buf);
parsePacket(fake);
while (fgets(fake->buf, sizeof(fake->buf), f)) {
fake->bufLen = len;
parsePacket(fake);
}
- strcpy(fake->buf, "QUIT :bye\r\n");
+ strcpy_lit(fake->buf, "QUIT :bye\r\n");
fake->bufLen = strlen(fake->buf);
parsePacket(fake);
set_time(0);
void stringlower(char *s);
#ifndef _MSC_VER
#pragma GCC poison strdup
+
+#pragma GCC poison strcpy
+#pragma GCC poison strncpy
+#pragma GCC poison strcat
+#pragma GCC poison strncat
#endif
+#define strcpy_lit(a, b) memcpy((a), (b), sizeof(b))
char *mystrdup(const char *s);
time_t get_time();
void set_time(time_t t);