@@ -1383,6 +1383,29 @@ static int tls_setup_from_iter(struct iov_iter *from,
13831383 return rc ;
13841384}
13851385
1386+ static struct sk_buff *
1387+ tls_alloc_clrtxt_skb (struct sock * sk , struct sk_buff * skb ,
1388+ unsigned int full_len )
1389+ {
1390+ struct strp_msg * clr_rxm ;
1391+ struct sk_buff * clr_skb ;
1392+ int err ;
1393+
1394+ clr_skb = alloc_skb_with_frags (0 , full_len , TLS_PAGE_ORDER ,
1395+ & err , sk -> sk_allocation );
1396+ if (!clr_skb )
1397+ return NULL ;
1398+
1399+ skb_copy_header (clr_skb , skb );
1400+ clr_skb -> len = full_len ;
1401+ clr_skb -> data_len = full_len ;
1402+
1403+ clr_rxm = strp_msg (clr_skb );
1404+ clr_rxm -> offset = 0 ;
1405+
1406+ return clr_skb ;
1407+ }
1408+
13861409/* Decrypt handlers
13871410 *
13881411 * tls_decrypt_sg() and tls_decrypt_device() are decrypt handlers.
@@ -1410,34 +1433,40 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
14101433 struct tls_prot_info * prot = & tls_ctx -> prot_info ;
14111434 int n_sgin , n_sgout , aead_size , err , pages = 0 ;
14121435 struct sk_buff * skb = tls_strp_msg (ctx );
1413- struct strp_msg * rxm = strp_msg (skb );
1414- struct tls_msg * tlm = tls_msg (skb );
1436+ const struct strp_msg * rxm = strp_msg (skb );
1437+ const struct tls_msg * tlm = tls_msg (skb );
14151438 struct aead_request * aead_req ;
1416- struct sk_buff * unused ;
14171439 struct scatterlist * sgin = NULL ;
14181440 struct scatterlist * sgout = NULL ;
14191441 const int data_len = rxm -> full_len - prot -> overhead_size ;
14201442 int tail_pages = !!prot -> tail_size ;
14211443 struct tls_decrypt_ctx * dctx ;
1444+ struct sk_buff * clear_skb ;
14221445 int iv_offset = 0 ;
14231446 u8 * mem ;
14241447
1448+ n_sgin = skb_nsg (skb , rxm -> offset + prot -> prepend_size ,
1449+ rxm -> full_len - prot -> prepend_size );
1450+ if (n_sgin < 1 )
1451+ return n_sgin ?: - EBADMSG ;
1452+
14251453 if (darg -> zc && (out_iov || out_sg )) {
1454+ clear_skb = NULL ;
1455+
14261456 if (out_iov )
14271457 n_sgout = 1 + tail_pages +
14281458 iov_iter_npages_cap (out_iov , INT_MAX , data_len );
14291459 else
14301460 n_sgout = sg_nents (out_sg );
1431- n_sgin = skb_nsg (skb , rxm -> offset + prot -> prepend_size ,
1432- rxm -> full_len - prot -> prepend_size );
14331461 } else {
1434- n_sgout = 0 ;
14351462 darg -> zc = false;
1436- n_sgin = skb_cow_data (skb , 0 , & unused );
1437- }
14381463
1439- if (n_sgin < 1 )
1440- return - EBADMSG ;
1464+ clear_skb = tls_alloc_clrtxt_skb (sk , skb , rxm -> full_len );
1465+ if (!clear_skb )
1466+ return - ENOMEM ;
1467+
1468+ n_sgout = 1 + skb_shinfo (clear_skb )-> nr_frags ;
1469+ }
14411470
14421471 /* Increment to accommodate AAD */
14431472 n_sgin = n_sgin + 1 ;
@@ -1449,8 +1478,10 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
14491478 aead_size = sizeof (* aead_req ) + crypto_aead_reqsize (ctx -> aead_recv );
14501479 mem = kmalloc (aead_size + struct_size (dctx , sg , n_sgin + n_sgout ),
14511480 sk -> sk_allocation );
1452- if (!mem )
1453- return - ENOMEM ;
1481+ if (!mem ) {
1482+ err = - ENOMEM ;
1483+ goto exit_free_skb ;
1484+ }
14541485
14551486 /* Segment the allocated memory */
14561487 aead_req = (struct aead_request * )mem ;
@@ -1499,33 +1530,31 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
14991530 if (err < 0 )
15001531 goto exit_free ;
15011532
1502- if (n_sgout ) {
1503- if (out_iov ) {
1504- sg_init_table (sgout , n_sgout );
1505- sg_set_buf (& sgout [0 ], dctx -> aad , prot -> aad_size );
1533+ if (clear_skb ) {
1534+ sg_init_table (sgout , n_sgout );
1535+ sg_set_buf (& sgout [0 ], dctx -> aad , prot -> aad_size );
15061536
1507- err = tls_setup_from_iter (out_iov , data_len ,
1508- & pages , & sgout [1 ],
1509- (n_sgout - 1 - tail_pages ));
1510- if (err < 0 )
1511- goto fallback_to_reg_recv ;
1537+ err = skb_to_sgvec (clear_skb , & sgout [1 ], prot -> prepend_size ,
1538+ data_len + prot -> tail_size );
1539+ if (err < 0 )
1540+ goto exit_free ;
1541+ } else if (out_iov ) {
1542+ sg_init_table (sgout , n_sgout );
1543+ sg_set_buf (& sgout [0 ], dctx -> aad , prot -> aad_size );
15121544
1513- if ( prot -> tail_size ) {
1514- sg_unmark_end ( & sgout [ pages ] );
1515- sg_set_buf ( & sgout [ pages + 1 ], & dctx -> tail ,
1516- prot -> tail_size ) ;
1517- sg_mark_end ( & sgout [ pages + 1 ]);
1518- }
1519- } else if ( out_sg ) {
1520- memcpy ( sgout , out_sg , n_sgout * sizeof ( * sgout ));
1521- } else {
1522- goto fallback_to_reg_recv ;
1545+ err = tls_setup_from_iter ( out_iov , data_len , & pages , & sgout [ 1 ],
1546+ ( n_sgout - 1 - tail_pages ) );
1547+ if ( err < 0 )
1548+ goto exit_free_pages ;
1549+
1550+ if ( prot -> tail_size ) {
1551+ sg_unmark_end ( & sgout [ pages ]);
1552+ sg_set_buf ( & sgout [ pages + 1 ], & dctx -> tail ,
1553+ prot -> tail_size );
1554+ sg_mark_end ( & sgout [ pages + 1 ]) ;
15231555 }
1524- } else {
1525- fallback_to_reg_recv :
1526- sgout = sgin ;
1527- pages = 0 ;
1528- darg -> zc = false;
1556+ } else if (out_sg ) {
1557+ memcpy (sgout , out_sg , n_sgout * sizeof (* sgout ));
15291558 }
15301559
15311560 /* Prepare and submit AEAD request */
@@ -1534,7 +1563,8 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
15341563 if (err )
15351564 goto exit_free_pages ;
15361565
1537- darg -> skb = tls_strp_msg (ctx );
1566+ darg -> skb = clear_skb ?: tls_strp_msg (ctx );
1567+ clear_skb = NULL ;
15381568
15391569 if (unlikely (darg -> async )) {
15401570 err = tls_strp_msg_hold (sk , skb , & ctx -> async_hold );
@@ -1552,6 +1582,8 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
15521582 put_page (sg_page (& sgout [pages ]));
15531583exit_free :
15541584 kfree (mem );
1585+ exit_free_skb :
1586+ consume_skb (clear_skb );
15551587 return err ;
15561588}
15571589
0 commit comments