]> PatchyGit - patchyircd.git/commitdiff
don't use str{,n}{cpy,cat}
authorEgor <egor@patchysicp.xyz>
Fri, 27 May 2022 08:51:45 +0000 (11:51 +0300)
committerEgor <egor@patchysicp.xyz>
Fri, 27 May 2022 08:51:45 +0000 (11:51 +0300)
irc.c
ircfmt.c
main.c
util.h

diff --git a/irc.c b/irc.c
index 5176a98..821d97d 100644 (file)
--- 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);
 }
index 9918ec0..61a6790 100644 (file)
--- 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 (file)
--- 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 (file)
--- 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);