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/gnunet-service-gns.c | |
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/gnunet-service-gns.c')
-rw-r--r-- | src/gns/gnunet-service-gns.c | 27 |
1 files changed, 20 insertions, 7 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, |