fix two "invalid read"s
authorPhilipp Tölke <toelke@in.tum.de>
Mon, 10 Jan 2011 21:41:35 +0000 (21:41 +0000)
committerPhilipp Tölke <toelke@in.tum.de>
Mon, 10 Jan 2011 21:41:35 +0000 (21:41 +0000)
src/vpn/gnunet-daemon-vpn.c
src/vpn/gnunet-daemon-vpn.h

index 2d6fef76e39ff272ab6babdb2633d502f65a02f3..00caadfb1487140fc068ea6c1fb5c796aa1b4f2b 100644 (file)
@@ -255,10 +255,11 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
 
        uint16_t namelen = strlen((char*)pkt->data+12)+1;
 
-       struct map_entry* value = GNUNET_malloc(sizeof(struct GNUNET_vpn_service_descriptor) + 2 + 8 + namelen);
+       struct map_entry* value = GNUNET_malloc(sizeof(struct map_entry) + namelen);
+       char* name = (char*)(value +1);
 
        value->namelen = namelen;
-       memcpy(value->name, pkt->data+12, namelen);
+       memcpy(name, pkt->data+12, namelen);
 
        memcpy(&value->desc, &pkt->service_descr, sizeof(struct GNUNET_vpn_service_descriptor));
 
@@ -318,13 +319,14 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
          }
 
         unsigned short namelen = htons(map_entry->namelen);
-       char* name = map_entry->name;
+       char* name = (char*)(map_entry + 1);
 
        list = GNUNET_malloc(2*sizeof(struct answer_packet_list*) + offset + 2 + ntohs(namelen));
 
        struct answer_packet* rpkt = &list->pkt;
 
-       memcpy(rpkt, pkt, offset);
+       /* The offset points to the first byte belonging to the address */
+       memcpy(rpkt, pkt, offset - 1);
 
        rpkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP;
        rpkt->hdr.size = ntohs(offset + 2 + ntohs(namelen));
index a53c296ef68be187860da72316716c68e7aeccda..cec47ae765d14f1f81722fb48a3604aa942bd31e 100644 (file)
@@ -77,9 +77,8 @@ struct map_entry {
     uint16_t namelen;
     uint64_t additional_ports;
     /**
-     * In DNS-Format!
+     * After this struct the name is located in DNS-Format!
      */
-    char name[1];
 };
 
 #endif /* end of include guard: GNUNET-DAEMON-VPN_H */