Codebase list getdns / a8adf66
Fix memory leak setting transports Willem Toorop 8 years ago
1 changed file(s) with 86 addition(s) and 72 deletion(s). Raw diff Collapse all Expand all
11891189 } /* getdns_context_set_namespaces */
11901190
11911191 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)
11941194 {
11951195 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;
12011200
12021201 for(i=0; i<transport_count; i++)
12031202 {
12071206 && transports[i] != GETDNS_TRANSPORT_STARTTLS)
12081207 return GETDNS_RETURN_INVALID_PARAMETER;
12091208 }
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));
12181222 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;
12221226 }
12231227
12241228 static getdns_return_t
12771281 *
12781282 */
12791283 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;
13321346 }
13331347
13341348 /*
1335 * getdns_context_set_dns_transport
1349 * getdns_context_set_dns_transport_list
13361350 *
13371351 */
13381352 getdns_return_t
13531367 }
13541368 dispatch_updated(context, GETDNS_CONTEXT_CODE_DNS_TRANSPORT);
13551369 return GETDNS_RETURN_GOOD;
1356 } /* getdns_context_set_dns_transport */
1370 } /* getdns_context_set_dns_transport_list */
13571371
13581372 static void
13591373 set_ub_limit_outstanding_queries(struct getdns_context* context, uint16_t value) {