summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
authorLuke Bratch <luke@bratch.co.uk>2019-06-16 22:19:51 +0100
committerLuke Bratch <luke@bratch.co.uk>2019-06-16 22:19:51 +0100
commit87b890b501a9ed7bfbfbe0fabde6ca1ca4c15086 (patch)
tree81792cec7a472be37b1e59f89e6a13e1ccc880e4 /functions.c
parent67fd69854489a088bc8d90702ba37cecccd6f169 (diff)
Handle very long lines and very short lines. Print to terminal if we fail to connect to server at startup. Don't print to terminal if sending to a client or to the server fails.
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/functions.c b/functions.c
index 82a98eb..3aa474f 100644
--- a/functions.c
+++ b/functions.c
@@ -387,6 +387,12 @@ int arrindex(struct client *clients, int clientfd) {
// Send whatever string to a specific client by providing the FD
// If "bypass" == 1 then permit sending to client even if unauthenticated (for instance for a CAP LS response)
int sendtoclient(int fd, char *strsrc, struct client *clients, struct settings *settings, int bypass) {
+ if (strlen(strsrc) > MAXDATASIZE) {
+ // String is too long!
+ debugprint(DEBUG_CRIT, "sendtoclient(): strsrc '%s' was too long (%d out of a max of %d characters).\n", strsrc, strlen(strsrc), MAXDATASIZE);
+ return 0;
+ }
+
// Copy to new string for passing to appendcrlf() to avoid overrun in appendcrlf()
char str[MAXDATASIZE];
strcpy(str, strsrc);
@@ -409,7 +415,6 @@ int sendtoclient(int fd, char *strsrc, struct client *clients, struct settings *
debugprint(DEBUG_SOME, "sendtoclient(): sending \"%s\" (length %zd) to client with fd %d.\n", str, strlen(str), fd);
if (socksend(clients[i].ssl, str, strlen(str), settings->clienttls) == -1) {
- perror("error: sendtoclient() socksend()\n");
debugprint(DEBUG_CRIT, "error: sendtoclient() socksend() error sending to client with fd '%d', errno '%d'.\n", fd, errno);
return 0;
}
@@ -421,9 +426,14 @@ int sendtoclient(int fd, char *strsrc, struct client *clients, struct settings *
// "except" is used to send to all clients _except_ the fd provided (except = 0 (EXCEPT_NONE) avoids this, i.e. sends to all)
// "except" is really the "sourcefd" and is also used as part of the authentication check - this is messy and they should perhaps be two separate arguments.
int sendtoallclients(struct client *clients, char *strsrc, int except, struct settings *settings) {
-
char *sendertype;
+ if (strlen(strsrc) > MAXDATASIZE) {
+ // String is too long!
+ debugprint(DEBUG_CRIT, "sendtoallclients(): strsrc '%s' was too long (%d out of a max of %d characters).\n", strsrc, strlen(strsrc), MAXDATASIZE);
+ return 0;
+ }
+
// Copy to new string for passing to appendcrlf() to avoid overrun in appendcrlf()
char str[MAXDATASIZE];
strcpy(str, strsrc);
@@ -470,7 +480,6 @@ int sendtoallclients(struct client *clients, char *strsrc, int except, struct se
}
debugprint(DEBUG_SOME, "sendtoallclients(): %s: sending '%s' to client with fd %d.\n", sendertype, str, clients[i].fd);
if (socksend(clients[i].ssl, str, strlen(str), settings->clienttls) == -1) {
- perror("error: sendtoallclients() socksend()\n");
debugprint(DEBUG_CRIT, "error: sendtoallclients() socksend() error sending to client with fd '%d', errno '%d'.\n", clients[i].fd, errno);
}
}
@@ -483,7 +492,14 @@ int sendtoallclients(struct client *clients, char *strsrc, int except, struct se
// Client FD and arrays needed to make sure anything relayed from a client is from an authenticated client.
// clientfd of "0" means trusted, used when we are sending things ourselves that weren't relayed
// from a real client.
+// Returns 1 on success or 0 on failure. - TODO - Make callers care about this.
int sendtoserver(SSL *server_ssl, char *strsrc, int str_len, int clientfd, struct client *clients, struct settings *settings) {
+ if (strlen(strsrc) > MAXDATASIZE) {
+ // String is too long!
+ debugprint(DEBUG_CRIT, "sendtoserver(): strsrc '%s' was too long (%d out of a max of %d characters).\n", strsrc, strlen(strsrc), MAXDATASIZE);
+ return 0;
+ }
+
// Copy to new string for passing to appendcrlf() to avoid overrun in appendcrlf()
char str[MAXDATASIZE];
strcpy(str, strsrc);
@@ -502,19 +518,18 @@ int sendtoserver(SSL *server_ssl, char *strsrc, int str_len, int clientfd, struc
// Found client in array, check authentication status
if (!clients[i].authed) {
debugprint(DEBUG_SOME, "sendtoserver(): skipping unauthenticated client with fd %d.\n", clients[i].fd);
- return 0;
+ return 1;
}
}
}
debugprint(DEBUG_SOME, "sendtoserver(): sending '%s' to IRC server (length %d).\n", str, str_len);
if (socksend(server_ssl, str, str_len, settings->servertls) == -1) {
- printf("error: sendtoserver() socksend()\n");
debugprint(DEBUG_CRIT, "error: sendtoserver() socksend() error sending to server, errno '%d'.\n", clientfd, errno);
- return 0;
+ return 1;
}
- return 1;
+ return 0;
}
// Disconnect the client fd "fd" by close()ing it and remove