Skip to content

Commit

Permalink
Refactor and handle more errno's in rc_socket_got_data
Browse files Browse the repository at this point in the history
- Always initialize variables, ping_frame_len was uninitialized in
  some cases.
- Remove redundant else after if websocket closed switch to goto
  try_reconnect section.
- Handle also errno EINPROGRESS and ENOENT
- Indent

Signed-off-by: Björn Bidar <[email protected]>
  • Loading branch information
Thaodan committed Sep 25, 2022
1 parent a8a887c commit 87da18a
Showing 1 changed file with 70 additions and 61 deletions.
131 changes: 70 additions & 61 deletions librocketchat.c
Original file line number Diff line number Diff line change
Expand Up @@ -2443,7 +2443,8 @@ static void
rc_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInputCondition cond)
{
RocketChatAccount *ya = userdata;
guchar length_code;
guchar length_code = -1;
gint ping_frame_len = -1;
int read_len = 0;
gboolean done_some_reads = FALSE;

Expand Down Expand Up @@ -2475,64 +2476,61 @@ rc_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInputCond
while(ya->frame || (read_len = purple_ssl_read(conn, &ya->packet_code, 1)) == 1) {
if (!ya->frame) {
if (ya->packet_code != 129) {

if (ya->packet_code == 136) {
purple_debug_error("rocketchat", "websocket closed\n");

// Try reconnect
rc_start_socket(ya);

return;
} else if (ya->packet_code == 137) {
// Ping
gint ping_frame_len;
length_code = 0;
purple_ssl_read(conn, &length_code, 1);
if (length_code <= 125) {
ping_frame_len = length_code;
} else if (length_code == 126) {
guchar len_buf[2];
purple_ssl_read(conn, len_buf, 2);
ping_frame_len = (len_buf[0] << 8) + len_buf[1];
} else if (length_code == 127) {
purple_ssl_read(conn, &ping_frame_len, 8);
ping_frame_len = GUINT64_FROM_BE(ping_frame_len);
}
if (ping_frame_len) {
guchar *pong_data = g_new0(guchar, ping_frame_len);
purple_ssl_read(conn, pong_data, ping_frame_len);

rc_socket_write_data(ya, pong_data, ping_frame_len, 138);
g_free(pong_data);
} else {
rc_socket_write_data(ya, (guchar *) "", 0, 138);
}
return;
} else if (ya->packet_code == 138) {
// Pong
//who cares
return;
}
purple_debug_error("rocketchat", "unknown websocket error %d\n", ya->packet_code);
return;
}
goto try_reconnect;
}

if (ya->packet_code == 137) {
// Ping
length_code = 0;
purple_ssl_read(conn, &length_code, 1);
if (length_code <= 125) {
ping_frame_len = length_code;
} else if (length_code == 126) {
guchar len_buf[2];
purple_ssl_read(conn, len_buf, 2);
ping_frame_len = (len_buf[0] << 8) + len_buf[1];
} else if (length_code == 127) {
purple_ssl_read(conn, &ping_frame_len, 8);
ping_frame_len = GUINT64_FROM_BE(ping_frame_len);
}
if (ping_frame_len) {
guchar *pong_data = g_new0(guchar, ping_frame_len);
purple_ssl_read(conn, pong_data, ping_frame_len);

rc_socket_write_data(ya, pong_data, ping_frame_len, 138);
g_free(pong_data);
} else {
rc_socket_write_data(ya, (guchar *) "", 0, 138);
}
return;
} else if (ya->packet_code == 138) {
// Pong
return;
}
purple_debug_error("rocketchat", "unknown websocket error %d\n", ya->packet_code);
return;
}

length_code = 0;
purple_ssl_read(conn, &length_code, 1);
if (length_code <= 125) {
ya->frame_len = length_code;
} else if (length_code == 126) {
guchar len_buf[2];
purple_ssl_read(conn, len_buf, 2);
ya->frame_len = (len_buf[0] << 8) + len_buf[1];
} else if (length_code == 127) {
purple_ssl_read(conn, &ya->frame_len, 8);
ya->frame_len = GUINT64_FROM_BE(ya->frame_len);
}
//purple_debug_info("rocketchat", "frame_len: %" G_GUINT64_FORMAT "\n", ya->frame_len);
length_code = 0;
purple_ssl_read(conn, &length_code, 1);
if (length_code <= 125) {
ya->frame_len = length_code;
} else if (length_code == 126) {
guchar len_buf[2];
purple_ssl_read(conn, len_buf, 2);
ya->frame_len = (len_buf[0] << 8) + len_buf[1];
} else if (length_code == 127) {
purple_ssl_read(conn, &ya->frame_len, 8);
ya->frame_len = GUINT64_FROM_BE(ya->frame_len);
}
//purple_debug_info("rocketchat", "frame_len: %" G_GUINT64_FORMAT "\n", ya->frame_len);

ya->frame = g_new0(gchar, ya->frame_len + 1);
ya->frame_len_progress = 0;
}
ya->frame = g_new0(gchar, ya->frame_len + 1);
ya->frame_len_progress = 0;
}

do {
read_len = purple_ssl_read(conn, ya->frame + ya->frame_len_progress, ya->frame_len - ya->frame_len_progress);
Expand All @@ -2556,20 +2554,31 @@ rc_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInputCond
}
}

if (done_some_reads == FALSE && read_len <= 0) {
if (read_len < 0 && errno == EAGAIN) {
return;
}
if (!done_some_reads && read_len <= 0) {
if (read_len == -1 && (errno == EAGAIN ||
errno == EINPROGRESS ||
errno == ENOENT)) {
return;
}

purple_debug_error("rocketchat", "got errno %d, read_len %d from websocket thread\n", errno, read_len);
purple_debug_error("rocketchat",
"got errno %d, read_len %d from websocket thread\n",
errno, read_len);

if (ya->frames_since_reconnect < 2) {
purple_connection_error(ya->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, "Lost connection to server");
purple_connection_error(ya->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
"Lost connection to server");
} else {
// Try reconnect
rc_start_socket(ya);
}
}

return;

try_reconnect:
rc_start_socket(ya);
return;
}

static void
Expand Down

0 comments on commit 87da18a

Please sign in to comment.