Fix memory leak setting transports
Willem Toorop
8 years ago
1189 | 1189 | } /* getdns_context_set_namespaces */ |
1190 | 1190 | |
1191 | 1191 | static getdns_return_t |
1192 | getdns_set_base_dns_transports(struct getdns_context *context, | |
1193 | size_t transport_count, getdns_transport_list_t *transports) | |
1192 | getdns_set_base_dns_transports( | |
1193 | getdns_context *context, size_t transport_count, getdns_transport_list_t *transports) | |
1194 | 1194 | { |
1195 | 1195 | size_t i; |
1196 | ||
1197 | RETURN_IF_NULL(context, GETDNS_RETURN_INVALID_PARAMETER); | |
1198 | if (transport_count == 0 || transports == NULL) { | |
1199 | return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; | |
1200 | } | |
1196 | getdns_transport_list_t *new_transports; | |
1197 | ||
1198 | if (!context || transport_count == 0 || transports == NULL) | |
1199 | return GETDNS_RETURN_INVALID_PARAMETER; | |
1201 | 1200 | |
1202 | 1201 | for(i=0; i<transport_count; i++) |
1203 | 1202 | { |
1207 | 1206 | && transports[i] != GETDNS_TRANSPORT_STARTTLS) |
1208 | 1207 | return GETDNS_RETURN_INVALID_PARAMETER; |
1209 | 1208 | } |
1210 | ||
1211 | GETDNS_FREE(context->my_mf, context->dns_transports); | |
1212 | ||
1213 | /** duplicate **/ | |
1214 | context->dns_transports = GETDNS_XMALLOC(context->my_mf, | |
1215 | getdns_transport_list_t, transport_count); | |
1216 | memcpy(context->dns_transports, transports, | |
1217 | transport_count * sizeof(getdns_transport_list_t)); | |
1209 | ||
1210 | if (!(new_transports = GETDNS_XMALLOC(context->my_mf, | |
1211 | getdns_transport_list_t, transport_count))) | |
1212 | ||
1213 | return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; | |
1214 | ||
1215 | if (context->dns_transports) | |
1216 | GETDNS_FREE(context->my_mf, context->dns_transports); | |
1217 | ||
1218 | /** duplicate **/ | |
1219 | context->dns_transports = new_transports; | |
1220 | memcpy(context->dns_transports, transports, | |
1221 | transport_count * sizeof(getdns_transport_list_t)); | |
1218 | 1222 | context->dns_transport_count = transport_count; |
1219 | dispatch_updated(context, GETDNS_CONTEXT_CODE_NAMESPACES); | |
1220 | ||
1221 | return GETDNS_RETURN_GOOD; | |
1223 | dispatch_updated(context, GETDNS_CONTEXT_CODE_NAMESPACES); | |
1224 | ||
1225 | return GETDNS_RETURN_GOOD; | |
1222 | 1226 | } |
1223 | 1227 | |
1224 | 1228 | static getdns_return_t |
1277 | 1281 | * |
1278 | 1282 | */ |
1279 | 1283 | getdns_return_t |
1280 | getdns_context_set_dns_transport(struct getdns_context *context, | |
1281 | getdns_transport_t value) | |
1282 | { | |
1283 | RETURN_IF_NULL(context, GETDNS_RETURN_INVALID_PARAMETER); | |
1284 | ||
1285 | size_t count = 2; | |
1286 | if (value == GETDNS_TRANSPORT_UDP_ONLY || | |
1287 | value == GETDNS_TRANSPORT_TCP_ONLY || | |
1288 | value == GETDNS_TRANSPORT_TCP_ONLY_KEEP_CONNECTIONS_OPEN || | |
1289 | value == GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN) | |
1290 | count = 1; | |
1291 | context->dns_transport_count = count; | |
1292 | context->dns_transports = GETDNS_XMALLOC(context->my_mf, | |
1293 | getdns_transport_list_t, count); | |
1294 | ||
1295 | switch (value) { | |
1296 | case GETDNS_TRANSPORT_UDP_FIRST_AND_FALL_BACK_TO_TCP: | |
1297 | context->dns_transports[0] = GETDNS_TRANSPORT_UDP; | |
1298 | context->dns_transports[1] = GETDNS_TRANSPORT_TCP; | |
1299 | break; | |
1300 | case GETDNS_TRANSPORT_UDP_ONLY: | |
1301 | context->dns_transports[0] = GETDNS_TRANSPORT_UDP; | |
1302 | break; | |
1303 | case GETDNS_TRANSPORT_TCP_ONLY: | |
1304 | case GETDNS_TRANSPORT_TCP_ONLY_KEEP_CONNECTIONS_OPEN: | |
1305 | context->dns_transports[0] = GETDNS_TRANSPORT_TCP; | |
1306 | break; | |
1307 | case GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN: | |
1308 | context->dns_transports[0] = GETDNS_TRANSPORT_TLS; | |
1309 | break; | |
1310 | case GETDNS_TRANSPORT_TLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN: | |
1311 | context->dns_transports[0] = GETDNS_TRANSPORT_TLS; | |
1312 | context->dns_transports[1] = GETDNS_TRANSPORT_TCP; | |
1313 | break; | |
1314 | case GETDNS_TRANSPORT_STARTTLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN: | |
1315 | context->dns_transports[0] = GETDNS_TRANSPORT_STARTTLS; | |
1316 | context->dns_transports[1] = GETDNS_TRANSPORT_TCP; | |
1317 | break; | |
1318 | default: | |
1319 | return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; | |
1320 | } | |
1321 | /* Note that the call below does not have any effect in unbound after the | |
1322 | * ctx is finalised so for recursive mode or stub + dnssec only the first | |
1323 | * transport specified on the first query is used. | |
1324 | * However the method returns success as otherwise the transport could not | |
1325 | * be reset for stub mode. | |
1326 | * Also, not all transport options supported in libunbound yet */ | |
1327 | if (set_ub_dns_transport(context) != GETDNS_RETURN_GOOD) { | |
1328 | return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; | |
1329 | } | |
1330 | dispatch_updated(context, GETDNS_CONTEXT_CODE_DNS_TRANSPORT); | |
1331 | return GETDNS_RETURN_GOOD; | |
1284 | getdns_context_set_dns_transport( | |
1285 | getdns_context *context, getdns_transport_t value) | |
1286 | { | |
1287 | size_t count = 2; | |
1288 | getdns_transport_list_t *new_transports; | |
1289 | ||
1290 | if (value == GETDNS_TRANSPORT_UDP_ONLY || | |
1291 | value == GETDNS_TRANSPORT_TCP_ONLY || | |
1292 | value == GETDNS_TRANSPORT_TCP_ONLY_KEEP_CONNECTIONS_OPEN || | |
1293 | value == GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN) | |
1294 | count = 1; | |
1295 | ||
1296 | if (!context) | |
1297 | return GETDNS_RETURN_INVALID_PARAMETER; | |
1298 | ||
1299 | if (!(new_transports = GETDNS_XMALLOC( | |
1300 | context->my_mf, getdns_transport_list_t, count))) | |
1301 | return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; | |
1302 | ||
1303 | if (context->dns_transports) | |
1304 | GETDNS_FREE(context->my_mf, context->dns_transports); | |
1305 | ||
1306 | context->dns_transport_count = count; | |
1307 | context->dns_transports = new_transports; | |
1308 | ||
1309 | switch (value) { | |
1310 | case GETDNS_TRANSPORT_UDP_FIRST_AND_FALL_BACK_TO_TCP: | |
1311 | context->dns_transports[0] = GETDNS_TRANSPORT_UDP; | |
1312 | context->dns_transports[1] = GETDNS_TRANSPORT_TCP; | |
1313 | break; | |
1314 | case GETDNS_TRANSPORT_UDP_ONLY: | |
1315 | context->dns_transports[0] = GETDNS_TRANSPORT_UDP; | |
1316 | break; | |
1317 | case GETDNS_TRANSPORT_TCP_ONLY: | |
1318 | case GETDNS_TRANSPORT_TCP_ONLY_KEEP_CONNECTIONS_OPEN: | |
1319 | context->dns_transports[0] = GETDNS_TRANSPORT_TCP; | |
1320 | break; | |
1321 | case GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN: | |
1322 | context->dns_transports[0] = GETDNS_TRANSPORT_TLS; | |
1323 | break; | |
1324 | case GETDNS_TRANSPORT_TLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN: | |
1325 | context->dns_transports[0] = GETDNS_TRANSPORT_TLS; | |
1326 | context->dns_transports[1] = GETDNS_TRANSPORT_TCP; | |
1327 | break; | |
1328 | case GETDNS_TRANSPORT_STARTTLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN: | |
1329 | context->dns_transports[0] = GETDNS_TRANSPORT_STARTTLS; | |
1330 | context->dns_transports[1] = GETDNS_TRANSPORT_TCP; | |
1331 | break; | |
1332 | default: | |
1333 | return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; | |
1334 | } | |
1335 | /* Note that the call below does not have any effect in unbound after the | |
1336 | * ctx is finalised so for recursive mode or stub + dnssec only the first | |
1337 | * transport specified on the first query is used. | |
1338 | * However the method returns success as otherwise the transport could not | |
1339 | * be reset for stub mode. | |
1340 | * Also, not all transport options supported in libunbound yet */ | |
1341 | if (set_ub_dns_transport(context) != GETDNS_RETURN_GOOD) { | |
1342 | return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; | |
1343 | } | |
1344 | dispatch_updated(context, GETDNS_CONTEXT_CODE_DNS_TRANSPORT); | |
1345 | return GETDNS_RETURN_GOOD; | |
1332 | 1346 | } |
1333 | 1347 | |
1334 | 1348 | /* |
1335 | * getdns_context_set_dns_transport | |
1349 | * getdns_context_set_dns_transport_list | |
1336 | 1350 | * |
1337 | 1351 | */ |
1338 | 1352 | getdns_return_t |
1353 | 1367 | } |
1354 | 1368 | dispatch_updated(context, GETDNS_CONTEXT_CODE_DNS_TRANSPORT); |
1355 | 1369 | return GETDNS_RETURN_GOOD; |
1356 | } /* getdns_context_set_dns_transport */ | |
1370 | } /* getdns_context_set_dns_transport_list */ | |
1357 | 1371 | |
1358 | 1372 | static void |
1359 | 1373 | set_ub_limit_outstanding_queries(struct getdns_context* context, uint16_t value) { |