aboutsummaryrefslogtreecommitdiff
path: root/src/namestore/gnunet-service-namestore.c
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/namestore/gnunet-service-namestore.c
parent0a8c135eedab5213b31c21b3d4b800e5f0f6041f (diff)
downloadgnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.tar.gz
gnunet-d080cb1ed80a0e528b2b755ee48ca18cb670175e.zip
check return values from GNSRECORD_record_serialize/size always
Diffstat (limited to 'src/namestore/gnunet-service-namestore.c')
-rw-r--r--src/namestore/gnunet-service-namestore.c230
1 files changed, 155 insertions, 75 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 */
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);