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/namestore | |
parent | 0a8c135eedab5213b31c21b3d4b800e5f0f6041f (diff) | |
download | gnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.tar.gz gnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.zip |
check return values from GNSRECORD_record_serialize/size always
Diffstat (limited to 'src/namestore')
-rw-r--r-- | src/namestore/gnunet-service-namestore.c | 230 | ||||
-rw-r--r-- | src/namestore/namestore_api.c | 20 | ||||
-rw-r--r-- | src/namestore/namestore_api_monitor.c | 7 | ||||
-rw-r--r-- | src/namestore/plugin_namestore_flat.c | 16 | ||||
-rw-r--r-- | src/namestore/plugin_namestore_postgres.c | 11 | ||||
-rw-r--r-- | src/namestore/plugin_namestore_sqlite.c | 9 |
6 files changed, 206 insertions, 87 deletions
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 | */ |
1084 | static void | 1123 | static 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; |