diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-06-25 15:46:16 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-06-25 15:46:16 +0000 |
commit | 91ef3e6d0d4935dfa6dae561587b2e1d65fe07fd (patch) | |
tree | 3b3e15dbc8523d3c9bfaec194f0b7b9b05f730aa | |
parent | 789c62896357697e70bc477bf2ebfc33786d580c (diff) | |
download | gnunet-91ef3e6d0d4935dfa6dae561587b2e1d65fe07fd.tar.gz gnunet-91ef3e6d0d4935dfa6dae561587b2e1d65fe07fd.zip |
-minor refactoring, add missing check
-rw-r--r-- | src/namestore/namestore_api.c | 105 |
1 files changed, 46 insertions, 59 deletions
diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c index c0aa79e3f..f5b9d941b 100644 --- a/src/namestore/namestore_api.c +++ b/src/namestore/namestore_api.c | |||
@@ -294,6 +294,35 @@ free_ze (struct GNUNET_NAMESTORE_ZoneIterator *ze) | |||
294 | 294 | ||
295 | 295 | ||
296 | /** | 296 | /** |
297 | * Check that @a rd_buf of lenght @a rd_len contains | ||
298 | * @a rd_count records. | ||
299 | * | ||
300 | * @param rd_len length of @a rd_buf | ||
301 | * @param rd_buf buffer with serialized records | ||
302 | * @param rd_count number of records expected | ||
303 | * @return #GNUNET_OK if @a rd_buf is well-formed | ||
304 | */ | ||
305 | static int | ||
306 | check_rd (size_t rd_len, | ||
307 | const void *rd_buf, | ||
308 | unsigned int rd_count) | ||
309 | { | ||
310 | struct GNUNET_GNSRECORD_Data rd[rd_count]; | ||
311 | |||
312 | if (GNUNET_OK != | ||
313 | GNUNET_GNSRECORD_records_deserialize (rd_len, | ||
314 | rd_buf, | ||
315 | rd_count, | ||
316 | rd)) | ||
317 | { | ||
318 | GNUNET_break (0); | ||
319 | return GNUNET_SYSERR; | ||
320 | } | ||
321 | return GNUNET_OK; | ||
322 | } | ||
323 | |||
324 | |||
325 | /** | ||
297 | * Handle an incoming message of type | 326 | * Handle an incoming message of type |
298 | * #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE | 327 | * #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE |
299 | * | 328 | * |
@@ -341,15 +370,12 @@ check_lookup_result (void *cls, | |||
341 | const struct LabelLookupResponseMessage *msg) | 370 | const struct LabelLookupResponseMessage *msg) |
342 | { | 371 | { |
343 | const char *name; | 372 | const char *name; |
344 | const char *rd_tmp; | ||
345 | size_t exp_msg_len; | 373 | size_t exp_msg_len; |
346 | size_t msg_len; | 374 | size_t msg_len; |
347 | size_t name_len; | 375 | size_t name_len; |
348 | size_t rd_len; | 376 | size_t rd_len; |
349 | unsigned int rd_count; | ||
350 | 377 | ||
351 | rd_len = ntohs (msg->rd_len); | 378 | rd_len = ntohs (msg->rd_len); |
352 | rd_count = ntohs (msg->rd_count); | ||
353 | msg_len = ntohs (msg->gns_header.header.size); | 379 | msg_len = ntohs (msg->gns_header.header.size); |
354 | name_len = ntohs (msg->name_len); | 380 | name_len = ntohs (msg->name_len); |
355 | exp_msg_len = sizeof (*msg) + name_len + rd_len; | 381 | exp_msg_len = sizeof (*msg) + name_len + rd_len; |
@@ -367,28 +393,16 @@ check_lookup_result (void *cls, | |||
367 | } | 393 | } |
368 | if (GNUNET_NO == ntohs (msg->found)) | 394 | if (GNUNET_NO == ntohs (msg->found)) |
369 | { | 395 | { |
370 | if (0 != rd_count) | 396 | if (0 != ntohs (msg->rd_count)) |
371 | { | 397 | { |
372 | GNUNET_break (0); | 398 | GNUNET_break (0); |
373 | return GNUNET_SYSERR; | 399 | return GNUNET_SYSERR; |
374 | } | 400 | } |
375 | return GNUNET_OK; | 401 | return GNUNET_OK; |
376 | } | 402 | } |
377 | rd_tmp = &name[name_len]; | 403 | return check_rd (rd_len, |
378 | { | 404 | &name[name_len], |
379 | struct GNUNET_GNSRECORD_Data rd[rd_count]; | 405 | ntohs (msg->rd_count)); |
380 | |||
381 | if (GNUNET_OK != | ||
382 | GNUNET_GNSRECORD_records_deserialize (rd_len, | ||
383 | rd_tmp, | ||
384 | rd_count, | ||
385 | rd)) | ||
386 | { | ||
387 | GNUNET_break (0); | ||
388 | return GNUNET_SYSERR; | ||
389 | } | ||
390 | } | ||
391 | return GNUNET_OK; | ||
392 | } | 406 | } |
393 | 407 | ||
394 | 408 | ||
@@ -469,15 +483,11 @@ check_record_result (void *cls, | |||
469 | const struct RecordResultMessage *msg) | 483 | const struct RecordResultMessage *msg) |
470 | { | 484 | { |
471 | const char *name; | 485 | const char *name; |
472 | const char *rd_tmp; | ||
473 | size_t exp_msg_len; | ||
474 | size_t msg_len; | 486 | size_t msg_len; |
475 | size_t name_len; | 487 | size_t name_len; |
476 | size_t rd_len; | 488 | size_t rd_len; |
477 | unsigned int rd_count; | ||
478 | 489 | ||
479 | rd_len = ntohs (msg->rd_len); | 490 | rd_len = ntohs (msg->rd_len); |
480 | rd_count = ntohs (msg->rd_count); | ||
481 | msg_len = ntohs (msg->gns_header.header.size); | 491 | msg_len = ntohs (msg->gns_header.header.size); |
482 | name_len = ntohs (msg->name_len); | 492 | name_len = ntohs (msg->name_len); |
483 | if (0 != ntohs (msg->reserved)) | 493 | if (0 != ntohs (msg->reserved)) |
@@ -485,8 +495,7 @@ check_record_result (void *cls, | |||
485 | GNUNET_break (0); | 495 | GNUNET_break (0); |
486 | return GNUNET_SYSERR; | 496 | return GNUNET_SYSERR; |
487 | } | 497 | } |
488 | exp_msg_len = sizeof (struct RecordResultMessage) + name_len + rd_len; | 498 | if (msg_len != sizeof (struct RecordResultMessage) + name_len + rd_len) |
489 | if (msg_len != exp_msg_len) | ||
490 | { | 499 | { |
491 | GNUNET_break (0); | 500 | GNUNET_break (0); |
492 | return GNUNET_SYSERR; | 501 | return GNUNET_SYSERR; |
@@ -498,21 +507,9 @@ check_record_result (void *cls, | |||
498 | GNUNET_break (0); | 507 | GNUNET_break (0); |
499 | return GNUNET_SYSERR; | 508 | return GNUNET_SYSERR; |
500 | } | 509 | } |
501 | rd_tmp = &name[name_len]; | 510 | return check_rd (rd_len, |
502 | { | 511 | &name[name_len], |
503 | struct GNUNET_GNSRECORD_Data rd[rd_count]; | 512 | ntohs (msg->rd_count)); |
504 | |||
505 | if (GNUNET_OK != | ||
506 | GNUNET_GNSRECORD_records_deserialize(rd_len, | ||
507 | rd_tmp, | ||
508 | rd_count, | ||
509 | rd)) | ||
510 | { | ||
511 | GNUNET_break (0); | ||
512 | return GNUNET_SYSERR; | ||
513 | } | ||
514 | } | ||
515 | return GNUNET_OK; | ||
516 | } | 513 | } |
517 | 514 | ||
518 | 515 | ||
@@ -625,16 +622,18 @@ check_zone_to_name_response (void *cls, | |||
625 | { | 622 | { |
626 | size_t name_len; | 623 | size_t name_len; |
627 | size_t rd_ser_len; | 624 | size_t rd_ser_len; |
628 | unsigned int rd_count; | ||
629 | const char *name_tmp; | 625 | const char *name_tmp; |
630 | const char *rd_tmp; | ||
631 | 626 | ||
632 | if (GNUNET_OK != ntohs (msg->res)) | 627 | if (GNUNET_OK != ntohs (msg->res)) |
633 | return GNUNET_OK; | 628 | return GNUNET_OK; |
634 | |||
635 | name_len = ntohs (msg->name_len); | 629 | name_len = ntohs (msg->name_len); |
636 | rd_count = ntohs (msg->rd_count); | ||
637 | rd_ser_len = ntohs (msg->rd_len); | 630 | rd_ser_len = ntohs (msg->rd_len); |
631 | if (ntohs (msg->gns_header.header.size) != | ||
632 | sizeof (struct ZoneToNameResponseMessage) + name_len + rd_ser_len) | ||
633 | { | ||
634 | GNUNET_break (0); | ||
635 | return GNUNET_SYSERR; | ||
636 | } | ||
638 | name_tmp = (const char *) &msg[1]; | 637 | name_tmp = (const char *) &msg[1]; |
639 | if ( (name_len > 0) && | 638 | if ( (name_len > 0) && |
640 | ('\0' != name_tmp[name_len -1]) ) | 639 | ('\0' != name_tmp[name_len -1]) ) |
@@ -642,21 +641,9 @@ check_zone_to_name_response (void *cls, | |||
642 | GNUNET_break (0); | 641 | GNUNET_break (0); |
643 | return GNUNET_SYSERR; | 642 | return GNUNET_SYSERR; |
644 | } | 643 | } |
645 | rd_tmp = &name_tmp[name_len]; | 644 | return check_rd (rd_ser_len, |
646 | { | 645 | &name_tmp[name_len], |
647 | struct GNUNET_GNSRECORD_Data rd[rd_count]; | 646 | ntohs (msg->rd_count)); |
648 | |||
649 | if (GNUNET_OK != | ||
650 | GNUNET_GNSRECORD_records_deserialize (rd_ser_len, | ||
651 | rd_tmp, | ||
652 | rd_count, | ||
653 | rd)) | ||
654 | { | ||
655 | GNUNET_break (0); | ||
656 | return GNUNET_SYSERR; | ||
657 | } | ||
658 | } | ||
659 | return GNUNET_OK; | ||
660 | } | 647 | } |
661 | 648 | ||
662 | 649 | ||