Skip to content

Commit

Permalink
linux-user: do_setsockopt: fix SOL_ALG.ALG_SET_KEY
Browse files Browse the repository at this point in the history
This setsockopt accepts zero-lengh optlen (current qemu implementation
does not allow this).  Also, there's no need to make a copy of the key,
it is enough to use lock_user() (which accepts zero length already).

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2197
Fixes: f31dddd "linux-user: Add support for setsockopt() option SOL_ALG"
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Message-Id: <20240331100737.2724186-2-mjt@tls.msk.ru>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
(cherry picked from commit 04f6fb8)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
  • Loading branch information
Michael Tokarev committed Apr 28, 2024
1 parent 55b88e6 commit 6fee9ef
Showing 1 changed file with 2 additions and 7 deletions.
9 changes: 2 additions & 7 deletions linux-user/syscall.c
Expand Up @@ -2277,18 +2277,13 @@ static abi_long do_setsockopt(int sockfd, int level, int optname,
switch (optname) {
case ALG_SET_KEY:
{
char *alg_key = g_malloc(optlen);

char *alg_key = lock_user(VERIFY_READ, optval_addr, optlen, 1);
if (!alg_key) {
return -TARGET_ENOMEM;
}
if (copy_from_user(alg_key, optval_addr, optlen)) {
g_free(alg_key);
return -TARGET_EFAULT;
}
ret = get_errno(setsockopt(sockfd, level, optname,
alg_key, optlen));
g_free(alg_key);
unlock_user(alg_key, optval_addr, optlen);
break;
}
case ALG_SET_AEAD_AUTHSIZE:
Expand Down

0 comments on commit 6fee9ef

Please sign in to comment.