diff options
author | Christian Grothoff <christian@grothoff.org> | 2018-01-04 22:42:55 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2018-01-04 22:42:55 +0100 |
commit | a90bc78b266ee8945b8e289e94f2f7503b18c3e1 (patch) | |
tree | e86a7b17233e9222292800e2e3e5c0c88220c120 | |
parent | 23a95ded83313c8df50c5c34e0c12469e056545c (diff) | |
download | gnunet-a90bc78b266ee8945b8e289e94f2f7503b18c3e1.tar.gz gnunet-a90bc78b266ee8945b8e289e94f2f7503b18c3e1.zip |
avoid freeing uninit ptr on error path
-rw-r--r-- | src/dns/dnsparser.c | 28 | ||||
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 23 |
2 files changed, 37 insertions, 14 deletions
diff --git a/src/dns/dnsparser.c b/src/dns/dnsparser.c index 30d9245ff..1fe6f595f 100644 --- a/src/dns/dnsparser.c +++ b/src/dns/dnsparser.c | |||
@@ -1170,7 +1170,10 @@ GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p, | |||
1170 | trc = GNUNET_NO; | 1170 | trc = GNUNET_NO; |
1171 | for (i=0;i<p->num_queries;i++) | 1171 | for (i=0;i<p->num_queries;i++) |
1172 | { | 1172 | { |
1173 | ret = GNUNET_DNSPARSER_builder_add_query (tmp, sizeof (tmp), &off, &p->queries[i]); | 1173 | ret = GNUNET_DNSPARSER_builder_add_query (tmp, |
1174 | sizeof (tmp), | ||
1175 | &off, | ||
1176 | &p->queries[i]); | ||
1174 | if (GNUNET_SYSERR == ret) | 1177 | if (GNUNET_SYSERR == ret) |
1175 | return GNUNET_SYSERR; | 1178 | return GNUNET_SYSERR; |
1176 | if (GNUNET_NO == ret) | 1179 | if (GNUNET_NO == ret) |
@@ -1182,7 +1185,10 @@ GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p, | |||
1182 | } | 1185 | } |
1183 | for (i=0;i<p->num_answers;i++) | 1186 | for (i=0;i<p->num_answers;i++) |
1184 | { | 1187 | { |
1185 | ret = add_record (tmp, sizeof (tmp), &off, &p->answers[i]); | 1188 | ret = add_record (tmp, |
1189 | sizeof (tmp), | ||
1190 | &off, | ||
1191 | &p->answers[i]); | ||
1186 | if (GNUNET_SYSERR == ret) | 1192 | if (GNUNET_SYSERR == ret) |
1187 | return GNUNET_SYSERR; | 1193 | return GNUNET_SYSERR; |
1188 | if (GNUNET_NO == ret) | 1194 | if (GNUNET_NO == ret) |
@@ -1194,7 +1200,10 @@ GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p, | |||
1194 | } | 1200 | } |
1195 | for (i=0;i<p->num_authority_records;i++) | 1201 | for (i=0;i<p->num_authority_records;i++) |
1196 | { | 1202 | { |
1197 | ret = add_record (tmp, sizeof (tmp), &off, &p->authority_records[i]); | 1203 | ret = add_record (tmp, |
1204 | sizeof (tmp), | ||
1205 | &off, | ||
1206 | &p->authority_records[i]); | ||
1198 | if (GNUNET_SYSERR == ret) | 1207 | if (GNUNET_SYSERR == ret) |
1199 | return GNUNET_SYSERR; | 1208 | return GNUNET_SYSERR; |
1200 | if (GNUNET_NO == ret) | 1209 | if (GNUNET_NO == ret) |
@@ -1206,7 +1215,10 @@ GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p, | |||
1206 | } | 1215 | } |
1207 | for (i=0;i<p->num_additional_records;i++) | 1216 | for (i=0;i<p->num_additional_records;i++) |
1208 | { | 1217 | { |
1209 | ret = add_record (tmp, sizeof (tmp), &off, &p->additional_records[i]); | 1218 | ret = add_record (tmp, |
1219 | sizeof (tmp), | ||
1220 | &off, | ||
1221 | &p->additional_records[i]); | ||
1210 | if (GNUNET_SYSERR == ret) | 1222 | if (GNUNET_SYSERR == ret) |
1211 | return GNUNET_SYSERR; | 1223 | return GNUNET_SYSERR; |
1212 | if (GNUNET_NO == ret) | 1224 | if (GNUNET_NO == ret) |
@@ -1219,11 +1231,15 @@ GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p, | |||
1219 | 1231 | ||
1220 | if (GNUNET_YES == trc) | 1232 | if (GNUNET_YES == trc) |
1221 | dns.flags.message_truncated = 1; | 1233 | dns.flags.message_truncated = 1; |
1222 | GNUNET_memcpy (tmp, &dns, sizeof (struct GNUNET_TUN_DnsHeader)); | 1234 | GNUNET_memcpy (tmp, |
1235 | &dns, | ||
1236 | sizeof (struct GNUNET_TUN_DnsHeader)); | ||
1223 | 1237 | ||
1224 | *buf = GNUNET_malloc (off); | 1238 | *buf = GNUNET_malloc (off); |
1225 | *buf_length = off; | 1239 | *buf_length = off; |
1226 | GNUNET_memcpy (*buf, tmp, off); | 1240 | GNUNET_memcpy (*buf, |
1241 | tmp, | ||
1242 | off); | ||
1227 | if (GNUNET_YES == trc) | 1243 | if (GNUNET_YES == trc) |
1228 | return GNUNET_NO; | 1244 | return GNUNET_NO; |
1229 | return GNUNET_OK; | 1245 | return GNUNET_OK; |
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index 54d7ff94b..e14a05d45 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c | |||
@@ -1019,6 +1019,7 @@ recursive_dns_resolution (struct GNS_ResolverHandle *rh) | |||
1019 | struct GNUNET_DNSPARSER_Packet *p; | 1019 | struct GNUNET_DNSPARSER_Packet *p; |
1020 | char *dns_request; | 1020 | char *dns_request; |
1021 | size_t dns_request_length; | 1021 | size_t dns_request_length; |
1022 | int ret; | ||
1022 | 1023 | ||
1023 | ac = rh->ac_tail; | 1024 | ac = rh->ac_tail; |
1024 | GNUNET_assert (NULL != ac); | 1025 | GNUNET_assert (NULL != ac); |
@@ -1051,11 +1052,16 @@ recursive_dns_resolution (struct GNS_ResolverHandle *rh) | |||
1051 | UINT16_MAX); | 1052 | UINT16_MAX); |
1052 | p->flags.opcode = GNUNET_TUN_DNS_OPCODE_QUERY; | 1053 | p->flags.opcode = GNUNET_TUN_DNS_OPCODE_QUERY; |
1053 | p->flags.recursion_desired = 1; | 1054 | p->flags.recursion_desired = 1; |
1054 | if (GNUNET_OK != | 1055 | ret = GNUNET_DNSPARSER_pack (p, |
1055 | GNUNET_DNSPARSER_pack (p, 1024, &dns_request, &dns_request_length)) | 1056 | 1024, |
1057 | &dns_request, | ||
1058 | &dns_request_length); | ||
1059 | if (GNUNET_OK != ret) | ||
1056 | { | 1060 | { |
1057 | GNUNET_break (0); | 1061 | GNUNET_break (0); |
1058 | rh->proc (rh->proc_cls, 0, NULL); | 1062 | rh->proc (rh->proc_cls, |
1063 | 0, | ||
1064 | NULL); | ||
1059 | GNS_resolver_lookup_cancel (rh); | 1065 | GNS_resolver_lookup_cancel (rh); |
1060 | } | 1066 | } |
1061 | else | 1067 | else |
@@ -1071,7 +1077,8 @@ recursive_dns_resolution (struct GNS_ResolverHandle *rh) | |||
1071 | &fail_resolution, | 1077 | &fail_resolution, |
1072 | rh); | 1078 | rh); |
1073 | } | 1079 | } |
1074 | GNUNET_free (dns_request); | 1080 | if (GNUNET_SYSERR != ret) |
1081 | GNUNET_free (dns_request); | ||
1075 | GNUNET_DNSPARSER_free_packet (p); | 1082 | GNUNET_DNSPARSER_free_packet (p); |
1076 | } | 1083 | } |
1077 | 1084 | ||
@@ -1462,10 +1469,10 @@ handle_gns_resolution_result (void *cls, | |||
1462 | vpn_ctx->rd_data = GNUNET_malloc (vpn_ctx->rd_data_size); | 1469 | vpn_ctx->rd_data = GNUNET_malloc (vpn_ctx->rd_data_size); |
1463 | vpn_ctx->rd_count = rd_count; | 1470 | vpn_ctx->rd_count = rd_count; |
1464 | GNUNET_assert (vpn_ctx->rd_data_size == | 1471 | GNUNET_assert (vpn_ctx->rd_data_size == |
1465 | GNUNET_GNSRECORD_records_serialize (rd_count, | 1472 | (size_t) GNUNET_GNSRECORD_records_serialize (rd_count, |
1466 | rd, | 1473 | rd, |
1467 | vpn_ctx->rd_data_size, | 1474 | vpn_ctx->rd_data_size, |
1468 | vpn_ctx->rd_data)); | 1475 | vpn_ctx->rd_data)); |
1469 | vpn_ctx->vpn_request = GNUNET_VPN_redirect_to_peer (vpn_handle, | 1476 | vpn_ctx->vpn_request = GNUNET_VPN_redirect_to_peer (vpn_handle, |
1470 | af, | 1477 | af, |
1471 | ntohs (vpn->proto), | 1478 | ntohs (vpn->proto), |