diff options
author | Christian Grothoff <christian@grothoff.org> | 2018-05-20 23:40:20 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2018-05-20 23:40:20 +0200 |
commit | d080cb1ed80a0e528b2b755ee48ca18cb670175e (patch) | |
tree | d8c0edab6035e4d38138b303566e972fbf8b8c5f /src/gns | |
parent | 0a8c135eedab5213b31c21b3d4b800e5f0f6041f (diff) | |
download | gnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.tar.gz gnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.zip |
check return values from GNSRECORD_record_serialize/size always
Diffstat (limited to 'src/gns')
-rw-r--r-- | src/gns/gnunet-service-gns.c | 27 | ||||
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 21 |
2 files changed, 34 insertions, 14 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 | */ |
336 | static void | 336 | static void |
337 | send_lookup_response (void* cls, | 337 | send_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), |