aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-05-20 23:40:20 +0200
committerChristian Grothoff <christian@grothoff.org>2018-05-20 23:40:20 +0200
commitd080cb1ed80a0e528b2b755ee48ca18cb670175e (patch)
treed8c0edab6035e4d38138b303566e972fbf8b8c5f /src
parent0a8c135eedab5213b31c21b3d4b800e5f0f6041f (diff)
downloadgnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.tar.gz
gnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.zip
check return values from GNSRECORD_record_serialize/size always
Diffstat (limited to 'src')
-rw-r--r--src/gns/gnunet-service-gns.c27
-rw-r--r--src/gns/gnunet-service-gns_resolver.c21
-rw-r--r--src/gnsrecord/gnsrecord_crypto.c83
-rw-r--r--src/gnsrecord/gnsrecord_serialization.c34
-rw-r--r--src/include/gnunet_gnsrecord_lib.h4
-rw-r--r--src/namestore/gnunet-service-namestore.c230
-rw-r--r--src/namestore/namestore_api.c20
-rw-r--r--src/namestore/namestore_api_monitor.c7
-rw-r--r--src/namestore/plugin_namestore_flat.c16
-rw-r--r--src/namestore/plugin_namestore_postgres.c11
-rw-r--r--src/namestore/plugin_namestore_sqlite.c9
11 files changed, 318 insertions, 144 deletions
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c
index cffae824d..aaa4aeb0e 100644
--- a/src/gns/gnunet-service-gns.c
+++ b/src/gns/gnunet-service-gns.c
@@ -334,30 +334,43 @@ client_connect_cb (void *cls,
334 * @param rd the record data 334 * @param rd the record data
335 */ 335 */
336static void 336static void
337send_lookup_response (void* cls, 337send_lookup_response (void *cls,
338 uint32_t rd_count, 338 uint32_t rd_count,
339 const struct GNUNET_GNSRECORD_Data *rd) 339 const struct GNUNET_GNSRECORD_Data *rd)
340{ 340{
341 struct ClientLookupHandle *clh = cls; 341 struct ClientLookupHandle *clh = cls;
342 struct GnsClient *gc = clh->gc; 342 struct GnsClient *gc = clh->gc;
343 struct GNUNET_MQ_Envelope *env; 343 struct GNUNET_MQ_Envelope *env;
344 struct LookupResultMessage *rmsg; 344 struct LookupResultMessage *rmsg;
345 size_t len; 345 ssize_t len;
346 346
347 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 347 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
348 "Sending LOOKUP_RESULT message with %u results\n", 348 "Sending LOOKUP_RESULT message with %u results\n",
349 (unsigned int) rd_count); 349 (unsigned int) rd_count);
350 len = GNUNET_GNSRECORD_records_get_size (rd_count, 350 len = GNUNET_GNSRECORD_records_get_size (rd_count,
351 rd); 351 rd);
352 if (len < 0)
353 {
354 GNUNET_break (0);
355 GNUNET_SERVICE_client_drop (gc->client);
356 return;
357 }
358 if (len > UINT16_MAX - sizeof (*rmsg))
359 {
360 GNUNET_break (0);
361 GNUNET_SERVICE_client_drop (gc->client);
362 return;
363 }
352 env = GNUNET_MQ_msg_extra (rmsg, 364 env = GNUNET_MQ_msg_extra (rmsg,
353 len, 365 len,
354 GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT); 366 GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT);
355 rmsg->id = clh->request_id; 367 rmsg->id = clh->request_id;
356 rmsg->rd_count = htonl (rd_count); 368 rmsg->rd_count = htonl (rd_count);
357 GNUNET_GNSRECORD_records_serialize (rd_count, 369 GNUNET_assert (len ==
358 rd, 370 GNUNET_GNSRECORD_records_serialize (rd_count,
359 len, 371 rd,
360 (char*) &rmsg[1]); 372 len,
373 (char*) &rmsg[1]));
361 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (gc->client), 374 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (gc->client),
362 env); 375 env);
363 GNUNET_CONTAINER_DLL_remove (gc->clh_head, 376 GNUNET_CONTAINER_DLL_remove (gc->clh_head,
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c
index b66516363..8593e281e 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -280,7 +280,7 @@ struct VpnContext
280 /** 280 /**
281 * Number of bytes in @e rd_data. 281 * Number of bytes in @e rd_data.
282 */ 282 */
283 size_t rd_data_size; 283 ssize_t rd_data_size;
284}; 284};
285 285
286 286
@@ -1319,7 +1319,7 @@ vpn_allocation_cb (void *cls,
1319 vpn_ctx->vpn_request = NULL; 1319 vpn_ctx->vpn_request = NULL;
1320 rh->vpn_ctx = NULL; 1320 rh->vpn_ctx = NULL;
1321 GNUNET_assert (GNUNET_OK == 1321 GNUNET_assert (GNUNET_OK ==
1322 GNUNET_GNSRECORD_records_deserialize (vpn_ctx->rd_data_size, 1322 GNUNET_GNSRECORD_records_deserialize ((size_t) vpn_ctx->rd_data_size,
1323 vpn_ctx->rd_data, 1323 vpn_ctx->rd_data,
1324 vpn_ctx->rd_count, 1324 vpn_ctx->rd_count,
1325 rd)); 1325 rd));
@@ -1901,13 +1901,20 @@ handle_gns_resolution_result (void *cls,
1901 vpn_ctx->rh = rh; 1901 vpn_ctx->rh = rh;
1902 vpn_ctx->rd_data_size = GNUNET_GNSRECORD_records_get_size (rd_count, 1902 vpn_ctx->rd_data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
1903 rd); 1903 rd);
1904 vpn_ctx->rd_data = GNUNET_malloc (vpn_ctx->rd_data_size); 1904 if (vpn_ctx->rd_data_size < 0)
1905 {
1906 GNUNET_break_op (0);
1907 GNUNET_free (vpn_ctx);
1908 fail_resolution (rh);
1909 return;
1910 }
1911 vpn_ctx->rd_data = GNUNET_malloc ((size_t) vpn_ctx->rd_data_size);
1905 vpn_ctx->rd_count = rd_count; 1912 vpn_ctx->rd_count = rd_count;
1906 GNUNET_assert (vpn_ctx->rd_data_size == 1913 GNUNET_assert (vpn_ctx->rd_data_size ==
1907 (size_t) GNUNET_GNSRECORD_records_serialize (rd_count, 1914 GNUNET_GNSRECORD_records_serialize (rd_count,
1908 rd, 1915 rd,
1909 vpn_ctx->rd_data_size, 1916 (size_t) vpn_ctx->rd_data_size,
1910 vpn_ctx->rd_data)); 1917 vpn_ctx->rd_data));
1911 vpn_ctx->vpn_request = GNUNET_VPN_redirect_to_peer (vpn_handle, 1918 vpn_ctx->vpn_request = GNUNET_VPN_redirect_to_peer (vpn_handle,
1912 af, 1919 af,
1913 ntohs (vpn->proto), 1920 ntohs (vpn->proto),
diff --git a/src/gnsrecord/gnsrecord_crypto.c b/src/gnsrecord/gnsrecord_crypto.c
index 6d59a545a..6d3887392 100644
--- a/src/gnsrecord/gnsrecord_crypto.c
+++ b/src/gnsrecord/gnsrecord_crypto.c
@@ -87,9 +87,8 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
87 const struct GNUNET_GNSRECORD_Data *rd, 87 const struct GNUNET_GNSRECORD_Data *rd,
88 unsigned int rd_count) 88 unsigned int rd_count)
89{ 89{
90 size_t payload_len = GNUNET_GNSRECORD_records_get_size (rd_count, 90 ssize_t payload_len = GNUNET_GNSRECORD_records_get_size (rd_count,
91 rd); 91 rd);
92 char payload[sizeof (uint32_t) + payload_len];
93 struct GNUNET_GNSRECORD_Block *block; 92 struct GNUNET_GNSRECORD_Block *block;
94 struct GNUNET_CRYPTO_EcdsaPrivateKey *dkey; 93 struct GNUNET_CRYPTO_EcdsaPrivateKey *dkey;
95 struct GNUNET_CRYPTO_SymmetricInitializationVector iv; 94 struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
@@ -98,8 +97,16 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
98 uint32_t rd_count_nbo; 97 uint32_t rd_count_nbo;
99 struct GNUNET_TIME_Absolute now; 98 struct GNUNET_TIME_Absolute now;
100 99
100 if (payload_len < 0)
101 {
102 GNUNET_break (0);
103 return NULL;
104 }
101 if (payload_len > GNUNET_GNSRECORD_MAX_BLOCK_SIZE) 105 if (payload_len > GNUNET_GNSRECORD_MAX_BLOCK_SIZE)
106 {
107 GNUNET_break (0);
102 return NULL; 108 return NULL;
109 }
103 /* convert relative to absolute times */ 110 /* convert relative to absolute times */
104 now = GNUNET_TIME_absolute_get (); 111 now = GNUNET_TIME_absolute_get ();
105 for (unsigned int i=0;i<rd_count;i++) 112 for (unsigned int i=0;i<rd_count;i++)
@@ -117,39 +124,43 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
117 } 124 }
118 /* serialize */ 125 /* serialize */
119 rd_count_nbo = htonl (rd_count); 126 rd_count_nbo = htonl (rd_count);
120 GNUNET_memcpy (payload, 127 {
121 &rd_count_nbo, 128 char payload[sizeof (uint32_t) + payload_len];
122 sizeof (uint32_t)); 129
123 GNUNET_assert (payload_len == 130 GNUNET_memcpy (payload,
124 GNUNET_GNSRECORD_records_serialize (rd_count, 131 &rd_count_nbo,
125 rdc, 132 sizeof (uint32_t));
126 payload_len, 133 GNUNET_assert (payload_len ==
127 &payload[sizeof (uint32_t)])); 134 GNUNET_GNSRECORD_records_serialize (rd_count,
128 block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) + 135 rdc,
129 sizeof (uint32_t) + 136 payload_len,
130 payload_len); 137 &payload[sizeof (uint32_t)]));
131 block->purpose.size = htonl (sizeof (uint32_t) + 138 block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) +
132 payload_len + 139 sizeof (uint32_t) +
133 sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + 140 payload_len);
134 sizeof (struct GNUNET_TIME_AbsoluteNBO)); 141 block->purpose.size = htonl (sizeof (uint32_t) +
135 block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN); 142 payload_len +
136 block->expiration_time = GNUNET_TIME_absolute_hton (expire); 143 sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
137 /* encrypt and sign */ 144 sizeof (struct GNUNET_TIME_AbsoluteNBO));
138 dkey = GNUNET_CRYPTO_ecdsa_private_key_derive (key, 145 block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
139 label, 146 block->expiration_time = GNUNET_TIME_absolute_hton (expire);
140 "gns"); 147 /* encrypt and sign */
141 GNUNET_CRYPTO_ecdsa_key_get_public (dkey, 148 dkey = GNUNET_CRYPTO_ecdsa_private_key_derive (key,
142 &block->derived_key); 149 label,
143 derive_block_aes_key (&iv, 150 "gns");
144 &skey, 151 GNUNET_CRYPTO_ecdsa_key_get_public (dkey,
145 label, 152 &block->derived_key);
146 pkey); 153 derive_block_aes_key (&iv,
147 GNUNET_break (payload_len + sizeof (uint32_t) == 154 &skey,
148 GNUNET_CRYPTO_symmetric_encrypt (payload, 155 label,
149 payload_len + sizeof (uint32_t), 156 pkey);
150 &skey, 157 GNUNET_break (payload_len + sizeof (uint32_t) ==
151 &iv, 158 GNUNET_CRYPTO_symmetric_encrypt (payload,
152 &block[1])); 159 payload_len + sizeof (uint32_t),
160 &skey,
161 &iv,
162 &block[1]));
163 }
153 if (GNUNET_OK != 164 if (GNUNET_OK !=
154 GNUNET_CRYPTO_ecdsa_sign (dkey, 165 GNUNET_CRYPTO_ecdsa_sign (dkey,
155 &block->purpose, 166 &block->purpose,
diff --git a/src/gnsrecord/gnsrecord_serialization.c b/src/gnsrecord/gnsrecord_serialization.c
index 6164fa3db..5a862f82f 100644
--- a/src/gnsrecord/gnsrecord_serialization.c
+++ b/src/gnsrecord/gnsrecord_serialization.c
@@ -78,9 +78,9 @@ GNUNET_NETWORK_STRUCT_END
78 * 78 *
79 * @param rd_count number of records in the rd array 79 * @param rd_count number of records in the rd array
80 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements 80 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements
81 * @return the required size to serialize 81 * @return the required size to serialize, -1 on error
82 */ 82 */
83size_t 83ssize_t
84GNUNET_GNSRECORD_records_get_size (unsigned int rd_count, 84GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
85 const struct GNUNET_GNSRECORD_Data *rd) 85 const struct GNUNET_GNSRECORD_Data *rd)
86{ 86{
@@ -89,10 +89,34 @@ GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
89 ret = sizeof (struct NetworkRecord) * rd_count; 89 ret = sizeof (struct NetworkRecord) * rd_count;
90 for (unsigned int i=0;i<rd_count;i++) 90 for (unsigned int i=0;i<rd_count;i++)
91 { 91 {
92 GNUNET_assert ((ret + rd[i].data_size) >= ret); 92 if ((ret + rd[i].data_size) < ret)
93 {
94 GNUNET_break (0);
95 return -1;
96 }
93 ret += rd[i].data_size; 97 ret += rd[i].data_size;
98#if GNUNET_EXTRA_LOGGING
99 {
100 char *str;
101
102 str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
103 rd[i].data,
104 rd[i].data_size);
105 if (NULL == str)
106 {
107 GNUNET_break_op (0);
108 return -1;
109 }
110 GNUNET_free (str);
111 }
112#endif
94 } 113 }
95 return ret; 114 if (ret > SSIZE_MAX)
115 {
116 GNUNET_break (0);
117 return -1;
118 }
119 return (ssize_t) ret;
96} 120}
97 121
98 122
@@ -156,7 +180,7 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
156 if (NULL == str) 180 if (NULL == str)
157 { 181 {
158 GNUNET_break_op (0); 182 GNUNET_break_op (0);
159 return GNUNET_SYSERR; 183 return -1;
160 } 184 }
161 GNUNET_free (str); 185 GNUNET_free (str);
162 } 186 }
diff --git a/src/include/gnunet_gnsrecord_lib.h b/src/include/gnunet_gnsrecord_lib.h
index 38346ada3..56dadef3a 100644
--- a/src/include/gnunet_gnsrecord_lib.h
+++ b/src/include/gnunet_gnsrecord_lib.h
@@ -411,9 +411,9 @@ GNUNET_GNSRECORD_number_to_typename (uint32_t type);
411 * 411 *
412 * @param rd_count number of records in the @a rd array 412 * @param rd_count number of records in the @a rd array
413 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements 413 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements
414 * @return the required size to serialize 414 * @return the required size to serialize, -1 on error
415 */ 415 */
416size_t 416ssize_t
417GNUNET_GNSRECORD_records_get_size (unsigned int rd_count, 417GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
418 const struct GNUNET_GNSRECORD_Data *rd); 418 const struct GNUNET_GNSRECORD_Data *rd);
419 419
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c
index 8e88558de..1c73e2408 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -551,6 +551,7 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd,
551 size_t req; 551 size_t req;
552 char *data; 552 char *data;
553 size_t data_offset; 553 size_t data_offset;
554 struct GNUNET_GNSRECORD_Data *target;
554 555
555 (*rdc_res) = 1 + rd2_length; 556 (*rdc_res) = 1 + rd2_length;
556 if (0 == 1 + rd2_length) 557 if (0 == 1 + rd2_length)
@@ -560,38 +561,52 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd,
560 return; 561 return;
561 } 562 }
562 req = sizeof (struct GNUNET_GNSRECORD_Data) + nick_rd->data_size; 563 req = sizeof (struct GNUNET_GNSRECORD_Data) + nick_rd->data_size;
563 for (unsigned int c=0; c< rd2_length; c++) 564 for (unsigned int i=0; i<rd2_length; i++)
564 req += sizeof (struct GNUNET_GNSRECORD_Data) + rd2[c].data_size; 565 {
565 (*rd_res) = GNUNET_malloc (req); 566 const struct GNUNET_GNSRECORD_Data *orig = &rd2[i];
566 data = (char *) &(*rd_res)[1 + rd2_length]; 567
568 if (req + sizeof (struct GNUNET_GNSRECORD_Data) + orig->data_size < req)
569 {
570 GNUNET_break (0);
571 (*rd_res) = NULL;
572 return;
573 }
574 req += sizeof (struct GNUNET_GNSRECORD_Data) + orig->data_size;
575 }
576 target = GNUNET_malloc (req);
577 (*rd_res) = target;
578 data = (char *) &target[1 + rd2_length];
567 data_offset = 0; 579 data_offset = 0;
568 latest_expiration = 0; 580 latest_expiration = 0;
569 for (unsigned int c=0; c< rd2_length; c++) 581 for (unsigned int i=0;i<rd2_length;i++)
570 { 582 {
571 if (0 != (rd2[c].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)) 583 const struct GNUNET_GNSRECORD_Data *orig = &rd2[i];
584
585 if (0 != (orig->flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
572 { 586 {
573 if ((GNUNET_TIME_absolute_get().abs_value_us + rd2[c].expiration_time) > 587 if ((GNUNET_TIME_absolute_get().abs_value_us + orig->expiration_time) >
574 latest_expiration) 588 latest_expiration)
575 latest_expiration = rd2[c].expiration_time; 589 latest_expiration = orig->expiration_time;
576 } 590 }
577 else if (rd2[c].expiration_time > latest_expiration) 591 else if (orig->expiration_time > latest_expiration)
578 latest_expiration = rd2[c].expiration_time; 592 latest_expiration = orig->expiration_time;
579 (*rd_res)[c] = rd2[c]; 593 target[i] = *orig;
580 (*rd_res)[c].data = (void *) &data[data_offset]; 594 target[i].data = (void *) &data[data_offset];
581 GNUNET_memcpy (&data[data_offset], 595 GNUNET_memcpy (&data[data_offset],
582 rd2[c].data, 596 orig->data,
583 rd2[c].data_size); 597 orig->data_size);
584 data_offset += (*rd_res)[c].data_size; 598 data_offset += orig->data_size;
585 } 599 }
586 /* append nick */ 600 /* append nick */
587 (*rd_res)[rd2_length] = *nick_rd; 601 target[rd2_length] = *nick_rd;
588 (*rd_res)[rd2_length].expiration_time = latest_expiration; 602 target[rd2_length].expiration_time = latest_expiration;
589 (*rd_res)[rd2_length].data = (void *) &data[data_offset]; 603 target[rd2_length].data = (void *) &data[data_offset];
590 GNUNET_memcpy ((void *) (*rd_res)[rd2_length].data, 604 GNUNET_memcpy (&data[data_offset],
591 nick_rd->data, 605 nick_rd->data,
592 nick_rd->data_size); 606 nick_rd->data_size);
593 data_offset += (*rd_res)[rd2_length].data_size; 607 data_offset += nick_rd->data_size;
594 GNUNET_assert (req == (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + data_offset); 608 GNUNET_assert (req ==
609 (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + data_offset);
595} 610}
596 611
597 612
@@ -620,11 +635,16 @@ send_lookup_response (struct NamestoreClient *nc,
620 struct GNUNET_GNSRECORD_Data *res; 635 struct GNUNET_GNSRECORD_Data *res;
621 unsigned int res_count; 636 unsigned int res_count;
622 size_t name_len; 637 size_t name_len;
623 size_t rd_ser_len; 638 ssize_t rd_ser_len;
624 char *name_tmp; 639 char *name_tmp;
625 char *rd_ser; 640 char *rd_ser;
626 641
627 nick = get_nick_record (zone_key); 642 nick = get_nick_record (zone_key);
643
644 GNUNET_assert (-1 !=
645 GNUNET_GNSRECORD_records_get_size (rd_count,
646 rd));
647
628 if ( (NULL != nick) && 648 if ( (NULL != nick) &&
629 (0 != strcmp (name, 649 (0 != strcmp (name,
630 GNUNET_GNS_EMPTY_LABEL_AT))) 650 GNUNET_GNS_EMPTY_LABEL_AT)))
@@ -643,26 +663,44 @@ send_lookup_response (struct NamestoreClient *nc,
643 res = (struct GNUNET_GNSRECORD_Data *) rd; 663 res = (struct GNUNET_GNSRECORD_Data *) rd;
644 } 664 }
645 665
666 GNUNET_assert (-1 !=
667 GNUNET_GNSRECORD_records_get_size (res_count,
668 res));
669
670
646 name_len = strlen (name) + 1; 671 name_len = strlen (name) + 1;
647 rd_ser_len = GNUNET_GNSRECORD_records_get_size (res_count, 672 rd_ser_len = GNUNET_GNSRECORD_records_get_size (res_count,
648 res); 673 res);
674 if (rd_ser_len < 0)
675 {
676 GNUNET_break (0);
677 GNUNET_SERVICE_client_drop (nc->client);
678 return;
679 }
680 if (rd_ser_len >= UINT16_MAX - name_len - sizeof (*zir_msg))
681 {
682 GNUNET_break (0);
683 GNUNET_SERVICE_client_drop (nc->client);
684 return;
685 }
649 env = GNUNET_MQ_msg_extra (zir_msg, 686 env = GNUNET_MQ_msg_extra (zir_msg,
650 name_len + rd_ser_len, 687 name_len + rd_ser_len,
651 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT); 688 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT);
652 zir_msg->gns_header.r_id = htonl (request_id); 689 zir_msg->gns_header.r_id = htonl (request_id);
653 zir_msg->name_len = htons (name_len); 690 zir_msg->name_len = htons (name_len);
654 zir_msg->rd_count = htons (res_count); 691 zir_msg->rd_count = htons (res_count);
655 zir_msg->rd_len = htons (rd_ser_len); 692 zir_msg->rd_len = htons ((uint16_t) rd_ser_len);
656 zir_msg->private_key = *zone_key; 693 zir_msg->private_key = *zone_key;
657 name_tmp = (char *) &zir_msg[1]; 694 name_tmp = (char *) &zir_msg[1];
658 GNUNET_memcpy (name_tmp, 695 GNUNET_memcpy (name_tmp,
659 name, 696 name,
660 name_len); 697 name_len);
661 rd_ser = &name_tmp[name_len]; 698 rd_ser = &name_tmp[name_len];
662 GNUNET_GNSRECORD_records_serialize (res_count, 699 GNUNET_assert (rd_ser_len ==
663 res, 700 GNUNET_GNSRECORD_records_serialize (res_count,
664 rd_ser_len, 701 res,
665 rd_ser); 702 rd_ser_len,
703 rd_ser));
666 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 704 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
667 "Sending RECORD_RESULT message with %u records\n", 705 "Sending RECORD_RESULT message with %u records\n",
668 res_count); 706 res_count);
@@ -1073,12 +1111,13 @@ struct RecordLookupContext
1073 /** 1111 /**
1074 * FIXME. 1112 * FIXME.
1075 */ 1113 */
1076 size_t rd_ser_len; 1114 ssize_t rd_ser_len;
1077}; 1115};
1078 1116
1079 1117
1080/** 1118/**
1081 * FIXME. 1119 * FIXME.
1120 *
1082 * @param seq sequence number of the record 1121 * @param seq sequence number of the record
1083 */ 1122 */
1084static void 1123static void
@@ -1090,60 +1129,93 @@ lookup_it (void *cls,
1090 const struct GNUNET_GNSRECORD_Data *rd) 1129 const struct GNUNET_GNSRECORD_Data *rd)
1091{ 1130{
1092 struct RecordLookupContext *rlc = cls; 1131 struct RecordLookupContext *rlc = cls;
1093 struct GNUNET_GNSRECORD_Data *rd_res;
1094 unsigned int rdc_res;
1095 1132
1096 (void) private_key; 1133 (void) private_key;
1097 (void) seq; 1134 (void) seq;
1098 if (0 == strcmp (label, 1135 if (0 != strcmp (label,
1099 rlc->label)) 1136 rlc->label))
1137 return;
1138 rlc->found = GNUNET_YES;
1139 if (0 == rd_count)
1100 { 1140 {
1101 rlc->found = GNUNET_YES; 1141 rlc->rd_ser_len = 0;
1102 if (0 != rd_count) 1142 rlc->res_rd_count = 0;
1143 rlc->res_rd = NULL;
1144 return;
1145 }
1146 if ( (NULL != rlc->nick) &&
1147 (0 != strcmp (label,
1148 GNUNET_GNS_EMPTY_LABEL_AT)) )
1149 {
1150 /* Merge */
1151 struct GNUNET_GNSRECORD_Data *rd_res;
1152 unsigned int rdc_res;
1153
1154 rd_res = NULL;
1155 rdc_res = 0;
1156 rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE;
1157 merge_with_nick_records (rlc->nick,
1158 rd_count,
1159 rd,
1160 &rdc_res,
1161 &rd_res);
1162 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res,
1163 rd_res);
1164 if (rlc->rd_ser_len < 0)
1103 { 1165 {
1104 if ( (NULL != rlc->nick) && 1166 GNUNET_break (0);
1105 (0 != strcmp (label, 1167 GNUNET_free (rd_res);
1106 GNUNET_GNS_EMPTY_LABEL_AT)) ) 1168 rlc->found = GNUNET_NO;
1107 { 1169 rlc->rd_ser_len = 0;
1108 /* Merge */ 1170 return;
1109 rd_res = NULL; 1171 }
1110 rdc_res = 0; 1172 rlc->res_rd_count = rdc_res;
1111 rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; 1173 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
1112 merge_with_nick_records (rlc->nick, 1174 if (rlc->rd_ser_len !=
1113 rd_count,
1114 rd,
1115 &rdc_res,
1116 &rd_res);
1117 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res,
1118 rd_res);
1119 rlc->res_rd_count = rdc_res;
1120 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
1121 GNUNET_GNSRECORD_records_serialize (rdc_res, 1175 GNUNET_GNSRECORD_records_serialize (rdc_res,
1122 rd_res, 1176 rd_res,
1123 rlc->rd_ser_len, 1177 rlc->rd_ser_len,
1124 rlc->res_rd); 1178 rlc->res_rd))
1125 1179 {
1126 GNUNET_free (rd_res); 1180 GNUNET_break (0);
1127 GNUNET_free (rlc->nick); 1181 GNUNET_free (rlc->res_rd);
1128 rlc->nick = NULL; 1182 rlc->res_rd = NULL;
1129 } 1183 rlc->res_rd_count = 0;
1130 else 1184 rlc->rd_ser_len = 0;
1131 { 1185 GNUNET_free (rd_res);
1132 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count, 1186 rlc->found = GNUNET_NO;
1133 rd); 1187 return;
1134 rlc->res_rd_count = rd_count; 1188 }
1135 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len); 1189 GNUNET_free (rd_res);
1190 GNUNET_free (rlc->nick);
1191 rlc->nick = NULL;
1192 }
1193 else
1194 {
1195 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1196 rd);
1197 if (rlc->rd_ser_len < 0)
1198 {
1199 GNUNET_break (0);
1200 rlc->found = GNUNET_NO;
1201 rlc->rd_ser_len = 0;
1202 return;
1203 }
1204 rlc->res_rd_count = rd_count;
1205 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
1206 if (rlc->rd_ser_len !=
1136 GNUNET_GNSRECORD_records_serialize (rd_count, 1207 GNUNET_GNSRECORD_records_serialize (rd_count,
1137 rd, 1208 rd,
1138 rlc->rd_ser_len, 1209 rlc->rd_ser_len,
1139 rlc->res_rd); 1210 rlc->res_rd))
1140 }
1141 }
1142 else
1143 { 1211 {
1144 rlc->rd_ser_len = 0; 1212 GNUNET_break (0);
1145 rlc->res_rd_count = 0; 1213 GNUNET_free (rlc->res_rd);
1146 rlc->res_rd = NULL; 1214 rlc->res_rd = NULL;
1215 rlc->res_rd_count = 0;
1216 rlc->rd_ser_len = 0;
1217 rlc->found = GNUNET_NO;
1218 return;
1147 } 1219 }
1148 } 1220 }
1149} 1221}
@@ -1479,7 +1551,7 @@ handle_zone_to_name_it (void *cls,
1479 struct ZoneToNameResponseMessage *ztnr_msg; 1551 struct ZoneToNameResponseMessage *ztnr_msg;
1480 int16_t res; 1552 int16_t res;
1481 size_t name_len; 1553 size_t name_len;
1482 size_t rd_ser_len; 1554 ssize_t rd_ser_len;
1483 size_t msg_size; 1555 size_t msg_size;
1484 char *name_tmp; 1556 char *name_tmp;
1485 char *rd_tmp; 1557 char *rd_tmp;
@@ -1490,7 +1562,14 @@ handle_zone_to_name_it (void *cls,
1490 name); 1562 name);
1491 res = GNUNET_YES; 1563 res = GNUNET_YES;
1492 name_len = (NULL == name) ? 0 : strlen (name) + 1; 1564 name_len = (NULL == name) ? 0 : strlen (name) + 1;
1493 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count, rd); 1565 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1566 rd);
1567 if (rd_ser_len < 0)
1568 {
1569 GNUNET_break (0);
1570 ztn_ctx->success = GNUNET_SYSERR;
1571 return;
1572 }
1494 msg_size = sizeof (struct ZoneToNameResponseMessage) + name_len + rd_ser_len; 1573 msg_size = sizeof (struct ZoneToNameResponseMessage) + name_len + rd_ser_len;
1495 if (msg_size >= GNUNET_MAX_MESSAGE_SIZE) 1574 if (msg_size >= GNUNET_MAX_MESSAGE_SIZE)
1496 { 1575 {
@@ -1513,10 +1592,11 @@ handle_zone_to_name_it (void *cls,
1513 name, 1592 name,
1514 name_len); 1593 name_len);
1515 rd_tmp = &name_tmp[name_len]; 1594 rd_tmp = &name_tmp[name_len];
1516 GNUNET_GNSRECORD_records_serialize (rd_count, 1595 GNUNET_assert (rd_ser_len ==
1517 rd, 1596 GNUNET_GNSRECORD_records_serialize (rd_count,
1518 rd_ser_len, 1597 rd,
1519 rd_tmp); 1598 rd_ser_len,
1599 rd_tmp));
1520 ztn_ctx->success = GNUNET_OK; 1600 ztn_ctx->success = GNUNET_OK;
1521 GNUNET_MQ_send (ztn_ctx->nc->mq, 1601 GNUNET_MQ_send (ztn_ctx->nc->mq,
1522 env); 1602 env);
diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c
index 57bf8f81b..f2aaa43c8 100644
--- a/src/namestore/namestore_api.c
+++ b/src/namestore/namestore_api.c
@@ -1033,7 +1033,7 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1033 struct GNUNET_MQ_Envelope *env; 1033 struct GNUNET_MQ_Envelope *env;
1034 char *name_tmp; 1034 char *name_tmp;
1035 char *rd_ser; 1035 char *rd_ser;
1036 size_t rd_ser_len; 1036 ssize_t rd_ser_len;
1037 size_t name_len; 1037 size_t name_len;
1038 uint32_t rid; 1038 uint32_t rid;
1039 struct RecordStoreMessage *msg; 1039 struct RecordStoreMessage *msg;
@@ -1045,6 +1045,18 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1045 GNUNET_break (0); 1045 GNUNET_break (0);
1046 return NULL; 1046 return NULL;
1047 } 1047 }
1048 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1049 rd);
1050 if (rd_ser_len < 0)
1051 {
1052 GNUNET_break (0);
1053 return NULL;
1054 }
1055 if (rd_ser_len > UINT16_MAX)
1056 {
1057 GNUNET_break (0);
1058 return NULL;
1059 }
1048 rid = get_op_id (h); 1060 rid = get_op_id (h);
1049 qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry); 1061 qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry);
1050 qe->h = h; 1062 qe->h = h;
@@ -1056,8 +1068,6 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1056 qe); 1068 qe);
1057 1069
1058 /* setup msg */ 1070 /* setup msg */
1059 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1060 rd);
1061 env = GNUNET_MQ_msg_extra (msg, 1071 env = GNUNET_MQ_msg_extra (msg,
1062 name_len + rd_ser_len, 1072 name_len + rd_ser_len,
1063 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE); 1073 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE);
@@ -1077,8 +1087,10 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1077 rd, 1087 rd,
1078 rd_ser_len, 1088 rd_ser_len,
1079 rd_ser); 1089 rd_ser);
1080 if (0 > sret) 1090 if ( (0 > sret) ||
1091 (sret != rd_ser_len) )
1081 { 1092 {
1093 GNUNET_break (0);
1082 GNUNET_free (env); 1094 GNUNET_free (env);
1083 return NULL; 1095 return NULL;
1084 } 1096 }
diff --git a/src/namestore/namestore_api_monitor.c b/src/namestore/namestore_api_monitor.c
index 9ba90833b..16780ad0c 100644
--- a/src/namestore/namestore_api_monitor.c
+++ b/src/namestore/namestore_api_monitor.c
@@ -144,6 +144,11 @@ check_result (void *cls,
144 rd_len = ntohs (lrm->rd_len); 144 rd_len = ntohs (lrm->rd_len);
145 rd_count = ntohs (lrm->rd_count); 145 rd_count = ntohs (lrm->rd_count);
146 name_len = ntohs (lrm->name_len); 146 name_len = ntohs (lrm->name_len);
147 if (name_len > MAX_NAME_LEN)
148 {
149 GNUNET_break (0);
150 return GNUNET_SYSERR;
151 }
147 exp_lrm_len = sizeof (struct RecordResultMessage) + name_len + rd_len; 152 exp_lrm_len = sizeof (struct RecordResultMessage) + name_len + rd_len;
148 if (lrm_len != exp_lrm_len) 153 if (lrm_len != exp_lrm_len)
149 { 154 {
@@ -156,7 +161,7 @@ check_result (void *cls,
156 return GNUNET_SYSERR; 161 return GNUNET_SYSERR;
157 } 162 }
158 name_tmp = (const char *) &lrm[1]; 163 name_tmp = (const char *) &lrm[1];
159 if ((name_tmp[name_len -1] != '\0') || (name_len > MAX_NAME_LEN)) 164 if (name_tmp[name_len -1] != '\0')
160 { 165 {
161 GNUNET_break (0); 166 GNUNET_break (0);
162 return GNUNET_SYSERR; 167 return GNUNET_SYSERR;
diff --git a/src/namestore/plugin_namestore_flat.c b/src/namestore/plugin_namestore_flat.c
index 35d8424b4..95edb9d87 100644
--- a/src/namestore/plugin_namestore_flat.c
+++ b/src/namestore/plugin_namestore_flat.c
@@ -301,7 +301,7 @@ store_and_free_entries (void *cls,
301 char *line; 301 char *line;
302 char *zone_private_key; 302 char *zone_private_key;
303 char *record_data_b64; 303 char *record_data_b64;
304 size_t data_size; 304 ssize_t data_size;
305 305
306 (void) key; 306 (void) key;
307 GNUNET_STRINGS_base64_encode ((char*)entry->private_key, 307 GNUNET_STRINGS_base64_encode ((char*)entry->private_key,
@@ -309,6 +309,18 @@ store_and_free_entries (void *cls,
309 &zone_private_key); 309 &zone_private_key);
310 data_size = GNUNET_GNSRECORD_records_get_size (entry->record_count, 310 data_size = GNUNET_GNSRECORD_records_get_size (entry->record_count,
311 entry->record_data); 311 entry->record_data);
312 if (data_size < 0)
313 {
314 GNUNET_break (0);
315 GNUNET_free (zone_private_key);
316 return GNUNET_SYSERR;
317 }
318 if (data_size >= UINT16_MAX)
319 {
320 GNUNET_break (0);
321 GNUNET_free (zone_private_key);
322 return GNUNET_SYSERR;
323 }
312 { 324 {
313 char data[data_size]; 325 char data[data_size];
314 ssize_t ret; 326 ssize_t ret;
@@ -318,7 +330,7 @@ store_and_free_entries (void *cls,
318 data_size, 330 data_size,
319 data); 331 data);
320 if ( (ret < 0) || 332 if ( (ret < 0) ||
321 (data_size != (size_t) ret) ) 333 (data_size != ret) )
322 { 334 {
323 GNUNET_break (0); 335 GNUNET_break (0);
324 GNUNET_free (zone_private_key); 336 GNUNET_free (zone_private_key);
diff --git a/src/namestore/plugin_namestore_postgres.c b/src/namestore/plugin_namestore_postgres.c
index d7907b1a6..09fdd760f 100644
--- a/src/namestore/plugin_namestore_postgres.c
+++ b/src/namestore/plugin_namestore_postgres.c
@@ -220,7 +220,7 @@ namestore_postgres_store_records (void *cls,
220 struct GNUNET_CRYPTO_EcdsaPublicKey pkey; 220 struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
221 uint64_t rvalue; 221 uint64_t rvalue;
222 uint32_t rd_count32 = (uint32_t) rd_count; 222 uint32_t rd_count32 = (uint32_t) rd_count;
223 size_t data_size; 223 ssize_t data_size;
224 224
225 memset (&pkey, 225 memset (&pkey,
226 0, 226 0,
@@ -238,7 +238,12 @@ namestore_postgres_store_records (void *cls,
238 UINT64_MAX); 238 UINT64_MAX);
239 data_size = GNUNET_GNSRECORD_records_get_size (rd_count, 239 data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
240 rd); 240 rd);
241 if (data_size > 64 * 65536) 241 if (data_size < 0)
242 {
243 GNUNET_break (0);
244 return GNUNET_SYSERR;
245 }
246 if (data_size >= UINT16_MAX)
242 { 247 {
243 GNUNET_break (0); 248 GNUNET_break (0);
244 return GNUNET_SYSERR; 249 return GNUNET_SYSERR;
@@ -287,7 +292,7 @@ namestore_postgres_store_records (void *cls,
287 data_size, 292 data_size,
288 data); 293 data);
289 if ( (ret < 0) || 294 if ( (ret < 0) ||
290 (data_size != (size_t) ret) ) 295 (data_size != ret) )
291 { 296 {
292 GNUNET_break (0); 297 GNUNET_break (0);
293 return GNUNET_SYSERR; 298 return GNUNET_SYSERR;
diff --git a/src/namestore/plugin_namestore_sqlite.c b/src/namestore/plugin_namestore_sqlite.c
index 34e548613..81391ce8a 100644
--- a/src/namestore/plugin_namestore_sqlite.c
+++ b/src/namestore/plugin_namestore_sqlite.c
@@ -313,7 +313,7 @@ namestore_sqlite_store_records (void *cls,
313 int n; 313 int n;
314 struct GNUNET_CRYPTO_EcdsaPublicKey pkey; 314 struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
315 uint64_t rvalue; 315 uint64_t rvalue;
316 size_t data_size; 316 ssize_t data_size;
317 317
318 memset (&pkey, 318 memset (&pkey,
319 0, 319 0,
@@ -332,6 +332,11 @@ namestore_sqlite_store_records (void *cls,
332 UINT64_MAX); 332 UINT64_MAX);
333 data_size = GNUNET_GNSRECORD_records_get_size (rd_count, 333 data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
334 rd); 334 rd);
335 if (data_size < 0)
336 {
337 GNUNET_break (0);
338 return GNUNET_SYSERR;
339 }
335 if (data_size > 64 * 65536) 340 if (data_size > 64 * 65536)
336 { 341 {
337 GNUNET_break (0); 342 GNUNET_break (0);
@@ -352,7 +357,7 @@ namestore_sqlite_store_records (void *cls,
352 data_size, 357 data_size,
353 data); 358 data);
354 if ( (ret < 0) || 359 if ( (ret < 0) ||
355 (data_size != (size_t) ret) ) 360 (data_size != ret) )
356 { 361 {
357 GNUNET_break (0); 362 GNUNET_break (0);
358 return GNUNET_SYSERR; 363 return GNUNET_SYSERR;