--- a/libpurple/protocols/irc/irc.c Thu Nov 16 20:37:08 2017 -0600
+++ b/libpurple/protocols/irc/irc.c Fri Nov 17 03:03:28 2017 +0000
@@ -685,31 +685,38 @@
- if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) {
- irc->inbuflen += IRC_INITIAL_BUFSIZE;
- irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen);
+ // resize buffer upwards so we have at least IRC_BUFSIZE_INCREMENT + if (irc->inbuflen < irc->inbufused + IRC_BUFSIZE_INCREMENT) { + if (irc->inbuflen + IRC_BUFSIZE_INCREMENT <= IRC_MAX_BUFSIZE) { + irc->inbuflen += IRC_BUFSIZE_INCREMENT; + irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); + // discard unparseable data from the buffer - len = purple_ssl_read(gsc, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1);
+ len = purple_ssl_read(gsc, irc->inbuf + irc->inbufused, irc->inbuflen - irc->inbufused - 1); - if (len < 0 && errno == EAGAIN) {
+ if (len < 0 && errno != EAGAIN) { gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"),
purple_connection_error_reason (gc,
PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
purple_connection_error_reason (gc,
PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
_("Server closed the connection"));
+ /* else: len < 0 && errno == EAGAIN; this is fine, try again later */ static void irc_input_cb(gpointer data, gint source, PurpleInputCondition cond)
@@ -718,12 +725,18 @@
struct irc_conn *irc = gc->proto_data;
- if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) {
- irc->inbuflen += IRC_INITIAL_BUFSIZE;
- irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen);
+ /* see irc_input_cb_ssl */ + if (irc->inbuflen < irc->inbufused + IRC_BUFSIZE_INCREMENT) { + if (irc->inbuflen + IRC_BUFSIZE_INCREMENT <= IRC_MAX_BUFSIZE) { + irc->inbuflen += IRC_BUFSIZE_INCREMENT; + irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); - len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1);
+ len = read(irc->fd, irc->inbuf + irc->inbufused, irc->inbuflen - irc->inbufused - 1); if (len < 0 && errno == EAGAIN) {
--- a/libpurple/protocols/irc/irc.h Thu Nov 16 20:37:08 2017 -0600
+++ b/libpurple/protocols/irc/irc.h Fri Nov 17 03:03:28 2017 +0000
@@ -44,7 +44,8 @@
#define IRC_DEFAULT_QUIT "Leaving."
-#define IRC_INITIAL_BUFSIZE 1024
+#define IRC_BUFSIZE_INCREMENT 1024 +#define IRC_MAX_BUFSIZE 16384 #define IRC_MAX_MSG_SIZE 512