From e4d05300767df1526f0885e6b2f909fd8cdc94ed Mon Sep 17 00:00:00 2001 From: Egor Date: Fri, 27 May 2022 11:51:45 +0300 Subject: [PATCH] don't use str{,n}{cpy,cat} --- irc.c | 20 ++++++++++++-------- ircfmt.c | 2 +- main.c | 8 ++++---- util.h | 6 ++++++ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/irc.c b/irc.c index 5176a98..821d97d 100644 --- a/irc.c +++ b/irc.c @@ -228,12 +228,13 @@ int processPacket(struct client_data *client, char *source, char *command, int a 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]); @@ -1018,7 +1019,8 @@ void sendMOTD(struct client_data *client) { 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; } @@ -1030,7 +1032,7 @@ void setNick(struct client_data *client, char* nickname) { } char key[MAX_NICKLEN]; - strcpy(key, nickname); + memcpy(key, nickname, nicklen+1); stringlower(key); if (trie_get(&client_map, key)) { @@ -1112,10 +1114,11 @@ void channel_join(struct client_data *client, const char *channel, const char *c 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; @@ -1227,10 +1230,11 @@ struct client_data *findClient(const char *nickname) } 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); } diff --git a/ircfmt.c b/ircfmt.c index 9918ec0..61a6790 100644 --- a/ircfmt.c +++ b/ircfmt.c @@ -445,7 +445,7 @@ void rpl_time(struct client_data *client, time_t ts) // 391 { // 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); } diff --git a/main.c b/main.c index 8318d7a..5d3838b 100644 --- a/main.c +++ b/main.c @@ -149,7 +149,7 @@ void accept_from_sock(struct listener *listener) 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, @@ -258,10 +258,10 @@ int main(int argc, char *argv[]) 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)) { @@ -296,7 +296,7 @@ int main(int argc, char *argv[]) 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); diff --git a/util.h b/util.h index edc75cd..26ee14d 100644 --- a/util.h +++ b/util.h @@ -15,7 +15,13 @@ void stringupper(char *s); 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); -- 2.56.0