Linux 5.10.254
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.10.254 kernel.
All users of the 5.10 kernel series must upgrade.
The updated 5.10.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.10.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 crypto/Kconfig | 2 crypto/af_alg.c | 137 ++++++++++++----------------- crypto/algif_aead.c | 203 ++++++++----------------------------------- crypto/algif_skcipher.c | 6 - crypto/authenc.c | 32 ------ crypto/authencesn.c | 84 ++++++----------- crypto/scatterwalk.c | 98 ++++++++++++++++++++ drivers/xen/privcmd.c | 7 + drivers/xen/sys-hypervisor.c | 8 + include/crypto/if_alg.h | 5 - include/crypto/scatterwalk.h | 32 ++++++ lib/crypto/chacha.c | 4 13 files changed, 286 insertions(+), 334 deletions(-)
Douya Le (1):
crypto: algif_aead - snapshot IV for async AEAD requests
Eric Biggers (3):
crypto: scatterwalk - Backport memcpy_sglist()
crypto: algif_aead - use memcpy_sglist() instead of null skcipher
crypto: authenc - use memcpy_sglist() instead of null skcipher
Greg Kroah-Hartman (1):
Linux 5.10.254
Herbert Xu (5):
crypto: algif_aead - Revert to operating out-of-place
crypto: authencesn - Do not place hiseq at end of dst for out-of-place decryption
crypto: authencesn - Fix src offset when decrypting in-place
crypto: af_alg - Fix page reassignment overflow in af_alg_pull_tsgl
crypto: algif_aead - Fix minimum RX size check for decryption
Juergen Gross (2):
xen/privcmd: fix double free via VMA splitting Buffer overflow in drivers/xen/sys-hypervisor.c
Randy Dunlap (1):
crypto: doc - fix kernel-doc notation in chacha.c and af_alg.c
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 10 -SUBLEVEL = 253 +SUBLEVEL = 254 EXTRAVERSION = NAME = Dare mighty things
crypto/Kconfig +0 -2
@@ -195,7 +195,6 @@ config CRYPTO_AUTHENC select CRYPTO_SKCIPHER select CRYPTO_MANAGER select CRYPTO_HASH - select CRYPTO_NULL help Authenc: Combined mode wrapper for IPsec. This is required for IPSec.
@@ -1907,7 +1906,6 @@ config CRYPTO_USER_API_AEAD depends on NET select CRYPTO_AEAD select CRYPTO_SKCIPHER - select CRYPTO_NULL select CRYPTO_USER_API help This option enables the user-spaces interface for AEAD
crypto/af_alg.c +60 -77
249 lines not on this page · raw message
crypto/algif_aead.c +42 -161
329 lines not on this page · raw message
crypto/algif_skcipher.c +3 -3
@@ -89,7 +89,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,* Create a per request TX SGL for this request which tracks the * SG entries from the global TX SGL. */ - areq->tsgl_entries =af_alg_count_tsgl (sk, len,0 ); + areq->tsgl_entries =af_alg_count_tsgl (sk, len);if (!areq->tsgl_entries) areq->tsgl_entries =1 ; areq->tsgl = sock_kmalloc(sk, array_size(sizeof(*areq->tsgl),
@@ -100,7 +100,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, goto free; }sg_init_table (areq->tsgl, areq->tsgl_entries); -af_alg_pull_tsgl (sk, len, areq->tsgl,0 ); +af_alg_pull_tsgl (sk, len, areq->tsgl);/* Initialize the crypto operation */ skcipher_request_set_tfm (&areq->cra_u.skcipher_req, tfm);
@@ -313,7 +313,7 @@ static void skcipher_sock_destruct(struct sock *sk)struct alg_sock *pask =alg_sk (psk);struct crypto_skcipher *tfm = pask->private; -af_alg_pull_tsgl (sk, ctx->used,NULL ,0 ); +af_alg_pull_tsgl (sk, ctx->used,NULL );sock_kzfree_s (sk, ctx->iv,crypto_skcipher_ivsize (tfm));sock_kfree_s (sk, ctx, ctx->len);af_alg_release_parent (sk);
crypto/authenc.c +1 -31
@@ -9,7 +9,6 @@#include <crypto/internal/hash.h> #include <crypto/internal/skcipher.h> #include <crypto/authenc.h> -#include <crypto/null.h> #include <crypto/scatterwalk.h> #include <linux/err.h> #include <linux/init.h>
@@ -28,7 +27,6 @@ struct authenc_instance_ctx {struct crypto_authenc_ctx {struct crypto_ahash *auth;struct crypto_skcipher *enc; -struct crypto_sync_skcipher *null; };struct authenc_request_ctx {
@@ -174,21 +172,6 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req,authenc_request_complete (areq, err); } -static int crypto_authenc_copy_assoc (struct aead_request *req) -{ -struct crypto_aead *authenc =crypto_aead_reqtfm (req); -struct crypto_authenc_ctx *ctx =crypto_aead_ctx (authenc); -SYNC_SKCIPHER_REQUEST_ON_STACK (skreq, ctx->null); - -skcipher_request_set_sync_tfm (skreq, ctx->null); -skcipher_request_set_callback (skreq,aead_request_flags (req), -NULL ,NULL ); -skcipher_request_set_crypt (skreq, req->src, req->dst, req->assoclen, -NULL ); - -return crypto_skcipher_encrypt (skreq); -} -static int crypto_authenc_encrypt (struct aead_request *req) {struct crypto_aead *authenc =crypto_aead_reqtfm (req);
@@ -207,10 +190,7 @@ static int crypto_authenc_encrypt(struct aead_request *req) dst = src;if (req->src != req->dst) { - err =crypto_authenc_copy_assoc (req); -if (err) -return err; - +memcpy_sglist (req->dst, req->src, req->assoclen); dst =scatterwalk_ffwd (areq_ctx->dst, req->dst, req->assoclen); }
@@ -311,7 +291,6 @@ static int crypto_authenc_init_tfm(struct crypto_aead *tfm)struct crypto_authenc_ctx *ctx =crypto_aead_ctx (tfm);struct crypto_ahash *auth;struct crypto_skcipher *enc; -struct crypto_sync_skcipher *null;int err; auth =crypto_spawn_ahash (&ictx->auth);
@@ -323,14 +302,8 @@ static int crypto_authenc_init_tfm(struct crypto_aead *tfm)if (IS_ERR (enc)) goto err_free_ahash; - null =crypto_get_default_null_skcipher (); - err =PTR_ERR (null); -if (IS_ERR (null)) - goto err_free_skcipher; - ctx->auth = auth; ctx->enc = enc; - ctx->null = null; crypto_aead_set_reqsize( tfm,
@@ -344,8 +317,6 @@ static int crypto_authenc_init_tfm(struct crypto_aead *tfm)return 0 ; -err_free_skcipher: -crypto_free_skcipher (enc); err_free_ahash:crypto_free_ahash (auth);return err;
@@ -357,7 +328,6 @@ static void crypto_authenc_exit_tfm(struct crypto_aead *tfm)crypto_free_ahash (ctx->auth);crypto_free_skcipher (ctx->enc); -crypto_put_default_null_skcipher (); }static void crypto_authenc_free (struct aead_instance *inst)
crypto/authencesn.c +32 -52
174 lines not on this page · raw message
crypto/scatterwalk.c +98 -0
104 lines not on this page · raw message
drivers/xen/privcmd.c +7 -0
@@ -935,6 +935,12 @@ static void privcmd_close(struct vm_area_struct *vma)kfree (pages); } +static int privcmd_may_split (struct vm_area_struct *area,unsigned long addr) +{ +/* Forbid splitting, avoids double free via privcmd_close(). */ +return -EINVAL ; +} +static vm_fault_t privcmd_fault (struct vm_fault *vmf) { printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n",
@@ -946,6 +952,7 @@ static vm_fault_t privcmd_fault(struct vm_fault *vmf)static const struct vm_operations_struct privcmd_vm_ops = { .close = privcmd_close, + .split = privcmd_may_split, .fault = privcmd_fault };
drivers/xen/sys-hypervisor.c +6 -2
@@ -364,6 +364,8 @@ static ssize_t buildid_show(struct hyp_sysfs_attr *attr, char *buffer) ret =sprintf (buffer,"<denied>" );return ret; } +if (ret >PAGE_SIZE ) +return -ENOSPC ; buildid =kmalloc (sizeof (*buildid) + ret,GFP_KERNEL );if (!buildid)
@@ -371,8 +373,10 @@ static ssize_t buildid_show(struct hyp_sysfs_attr *attr, char *buffer) buildid->len = ret; ret =HYPERVISOR_xen_version (XENVER_build_id, buildid); -if (ret >0 ) - ret =sprintf (buffer,"%s" , buildid->buf); +if (ret >0 ) { +/* Build id is binary, not a string. */ +memcpy (buffer, buildid->buf, ret); + }kfree (buildid);return ret;
include/crypto/if_alg.h +2 -3
@@ -230,9 +230,8 @@ static inline bool af_alg_readable(struct sock *sk)return PAGE_SIZE <=af_alg_rcvbuf (sk); } -unsigned int af_alg_count_tsgl (struct sock *sk,size_t bytes,size_t offset); -void af_alg_pull_tsgl (struct sock *sk,size_t used,struct scatterlist *dst, -size_t dst_offset); +unsigned int af_alg_count_tsgl (struct sock *sk,size_t bytes); +void af_alg_pull_tsgl (struct sock *sk,size_t used,struct scatterlist *dst);void af_alg_wmem_wakeup (struct sock *sk);int af_alg_wait_for_data (struct sock *sk,unsigned flags,unsigned min); int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
include/crypto/scatterwalk.h +32 -0
@@ -93,6 +93,35 @@ static inline void scatterwalk_pagedone(struct scatter_walk *walk, int out,scatterwalk_start (walk,sg_next (walk->sg)); } +/* +* Flush the dcache of any pages that overlap the region +* [offset, offset + nbytes) relative to base_page. +* +* This should be called only when ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE, to ensure +* that all relevant code (including the call to sg_page() in the caller, if +* applicable) gets fully optimized out when !ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE. +*/ +static inline void __scatterwalk_flush_dcache_pages (struct page *base_page, +unsigned int offset, +unsigned int nbytes) +{ +unsigned int num_pages; +unsigned int i; + + base_page += offset /PAGE_SIZE ; + offset %=PAGE_SIZE ; + +/* +* This is an overflow-safe version of +* num_pages = DIV_ROUND_UP(offset + nbytes, PAGE_SIZE). +*/ + num_pages = nbytes /PAGE_SIZE ; + num_pages +=DIV_ROUND_UP (offset + (nbytes %PAGE_SIZE ),PAGE_SIZE ); + +for (i =0 ; i < num_pages; i++) +flush_dcache_page (base_page + i); +} +static inline void scatterwalk_done (struct scatter_walk *walk,int out,int more) {
@@ -105,6 +134,9 @@ void scatterwalk_copychunks(void *buf, struct scatter_walk *walk, size_t nbytes, int out);void *scatterwalk_map (struct scatter_walk *walk); +void memcpy_sglist (struct scatterlist *dst,struct scatterlist *src, +unsigned int nbytes); +void scatterwalk_map_and_copy (void *buf,struct scatterlist *sg,unsigned int start,unsigned int nbytes,int out);
lib/crypto/chacha.c +2 -2
@@ -64,7 +64,7 @@ static void chacha_permute(u32 *x, int nrounds) }/** -* chacha_block - generate one keystream block and increment block counter +* chacha_block_generic - generate one keystream block and increment block counter * @state: input state matrix (16 32-bit words) * @stream: output keystream block (64 bytes) * @nrounds: number of rounds (20 or 12; 20 is recommended)
@@ -94,7 +94,7 @@ EXPORT_SYMBOL(chacha_block_generic);/** * hchacha_block_generic - abbreviated ChaCha core, for XChaCha * @state: input state matrix (16 32-bit words) -* @out: output (8 32-bit words) +* @stream: output (8 32-bit words) * @nrounds: number of rounds (20 or 12; 20 is recommended) * * HChaCha is the ChaCha equivalent of HSalsa and is an intermediate step