~ubuntu-branches/ubuntu/karmic/syslog-ng/karmic

« back to all changes in this revision

Viewing changes to src/afinet.c

  • Committer: Bazaar Package Importer
  • Author(s): SZALAY Attila
  • Date: 2007-12-22 15:54:58 UTC
  • mfrom: (1.1.9 upstream)
  • Revision ID: james.westby@ubuntu.com-20071222155458-bwnf7yns3djdbza1
Tags: 2.0.6-1
* New upstream version.
* This release addresses the following security issue:
  - A remote attacker can cause a denial of service (crash)
    via a crafted log message that is missing a whitespace
    at the end of the timestamp (CVE-2007-6437; Closes: #457334)

Show diffs side-by-side

added added

removed removed

Lines of Context:
87
87
}
88
88
 
89
89
static void
90
 
afinet_resolve_name(GSockAddr *addr, gchar *name)
 
90
afinet_resolve_name(GSockAddr **addr, gchar *name)
91
91
{
92
92
  if (addr)
93
93
    { 
96
96
      struct addrinfo *res;
97
97
 
98
98
      memset(&hints, 0, sizeof(hints));
99
 
      hints.ai_family = addr->sa.sa_family;
 
99
      hints.ai_family = (*addr)->sa.sa_family;
100
100
      hints.ai_socktype = 0;
101
101
      hints.ai_protocol = 0;
102
102
      
103
103
      if (getaddrinfo(name, NULL, &hints, &res) == 0)
104
104
        {
105
105
          /* we only use the first entry in the returned list */
106
 
          switch (addr->sa.sa_family)
 
106
          switch ((*addr)->sa.sa_family)
107
107
            {
108
108
            case AF_INET:
109
 
              g_sockaddr_inet_set_address(addr, ((struct sockaddr_in *) res->ai_addr)->sin_addr);
 
109
              g_sockaddr_inet_set_address((*addr), ((struct sockaddr_in *) res->ai_addr)->sin_addr);
110
110
              break;
111
111
#if ENABLE_IPV6
112
112
            case AF_INET6:
113
 
              g_sockaddr_inet6_set_address(addr, &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr);
 
113
              *g_sockaddr_inet6_get_sa((*addr)) = *((struct sockaddr_in6 *) res->ai_addr);
114
114
              break;
115
115
#endif
116
116
            default: 
121
121
        }
122
122
      else
123
123
        {
124
 
          msg_error("Error resolving hostname, using wildcard address", evt_tag_str("host", name), NULL);
 
124
          msg_error("Error resolving hostname", evt_tag_str("host", name), NULL);
 
125
          g_sockaddr_unref(*addr);
 
126
          *addr = NULL;
 
127
          return;
125
128
        }
126
129
#else
127
130
      struct hostent *he;
129
132
      he = gethostbyname(name);
130
133
      if (he)
131
134
        {
132
 
          switch (addr->sa.sa_family)
 
135
          switch ((*addr)->sa.sa_family)
133
136
            {
134
137
            case AF_INET:
135
 
              g_sockaddr_inet_set_address(addr, *(struct in_addr *) he->h_addr);
 
138
              g_sockaddr_inet_set_address((*addr), *(struct in_addr *) he->h_addr);
136
139
              break;
137
140
            default: 
138
141
              g_assert_not_reached();
142
145
        }
143
146
      else
144
147
        {
145
 
          msg_error("Error resolving hostname, using wildcard address", evt_tag_str("host", name), NULL);
 
148
          msg_error("Error resolving hostname", evt_tag_str("host", name), NULL);
 
149
          g_sockaddr_unref(*addr);
 
150
          *addr = NULL;
146
151
        }
147
152
#endif
148
153
    }
236
241
{
237
242
  AFSocketSourceDriver *self = (AFSocketSourceDriver *) s;
238
243
  
239
 
  afinet_resolve_name(self->bind_addr, ip);
 
244
  afinet_resolve_name(&self->bind_addr, ip);
240
245
}
241
246
 
242
247
static gboolean
268
273
      g_assert_not_reached();
269
274
#endif
270
275
    }
271
 
  afinet_resolve_name(self->super.bind_addr, host);
 
276
  afinet_resolve_name(&self->super.bind_addr, host);
272
277
  self->super.setup_socket = afinet_sd_setup_socket;
273
278
    
274
279
  return &self->super.super;
297
302
{
298
303
  AFInetDestDriver *self = (AFInetDestDriver *) s;
299
304
  
300
 
  afinet_resolve_name(self->super.bind_addr, ip);
 
305
  afinet_resolve_name(&self->super.bind_addr, ip);
301
306
}
302
307
 
303
308
void 
345
350
        }
346
351
    }
347
352
#endif
 
353
  
348
354
  return success;
349
355
}
350
356
 
535
541
      g_assert_not_reached();
536
542
#endif
537
543
    }
538
 
  afinet_resolve_name(self->super.dest_addr, host);
 
544
  afinet_resolve_name(&self->super.dest_addr, host);
539
545
  self->super.setup_socket = afinet_dd_setup_socket;
540
546
  return &self->super.super;
541
547
}