diff options
Diffstat (limited to 'net/dccp/output.c')
-rw-r--r-- | net/dccp/output.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/net/dccp/output.c b/net/dccp/output.c index 92f3f6f2ef51..fea30cdc0bee 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
@@ -339,10 +339,12 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, | |||
339 | DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE; | 339 | DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE; |
340 | DCCP_SKB_CB(skb)->dccpd_seq = dreq->dreq_iss; | 340 | DCCP_SKB_CB(skb)->dccpd_seq = dreq->dreq_iss; |
341 | 341 | ||
342 | if (dccp_insert_options_rsk(dreq, skb)) { | 342 | /* Resolve feature dependencies resulting from choice of CCID */ |
343 | kfree_skb(skb); | 343 | if (dccp_feat_server_ccid_dependencies(dreq)) |
344 | return NULL; | 344 | goto response_failed; |
345 | } | 345 | |
346 | if (dccp_insert_options_rsk(dreq, skb)) | ||
347 | goto response_failed; | ||
346 | 348 | ||
347 | /* Build and checksum header */ | 349 | /* Build and checksum header */ |
348 | dh = dccp_zeroed_hdr(skb, dccp_header_size); | 350 | dh = dccp_zeroed_hdr(skb, dccp_header_size); |
@@ -363,6 +365,9 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, | |||
363 | inet_rsk(req)->acked = 1; | 365 | inet_rsk(req)->acked = 1; |
364 | DCCP_INC_STATS(DCCP_MIB_OUTSEGS); | 366 | DCCP_INC_STATS(DCCP_MIB_OUTSEGS); |
365 | return skb; | 367 | return skb; |
368 | response_failed: | ||
369 | kfree_skb(skb); | ||
370 | return NULL; | ||
366 | } | 371 | } |
367 | 372 | ||
368 | EXPORT_SYMBOL_GPL(dccp_make_response); | 373 | EXPORT_SYMBOL_GPL(dccp_make_response); |