Skip to content

Commit 87da18a

Browse files
committed
Refactor and handle more errno's in rc_socket_got_data
- 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 <bjorn.bidar@thaodan.de>
1 parent a8a887c commit 87da18a

File tree

1 file changed

+70
-61
lines changed

1 file changed

+70
-61
lines changed

librocketchat.c

Lines changed: 70 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2443,7 +2443,8 @@ static void
24432443
rc_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInputCondition cond)
24442444
{
24452445
RocketChatAccount *ya = userdata;
2446-
guchar length_code;
2446+
guchar length_code = -1;
2447+
gint ping_frame_len = -1;
24472448
int read_len = 0;
24482449
gboolean done_some_reads = FALSE;
24492450

@@ -2475,64 +2476,61 @@ rc_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInputCond
24752476
while(ya->frame || (read_len = purple_ssl_read(conn, &ya->packet_code, 1)) == 1) {
24762477
if (!ya->frame) {
24772478
if (ya->packet_code != 129) {
2479+
24782480
if (ya->packet_code == 136) {
24792481
purple_debug_error("rocketchat", "websocket closed\n");
2480-
2481-
// Try reconnect
2482-
rc_start_socket(ya);
2483-
2484-
return;
2485-
} else if (ya->packet_code == 137) {
2486-
// Ping
2487-
gint ping_frame_len;
2488-
length_code = 0;
2489-
purple_ssl_read(conn, &length_code, 1);
2490-
if (length_code <= 125) {
2491-
ping_frame_len = length_code;
2492-
} else if (length_code == 126) {
2493-
guchar len_buf[2];
2494-
purple_ssl_read(conn, len_buf, 2);
2495-
ping_frame_len = (len_buf[0] << 8) + len_buf[1];
2496-
} else if (length_code == 127) {
2497-
purple_ssl_read(conn, &ping_frame_len, 8);
2498-
ping_frame_len = GUINT64_FROM_BE(ping_frame_len);
2499-
}
2500-
if (ping_frame_len) {
2501-
guchar *pong_data = g_new0(guchar, ping_frame_len);
2502-
purple_ssl_read(conn, pong_data, ping_frame_len);
2503-
2504-
rc_socket_write_data(ya, pong_data, ping_frame_len, 138);
2505-
g_free(pong_data);
2506-
} else {
2507-
rc_socket_write_data(ya, (guchar *) "", 0, 138);
2508-
}
2509-
return;
2510-
} else if (ya->packet_code == 138) {
2511-
// Pong
2512-
//who cares
2513-
return;
2514-
}
2515-
purple_debug_error("rocketchat", "unknown websocket error %d\n", ya->packet_code);
2516-
return;
2517-
}
2482+
goto try_reconnect;
2483+
}
2484+
2485+
if (ya->packet_code == 137) {
2486+
// Ping
2487+
length_code = 0;
2488+
purple_ssl_read(conn, &length_code, 1);
2489+
if (length_code <= 125) {
2490+
ping_frame_len = length_code;
2491+
} else if (length_code == 126) {
2492+
guchar len_buf[2];
2493+
purple_ssl_read(conn, len_buf, 2);
2494+
ping_frame_len = (len_buf[0] << 8) + len_buf[1];
2495+
} else if (length_code == 127) {
2496+
purple_ssl_read(conn, &ping_frame_len, 8);
2497+
ping_frame_len = GUINT64_FROM_BE(ping_frame_len);
2498+
}
2499+
if (ping_frame_len) {
2500+
guchar *pong_data = g_new0(guchar, ping_frame_len);
2501+
purple_ssl_read(conn, pong_data, ping_frame_len);
2502+
2503+
rc_socket_write_data(ya, pong_data, ping_frame_len, 138);
2504+
g_free(pong_data);
2505+
} else {
2506+
rc_socket_write_data(ya, (guchar *) "", 0, 138);
2507+
}
2508+
return;
2509+
} else if (ya->packet_code == 138) {
2510+
// Pong
2511+
return;
2512+
}
2513+
purple_debug_error("rocketchat", "unknown websocket error %d\n", ya->packet_code);
2514+
return;
2515+
}
25182516

2519-
length_code = 0;
2520-
purple_ssl_read(conn, &length_code, 1);
2521-
if (length_code <= 125) {
2522-
ya->frame_len = length_code;
2523-
} else if (length_code == 126) {
2524-
guchar len_buf[2];
2525-
purple_ssl_read(conn, len_buf, 2);
2526-
ya->frame_len = (len_buf[0] << 8) + len_buf[1];
2527-
} else if (length_code == 127) {
2528-
purple_ssl_read(conn, &ya->frame_len, 8);
2529-
ya->frame_len = GUINT64_FROM_BE(ya->frame_len);
2530-
}
2531-
//purple_debug_info("rocketchat", "frame_len: %" G_GUINT64_FORMAT "\n", ya->frame_len);
2517+
length_code = 0;
2518+
purple_ssl_read(conn, &length_code, 1);
2519+
if (length_code <= 125) {
2520+
ya->frame_len = length_code;
2521+
} else if (length_code == 126) {
2522+
guchar len_buf[2];
2523+
purple_ssl_read(conn, len_buf, 2);
2524+
ya->frame_len = (len_buf[0] << 8) + len_buf[1];
2525+
} else if (length_code == 127) {
2526+
purple_ssl_read(conn, &ya->frame_len, 8);
2527+
ya->frame_len = GUINT64_FROM_BE(ya->frame_len);
2528+
}
2529+
//purple_debug_info("rocketchat", "frame_len: %" G_GUINT64_FORMAT "\n", ya->frame_len);
25322530

2533-
ya->frame = g_new0(gchar, ya->frame_len + 1);
2534-
ya->frame_len_progress = 0;
2535-
}
2531+
ya->frame = g_new0(gchar, ya->frame_len + 1);
2532+
ya->frame_len_progress = 0;
2533+
}
25362534

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

2559-
if (done_some_reads == FALSE && read_len <= 0) {
2560-
if (read_len < 0 && errno == EAGAIN) {
2561-
return;
2562-
}
2557+
if (!done_some_reads && read_len <= 0) {
2558+
if (read_len == -1 && (errno == EAGAIN ||
2559+
errno == EINPROGRESS ||
2560+
errno == ENOENT)) {
2561+
return;
2562+
}
25632563

2564-
purple_debug_error("rocketchat", "got errno %d, read_len %d from websocket thread\n", errno, read_len);
2564+
purple_debug_error("rocketchat",
2565+
"got errno %d, read_len %d from websocket thread\n",
2566+
errno, read_len);
25652567

25662568
if (ya->frames_since_reconnect < 2) {
2567-
purple_connection_error(ya->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, "Lost connection to server");
2569+
purple_connection_error(ya->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
2570+
"Lost connection to server");
25682571
} else {
25692572
// Try reconnect
25702573
rc_start_socket(ya);
25712574
}
25722575
}
2576+
2577+
return;
2578+
2579+
try_reconnect:
2580+
rc_start_socket(ya);
2581+
return;
25732582
}
25742583

25752584
static void

0 commit comments

Comments
 (0)