im.pidgin.pidgin: 18490886e6ced71f873dabe23516c5d3d16f0b29
markdoliner at pidgin.im
markdoliner at pidgin.im
Mon Jan 14 02:20:53 EST 2008
-----------------------------------------------------------------
Revision: 18490886e6ced71f873dabe23516c5d3d16f0b29
Ancestor: 95148e2e63a840d22205b1e62cad3cb1f1d1e0bc
Author: markdoliner at pidgin.im
Date: 2008-01-14T07:13:49
Branch: im.pidgin.pidgin
Modified files:
libpurple/dnsquery.c libpurple/dnssrv.c
ChangeLog:
More compiler warning fixes from o_sukhodolsky (with additions by me).
Fixes #4643, references #1344.
-------------- next part --------------
============================================================
--- libpurple/dnsquery.c 8dca34c4a17bd257b2d24fa0913cff5a0bb30b28
+++ libpurple/dnsquery.c ecb11160a2d07852718885a0f14c171aa3ac68bb
@@ -159,6 +159,24 @@ trap_gdb_bug(int sig)
}
#endif
+static void
+write_to_parent(int fd, const void *buf, size_t count)
+{
+ ssize_t written;
+
+ written = write(fd, buf, count);
+ if (written != count) {
+ if (written < 0)
+ fprintf(stderr, "dns[%d]: Error writing data to "
+ "parent: %s\n", getpid(), strerror(errno));
+ else
+ fprintf(stderr, "dns[%d]: Error: Tried to write %"
+ G_GSIZE_FORMAT " bytes to parent but instead "
+ "wrote %" G_GSIZE_FORMAT " bytes\n",
+ getpid(), count, written);
+ }
+}
+
G_GNUC_NORETURN static void
purple_dnsquery_resolver_run(int child_out, int child_in, gboolean show_debug)
{
@@ -201,7 +219,8 @@ purple_dnsquery_resolver_run(int child_o
}
rc = read(child_in, &dns_params, sizeof(dns_params_t));
if (rc < 0) {
- perror("read()");
+ fprintf(stderr, "dns[%d]: Error: Could not read dns_params: "
+ "%s\n", getpid(), strerror(errno));
break;
}
if (rc == 0) {
@@ -210,11 +229,13 @@ purple_dnsquery_resolver_run(int child_o
_exit(0);
}
if (dns_params.hostname[0] == '\0') {
- printf("dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port);
+ fprintf(stderr, "dns[%d]: Error: Parent requested resolution "
+ "of an empty hostname (port = %d)!!!\n", getpid(),
+ dns_params.port);
_exit(1);
}
/* Tell our parent that we read the data successfully */
- write(child_out, &ch, sizeof(ch));
+ write_to_parent(child_out, &ch, sizeof(ch));
/* We have the hostname and port, now resolve the IP */
@@ -230,7 +251,7 @@ purple_dnsquery_resolver_run(int child_o
*/
hints.ai_socktype = SOCK_STREAM;
rc = getaddrinfo(dns_params.hostname, servname, &hints, &res);
- write(child_out, &rc, sizeof(rc));
+ write_to_parent(child_out, &rc, sizeof(rc));
if (rc != 0) {
close(child_out);
if (show_debug)
@@ -242,17 +263,17 @@ purple_dnsquery_resolver_run(int child_o
tmp = res;
while (res) {
size_t ai_addrlen = res->ai_addrlen;
- write(child_out, &ai_addrlen, sizeof(ai_addrlen));
- write(child_out, res->ai_addr, res->ai_addrlen);
+ write_to_parent(child_out, &ai_addrlen, sizeof(ai_addrlen));
+ write_to_parent(child_out, res->ai_addr, res->ai_addrlen);
res = res->ai_next;
}
freeaddrinfo(tmp);
- write(child_out, &zero, sizeof(zero));
+ write_to_parent(child_out, &zero, sizeof(zero));
#else
if (!inet_aton(dns_params.hostname, &sin.sin_addr)) {
struct hostent *hp;
if (!(hp = gethostbyname(dns_params.hostname))) {
- write(child_out, &h_errno, sizeof(int));
+ write_to_parent(child_out, &h_errno, sizeof(int));
close(child_out);
if (show_debug)
printf("DNS Error: %d\n", h_errno);
@@ -265,10 +286,10 @@ purple_dnsquery_resolver_run(int child_o
sin.sin_family = AF_INET;
sin.sin_port = htons(dns_params.port);
- write(child_out, &zero, sizeof(zero));
- write(child_out, &addrlen, sizeof(addrlen));
- write(child_out, &sin, addrlen);
- write(child_out, &zero, sizeof(zero));
+ write_to_parent(child_out, &zero, sizeof(zero));
+ write_to_parent(child_out, &addrlen, sizeof(addrlen));
+ write_to_parent(child_out, &sin, addrlen);
+ write_to_parent(child_out, &zero, sizeof(zero));
#endif
dns_params.hostname[0] = '\0';
}
============================================================
--- libpurple/dnssrv.c 21f0607230b52f7bb12383741c8648a8df182f1c
+++ libpurple/dnssrv.c e5eadaaa7b13f1130e6144c212890b140d7e9a96
@@ -200,12 +200,20 @@ resolved(gpointer data, gint source, Pur
PurpleSrvCallback cb = query_data->cb;
int status;
- if (read(source, &size, sizeof(int)) > 0)
+ if (read(source, &size, sizeof(int)) == sizeof(int))
{
+ ssize_t red;
purple_debug_info("dnssrv","found %d SRV entries\n", size);
tmp = res = g_new0(PurpleSrvResponse, size);
for (i = 0; i < size; i++) {
- read(source, tmp++, sizeof(PurpleSrvResponse));
+ red = read(source, tmp++, sizeof(PurpleSrvResponse));
+ if (red != sizeof(PurpleSrvResponse)) {
+ purple_debug_error("dnssrv","unable to read srv "
+ "response: %s\n", g_strerror(errno));
+ size = 0;
+ g_free(res);
+ res = NULL;
+ }
}
}
else
More information about the Commits
mailing list