]> 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)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 18 Sep 2025 09:24:59 +0000 (17:24 +0800)
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>
crypto/af_alg.c
include/crypto/if_alg.h

index 407f2c238f2c67101350380d5f019a476a7e79d0..ca6fdcc6c54aca6825b8db7546e809e99dc3285e 100644 (file)
@@ -970,6 +970,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;
@@ -1105,6 +1111,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 f7b3b93f3a49a73d2de96027203bc150bbc745d3..0c70f3a5557505999e2509d643c7182ece801194 100644 (file)
@@ -135,6 +135,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;