-#ifdef TOO_OLD
-
#include "ircsprintf.h"
+#ifdef TOO_OLD
+
char num[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
char itoa_tab[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
char xtoa_tab[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
}
#endif
+#else /* TOO_OLD */
+
+/* Unlike snprintf(3), returns actual written length, not what would be */
+int ircsnprintf(char *str, size_t size, const char *fmt, ...)
+{
+ va_list vl;
+
+ va_start(vl, fmt);
+ (void) vsnprintf(str, size, fmt, vl);
+ va_end(vl);
+
+ str[size - 1] = '\0';
+
+ return strlen(str);
+}
+
+/* Unlike vsnprintf(3), returns actual written length, not what would be */
+int ircvsnprintf(char *str, size_t size, const char *fmt, va_list vl)
+{
+ (void) vsnprintf(str, size, fmt, vl);
+
+ str[size - 1] = '\0';
+
+ return strlen(str);
+}
+
#endif /* TOO_OLD */
extern int currently_processing_netsplit;
#endif
-static char sendbuf[2048];
-static char remotebuf[2048];
+#define SENDBUF_SIZE 2048
+static char sendbuf[SENDBUF_SIZE];
+static char remotebuf[SENDBUF_SIZE];
static char selfbuf[256];
static int dead_link(aClient *to, char *notice, int sockerr);
int len; /* used for the length of the current message */
va_start(vl, pattern);
- len = ircvsprintf(sendbuf, pattern, vl);
+ len = ircvsnprintf(sendbuf, sizeof(sendbuf), pattern, vl);
if (to->from)
to = to->from;
* remote: 1 if client is remote, 0 if local
* from: the client sending the message
* prefix: the prefix as specified (parv[0] usually)
- * buffer: the buffer to dump this into (NO BOUNDS CHECKING!)
+ * buffer: the buffer to dump this into
* pattern: varargs pattern
* vl: varargs variable list with one arg taken already
*/
*buffer = ':';
- if(!remote && IsPerson(from))
- {
+ if(!remote && IsPerson(from)) {
int flag = 0;
anUser *user = from->user;
- for(p = from->name; *p; p++)
- buffer[sidx++] = *p;
+ for (p = from->name; *p != '\0' && sidx < SENDBUF_SIZE; p++)
+ buffer[sidx++] = *p;
- if (user)
- {
- if (*user->username)
- {
- buffer[sidx++] = '!';
- for(p = user->username; *p; p++)
+ if (user) {
+ if (*user->username != '\0') {
+ if (sidx < SENDBUF_SIZE)
+ buffer[sidx++] = '!';
+ for (p = user->username; *p != '\0' && sidx < SENDBUF_SIZE;
+ p++)
buffer[sidx++] = *p;
}
- if (*user->host && !MyConnect(from))
- {
- buffer[sidx++] = '@';
- for(p = user->host; *p; p++)
+ if (*user->host != '\0' && !MyConnect(from)) {
+ if (sidx < SENDBUF_SIZE)
+ buffer[sidx++] = '@';
+ for (p = user->host; *p != '\0' && sidx < SENDBUF_SIZE; p++)
buffer[sidx++] = *p;
flag = 1;
}
}
- if (!flag && MyConnect(from) && *user->host)
- {
- buffer[sidx++] = '@';
- for(p = from->sockhost; *p; p++)
+ if (!flag && MyConnect(from) && *user->host != '\0') {
+ if (sidx < SENDBUF_SIZE)
+ buffer[sidx++] = '@';
+ for (p = from->sockhost; *p != '\0' && sidx < SENDBUF_SIZE; p++)
buffer[sidx++] = *p;
}
- }
- else
- {
- for(p = prefix; *p; p++)
+ } else {
+ for (p = prefix; *p != '\0' && sidx < SENDBUF_SIZE; p++)
buffer[sidx++] = *p;
}
- msglen = ircvsprintf(&buffer[sidx], pattern + 3, vl);
+ msglen = ircvsnprintf(&buffer[sidx], SENDBUF_SIZE - sidx, pattern + 3, vl);
msglen += sidx;
+ buffer[SENDBUF_SIZE - 1] = '\0';
return msglen;
}