]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: af_alg - Disallow concurrent writes in af_alg_sendmsg
authorHerbert Xu <herbert@gondor.apana.org.au>
Tue, 16 Sep 2025 09:20:59 +0000 (17:20 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Oct 2025 11:35:42 +0000 (13:35 +0200)
[ Upstream commit 1b34cbbf4f011a121ef7b2d7d6e6920a036d5285 ]

Issuing two writes to the same af_alg socket is bogus as the
data will be interleaved in an unpredictable fashion.  Furthermore,
concurrent writes may create inconsistencies in the internal
socket state.

Disallow this by adding a new ctx->write field that indiciates
exclusive ownership for writing.

Fixes: 8ff590903d5 ("crypto: algif_skcipher - User-space interface for skcipher operations")
Reported-by: Muhammad Alifa Ramdhan <ramdhan@starlabs.sg>
Reported-by: Bing-Jhong Billy Jheng <billy@starlabs.sg>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
crypto/af_alg.c
include/crypto/if_alg.h

index 755e6caf18d289e755db3a2d05aed76f1ce32d8d..25cf2fa3dde75fea2927aa17cd9ed1678a9ab9d0 100644 (file)
@@ -862,6 +862,12 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
        }
 
        lock_sock(sk);
+       if (ctx->write) {
+               release_sock(sk);
+               return -EBUSY;
+       }
+       ctx->write = true;
+
        if (ctx->init && !ctx->more) {
                if (ctx->used) {
                        err = -EINVAL;
@@ -969,6 +975,7 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
 
 unlock:
        af_alg_data_wakeup(sk);
+       ctx->write = false;
        release_sock(sk);
 
        return copied ?: err;
index a406e281ae571e403d81701011644bef58f259d4..1424200fe88cfb2be7bea83cfc9c2ce1e5b4c02f 100644 (file)
@@ -136,6 +136,7 @@ struct af_alg_async_req {
  *                     SG?
  * @enc:               Cryptographic operation to be performed when
  *                     recvmsg is invoked.
+ * @write:             True if we are in the middle of a write.
  * @init:              True if metadata has been sent.
  * @len:               Length of memory allocated for this data structure.
  * @inflight:          Non-zero when AIO requests are in flight.
@@ -151,10 +152,11 @@ struct af_alg_ctx {
        size_t used;
        atomic_t rcvused;
 
-       bool more;
-       bool merge;
-       bool enc;
-       bool init;
+       u32             more:1,
+                       merge:1,
+                       enc:1,
+                       write:1,
+                       init:1;
 
        unsigned int len;