From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yx1-f50.google.com (mail-yx1-f50.google.com [74.125.224.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 923003803F7 for ; Thu, 21 May 2026 02:59:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.50 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779332372; cv=none; b=C0WEem4xc4YQX3ohcNE0b+FujzrMbqW+AO8ayannn60j1YCY5vdGnN20S9564aSm3K5VPGx79XPy8wJyM4r3ZJhkuL4EtD1Qv17gqiYtWXp9yWYjO7HIe5ZIK+VnXfBoSqijEEgDfjezztea3QcxjncDzbiOXnlEPlIFjgWjl4Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779332372; c=relaxed/simple; bh=oHsfccn7DDbOn6VBM/zSWqYwTq+d7qUjU4CoIduHDQw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZBPpO+pq+Dn50FF57BOMfivDg/0p+sNldb/fWLz3XkC3NxQ+TS+j1g1gshx0ZsOFqocLqWRze+mTZzNZ50lPqm/sGfl+qsvVs+d9RPt6v/5y9nQeaw1zZIdm0tBioLamjba+Rdx6hTCPWRG/miLn5MqlLgO0ncqjZvlgS1lwZoM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=northecho.dev; spf=none smtp.mailfrom=northecho.dev; dkim=pass (2048-bit key) header.d=northecho-dev.20251104.gappssmtp.com header.i=@northecho-dev.20251104.gappssmtp.com header.b=I/ycwK4T; arc=none smtp.client-ip=74.125.224.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=northecho.dev Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=northecho.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=northecho-dev.20251104.gappssmtp.com header.i=@northecho-dev.20251104.gappssmtp.com header.b="I/ycwK4T" Received: by mail-yx1-f50.google.com with SMTP id 956f58d0204a3-65e81d623bbso191843d50.2 for ; Wed, 20 May 2026 19:59:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=northecho-dev.20251104.gappssmtp.com; s=20251104; t=1779332370; x=1779937170; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+XKb2Lqr4W3lw4U2X+TN89zQnTM+iU4ox03eiLP8Puw=; b=I/ycwK4TMG9SWoBWs7GGWmpyy/zMgqVJjV8Od4XM4lPIgfZjaXoP77LJx6QdLBYdWt jspYHPHHiWy175XjS0m0NYSroj62j1DADFlesGkVd87rJ8+iffHe7cJ4MCPE0dfNWitH EMtrDVqOXk3YS90Pc2S0isRAXcb8tXf8wE8bPRqQcmqqKTE5BkQFBAYsmYBjlRUPMeuJ BmnT1Z1BA2vYfJuBjG4HJNfaxJXfN7JoBYXN/3hxTaF6U3cEEzJZgSgYri2tydgCF0bR +lMbiSVinixoE6mCPLf0n2QtakJQ79NWeMWlFbs62ZWDCptG1gvHAz25ZLk/lcZvRCnK KGbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779332370; x=1779937170; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+XKb2Lqr4W3lw4U2X+TN89zQnTM+iU4ox03eiLP8Puw=; b=bdp9OLMWxdtM6pMgMNcIlFzlsLVQbp+k9ed9PyBz4y1ANsJEfPxZUZtoSu4oWJbf/X xihgVtyuF6owl3TVt/kjk8NmO8nULZlNTOwQQ5rSm8te5yn8Jdm5eUvAUdI7bMAiVv4Y WbxvnnJ1BBFuvUJ/CtSi1PRi8yRFKfVKL3hCWtkbFms4mz7aJOdvBFTI+CDQPiKE8DtH chnP/TEEspDZZf3kMLjmYccA4BGbeGeT6r4yJKvqnLCHnIg63CsW78lbIar5eYtL+SfW mhlQBTAKNNtHedBHfOIaEzB+0z9mIzY+YfUhioqu/W+qUblaDss5nYFCUk/btA1ngYRF XwPg== X-Forwarded-Encrypted: i=1; AFNElJ+RlR9l6KIEbQb2prmDyrlJmYuw1L8OLoi7f+zN+SUe5nBL3R7D2AAvKnVyj0mRKE+lc6b7U0dIqSzFXYE=@vger.kernel.org X-Gm-Message-State: AOJu0Ywhww5TBQIgSW3PrvJDhZLmY79LIkUrywaJZ+2P3/kEx6Wp+fXR j9utsEA/nKzD1teQmmgufRLut0Tru814IsDLTWiAs1s8mcbXqVLGrV8xoJ8PYDDFgRi3 X-Gm-Gg: Acq92OFF6TNXTOpDtmRgGJPu7jUWaGVqblEzJK6V4GfrqquI0/B4FHBTRHqarUWDpev NQ7Pu9XtLdynURid3Vo2U1WWuRi5IOQG8f5pFAZWENDQ2S7qVNO2ghpqBFU5XQDVJAevutcXLgE YnGs23AExIfkRlUga67xt2RpO/iq+pJR3QR1Cqg425rP/WawOKM7Q8j5eIAYXBe3evxQ8WIP7Pi CTLylzQg5k0alyAfz6t+Tp9gv5SVlNkLPxQ5z7uHtjjR6czoMEmxQBsDQWJM8DBiLBEL0MujZzB 8Ce8aPmvIPJv5ILzY28WcKtKFvLHxwnYI4+Gbu1k0eGy6egcTkg212g7LQ7v358fuQ27UvW1pxd naF7tGymOAUeG/i4huTuBPCEQpILMOpp23iuxT7XLaMyjzhuXYK2vfQcv/gsQ3rFh+JFNQToOwe xJS7yyHjBofoUiOGJLo97Fetl23IlfBuhv6j1bRO8ozwK8HeiCtt3DUo2tHTmG4O1SQfCMFdPlj PqgZZuzu2Xq5zG7vbtZF3li5w== X-Received: by 2002:a05:690e:140d:b0:65c:6ffb:303a with SMTP id 956f58d0204a3-65eae2fdc85mr521328d50.8.1779332369665; Wed, 20 May 2026 19:59:29 -0700 (PDT) Received: from kelso.tail8e61da.ts.net (99-10-92-174.lightspeed.rlghnc.sbcglobal.net. [99.10.92.174]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-65e0d86c850sm10092743d50.1.2026.05.20.19.59.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 May 2026 19:59:29 -0700 (PDT) From: Christopher Lusk To: Jakub Kicinski Cc: John Fastabend , Sabrina Dubroca , "David S. Miller" , Eric Dumazet , Paolo Abeni , Simon Horman , Shuah Khan , Alexei Starovoitov , Daniel Borkmann , netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH net v2 1/2] net: tls: preserve split open record on async encrypt Date: Wed, 20 May 2026 22:58:39 -0400 Message-ID: <20260521025840.976378-2-clusk@northecho.dev> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260521025840.976378-1-clusk@northecho.dev> References: <20260521025840.976378-1-clusk@northecho.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit When the BPF sk_msg verdict sets apply_bytes smaller than the current open record, tls_push_record() splits ctx->open_rec into the record being encrypted and a remainder record. The synchronous path reattaches the remainder to ctx->open_rec before continuing. If the selected AEAD provider completes asynchronously, tls_do_encryption() returns -EINPROGRESS after unhooking ctx->open_rec. tls_push_record() currently returns immediately in that case, before the split remainder is reattached. The remainder is no longer reachable through ctx->open_rec or ctx->tx_list, which can silently drop transmitted data and leak the unreachable tls_rec. Keep the split remainder rooted even when encryption of the first record is pending asynchronously, and continue the BPF verdict drain loop after an async record has been queued. If that loop then hits a later verdict error, wait for the pending async encryption before returning the error so zerocopy user pages cannot be released while cryptd still reads them. Fixes: d3b18ad31f93 ("tls: add bpf support to sk_msg handling") Cc: stable@vger.kernel.org # 4.20+ Signed-off-by: Christopher Lusk Assisted-by: Codex:gpt-5.5 Assisted-by: Claude:claude-opus-4-7 --- net/tls/tls_sw.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 964ebc268..5b20be5b4 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -840,16 +840,19 @@ static int tls_push_record(struct sock *sk, int flags, rc = tls_do_encryption(sk, tls_ctx, ctx, req, msg_pl->sg.size + prot->tail_size, i); if (rc < 0) { - if (rc != -EINPROGRESS) { - tls_err_abort(sk, -EBADMSG); - if (split) { - tls_ctx->pending_open_record_frags = true; - tls_merge_open_record(sk, rec, tmp, orig_end); - } + if (rc == -EINPROGRESS) + goto split_done; + + tls_err_abort(sk, -EBADMSG); + if (split) { + tls_ctx->pending_open_record_frags = true; + tls_merge_open_record(sk, rec, tmp, orig_end); } ctx->async_capable = 1; return rc; - } else if (split) { + } +split_done: + if (split) { msg_pl = &tmp->msg_plaintext; msg_en = &tmp->msg_encrypted; sk_msg_trim(sk, msg_en, msg_pl->sg.size + prot->overhead_size); @@ -857,6 +860,11 @@ static int tls_push_record(struct sock *sk, int flags, ctx->open_rec = tmp; } + if (rc < 0) { + ctx->async_capable = 1; + return rc; + } + return tls_tx_records(sk, flags); } @@ -871,6 +879,8 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk, struct sock *sk_redir; struct tls_rec *rec; bool enospc, policy, redir_ingress; + bool async = false; + int async_err = 0; int err = 0, send; u32 delta = 0; @@ -920,6 +930,10 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk, switch (psock->eval) { case __SK_PASS: err = tls_push_record(sk, flags, record_type); + if (err == -EINPROGRESS) { + async = true; + err = 0; + } if (err && err != -EINPROGRESS && sk->sk_err == EBADMSG) { *copied -= sk_msg_free(sk, msg); tls_free_open_rec(sk); @@ -988,8 +1002,18 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk, goto more_data; } out_err: + if (async && err && err != -EINPROGRESS) { + async_err = tls_encrypt_async_wait(ctx); + if (test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask)) { + /* tx_lock is held; the worker will reschedule if needed. */ + cancel_delayed_work(&ctx->tx_work.work); + tls_tx_records(sk, flags); + } + if (async_err) + err = async_err; + } sk_psock_put(sk, psock); - return err; + return err ?: (async ? -EINPROGRESS : 0); } static int tls_sw_push_pending_record(struct sock *sk, int flags) -- 2.54.0