Cześć,

znalazłem małego buga w kodzie odpowiadającym za pobranie adresu
serwera z huba. Mianowicie, jeżeli wystąpi błąd w połączeniu, libgadu
zinterpretuje to, co dostanie jako adres serwera. Jeżeli więc nic nie
dostanie, będzie próbował szukać adresu hosta "", lub łączyć się z
255.255.255.255.

Powiązany ticket z Pidgina (z logiem): http://developer.pidgin.im/ticket/14046
Patch z łatką w załączniku.

---

Inny problem związany z tym ticketem: gg_read_line() otrzymało z
funkcji read() odpowiedź 11, czyli EAGAIN. W związku z tym powinien
próbować dalej, a nie wchodzić do ifa "error on read". Ktoś mi może to
wytłumaczyć? Gdzieś wyczytałem, że "prawdziwe" wartości błędów są
przeciwnego znaku, ale w tym logu kod błędu był przecież dodatni.

---

I jeszcze jedna uwaga: z tego, co widzę, to libgadu nie pozwala
odróżnić problemów z hubem od problemów z połączaniem z serwerem
docelowym. Można by było wtedy w razie problemów z hubem łączyć się
np. z ostatnim zapamiętanym przez aplikację serwerem. A może coś
takiego już jest, tylko ja tego nie widzę?

Można to rozwiązać dodając do gg_login_params flagę określającą, czy
server_addr jest adresem "zapasowym" (czyli używanym automatycznie
przez libgadu, jeżeli hub zawiedzie), czy wymaganym.


Pozdrawiam,
Tomek
Index: src/events.c
===================================================================
--- src/events.c	(wersja 1103)
+++ src/events.c	(kopia robocza)
@@ -453,7 +453,10 @@
 				gg_read_line(sess->fd, buf, sizeof(buf) - 1);
 
 			/* czytamy pierwszą linię danych. */
-			gg_read_line(sess->fd, buf, sizeof(buf) - 1);
+			if (gg_read_line(sess->fd, buf, sizeof(buf) - 1) == NULL) {
+				gg_debug_session(sess, GG_DEBUG_MISC, "// gg_watch_fd() read error\n");
+				goto fail_connecting;
+			}
 			gg_chomp(buf);
 
 			/* jeśli pierwsza liczba w linii nie jest równa zeru,
@@ -509,6 +512,12 @@
 				port = atoi(tmp + 1);
 			}
 
+			if (*host == '\0') {
+				gg_debug_session(sess, GG_DEBUG_MISC, "// gg_watch_fd() invalid response\n");
+				sess->fd = -1;
+				goto fail_connecting;
+			}
+
 			if (!strcmp(host, "notoperating")) {
 				gg_debug_session(sess, GG_DEBUG_MISC, "// gg_watch_fd() service unavailable\n", errno, strerror(errno));
 				sess->fd = -1;
_______________________________________________
libgadu-devel mailing list
[email protected]
http://lists.ziew.org/mailman/listinfo/libgadu-devel

Reply via email to