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