Skip to content

Commit c8603c0

Browse files
author
Alex Shi
committed
Merge tag 'v4.4.69' into linux-linaro-lsk-v4.4
This is the 4.4.69 stable release
2 parents 4c940b3 + bb56ca2 commit c8603c0

90 files changed

Lines changed: 796 additions & 434 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
VERSION = 4
22
PATCHLEVEL = 4
3-
SUBLEVEL = 68
3+
SUBLEVEL = 69
44
EXTRAVERSION =
55
NAME = Blurry Fish Butt
66

arch/arm/kvm/psci.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,10 @@ int kvm_psci_version(struct kvm_vcpu *vcpu)
208208

209209
static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
210210
{
211-
int ret = 1;
211+
struct kvm *kvm = vcpu->kvm;
212212
unsigned long psci_fn = vcpu_get_reg(vcpu, 0) & ~((u32) 0);
213213
unsigned long val;
214+
int ret = 1;
214215

215216
switch (psci_fn) {
216217
case PSCI_0_2_FN_PSCI_VERSION:
@@ -230,7 +231,9 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
230231
break;
231232
case PSCI_0_2_FN_CPU_ON:
232233
case PSCI_0_2_FN64_CPU_ON:
234+
mutex_lock(&kvm->lock);
233235
val = kvm_psci_vcpu_on(vcpu);
236+
mutex_unlock(&kvm->lock);
234237
break;
235238
case PSCI_0_2_FN_AFFINITY_INFO:
236239
case PSCI_0_2_FN64_AFFINITY_INFO:
@@ -279,6 +282,7 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
279282

280283
static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
281284
{
285+
struct kvm *kvm = vcpu->kvm;
282286
unsigned long psci_fn = vcpu_get_reg(vcpu, 0) & ~((u32) 0);
283287
unsigned long val;
284288

@@ -288,7 +292,9 @@ static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
288292
val = PSCI_RET_SUCCESS;
289293
break;
290294
case KVM_PSCI_FN_CPU_ON:
295+
mutex_lock(&kvm->lock);
291296
val = kvm_psci_vcpu_on(vcpu);
297+
mutex_unlock(&kvm->lock);
292298
break;
293299
default:
294300
val = PSCI_RET_NOT_SUPPORTED;

arch/arm64/kvm/sys_regs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,8 +1055,8 @@ static int kvm_handle_cp_64(struct kvm_vcpu *vcpu,
10551055
{
10561056
struct sys_reg_params params;
10571057
u32 hsr = kvm_vcpu_get_hsr(vcpu);
1058-
int Rt = (hsr >> 5) & 0xf;
1059-
int Rt2 = (hsr >> 10) & 0xf;
1058+
int Rt = (hsr >> 5) & 0x1f;
1059+
int Rt2 = (hsr >> 10) & 0x1f;
10601060

10611061
params.is_aarch32 = true;
10621062
params.is_32bit = false;
@@ -1107,7 +1107,7 @@ static int kvm_handle_cp_32(struct kvm_vcpu *vcpu,
11071107
{
11081108
struct sys_reg_params params;
11091109
u32 hsr = kvm_vcpu_get_hsr(vcpu);
1110-
int Rt = (hsr >> 5) & 0xf;
1110+
int Rt = (hsr >> 5) & 0x1f;
11111111

11121112
params.is_aarch32 = true;
11131113
params.is_32bit = true;

arch/x86/boot/boot.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#ifndef BOOT_BOOT_H
1717
#define BOOT_BOOT_H
1818

19-
#define STACK_SIZE 512 /* Minimum number of bytes for stack */
19+
#define STACK_SIZE 1024 /* Minimum number of bytes for stack */
2020

2121
#ifndef __ASSEMBLY__
2222

arch/x86/include/asm/pmem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ static inline size_t arch_copy_from_iter_pmem(void __pmem *addr, size_t bytes,
122122

123123
if (bytes < 8) {
124124
if (!IS_ALIGNED(dest, 4) || (bytes != 4))
125-
__arch_wb_cache_pmem(addr, 1);
125+
__arch_wb_cache_pmem(addr, bytes);
126126
} else {
127127
if (!IS_ALIGNED(dest, 8)) {
128128
dest = ALIGN(dest, boot_cpu_data.x86_clflush_size);

arch/x86/kvm/x86.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2960,6 +2960,12 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
29602960
| KVM_VCPUEVENT_VALID_SMM))
29612961
return -EINVAL;
29622962

2963+
/* INITs are latched while in SMM */
2964+
if (events->flags & KVM_VCPUEVENT_VALID_SMM &&
2965+
(events->smi.smm || events->smi.pending) &&
2966+
vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED)
2967+
return -EINVAL;
2968+
29632969
process_nmi(vcpu);
29642970
vcpu->arch.exception.pending = events->exception.injected;
29652971
vcpu->arch.exception.nr = events->exception.nr;
@@ -6993,6 +6999,12 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
69936999
mp_state->mp_state != KVM_MP_STATE_RUNNABLE)
69947000
return -EINVAL;
69957001

7002+
/* INITs are latched while in SMM */
7003+
if ((is_smm(vcpu) || vcpu->arch.smi_pending) &&
7004+
(mp_state->mp_state == KVM_MP_STATE_SIPI_RECEIVED ||
7005+
mp_state->mp_state == KVM_MP_STATE_INIT_RECEIVED))
7006+
return -EINVAL;
7007+
69967008
if (mp_state->mp_state == KVM_MP_STATE_SIPI_RECEIVED) {
69977009
vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED;
69987010
set_bit(KVM_APIC_SIPI, &vcpu->arch.apic->pending_events);

arch/x86/um/ptrace_64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ int poke_user(struct task_struct *child, long addr, long data)
121121
else if ((addr >= offsetof(struct user, u_debugreg[0])) &&
122122
(addr <= offsetof(struct user, u_debugreg[7]))) {
123123
addr -= offsetof(struct user, u_debugreg[0]);
124-
addr = addr >> 2;
124+
addr = addr >> 3;
125125
if ((addr == 4) || (addr == 5))
126126
return -EIO;
127127
child->thread.arch.debugregs[addr] = data;

arch/x86/xen/mmu.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2038,7 +2038,8 @@ static unsigned long __init xen_read_phys_ulong(phys_addr_t addr)
20382038

20392039
/*
20402040
* Translate a virtual address to a physical one without relying on mapped
2041-
* page tables.
2041+
* page tables. Don't rely on big pages being aligned in (guest) physical
2042+
* space!
20422043
*/
20432044
static phys_addr_t __init xen_early_virt_to_phys(unsigned long vaddr)
20442045
{
@@ -2059,15 +2060,15 @@ static phys_addr_t __init xen_early_virt_to_phys(unsigned long vaddr)
20592060
sizeof(pud)));
20602061
if (!pud_present(pud))
20612062
return 0;
2062-
pa = pud_pfn(pud) << PAGE_SHIFT;
2063+
pa = pud_val(pud) & PTE_PFN_MASK;
20632064
if (pud_large(pud))
20642065
return pa + (vaddr & ~PUD_MASK);
20652066

20662067
pmd = native_make_pmd(xen_read_phys_ulong(pa + pmd_index(vaddr) *
20672068
sizeof(pmd)));
20682069
if (!pmd_present(pmd))
20692070
return 0;
2070-
pa = pmd_pfn(pmd) << PAGE_SHIFT;
2071+
pa = pmd_val(pmd) & PTE_PFN_MASK;
20712072
if (pmd_large(pmd))
20722073
return pa + (vaddr & ~PMD_MASK);
20732074

block/blk-integrity.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,8 @@ void blk_integrity_register(struct gendisk *disk, struct blk_integrity *template
412412

413413
bi->flags = BLK_INTEGRITY_VERIFY | BLK_INTEGRITY_GENERATE |
414414
template->flags;
415-
bi->interval_exp = ilog2(queue_logical_block_size(disk->queue));
415+
bi->interval_exp = template->interval_exp ? :
416+
ilog2(queue_logical_block_size(disk->queue));
416417
bi->profile = template->profile ? template->profile : &nop_profile;
417418
bi->tuple_size = template->tuple_size;
418419
bi->tag_size = template->tag_size;

crypto/algif_aead.c

Lines changed: 149 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ struct aead_sg_list {
2929
struct scatterlist sg[ALG_MAX_PAGES];
3030
};
3131

32+
struct aead_tfm {
33+
struct crypto_aead *aead;
34+
bool has_key;
35+
};
36+
3237
struct aead_ctx {
3338
struct aead_sg_list tsgl;
3439
/*
@@ -513,24 +518,146 @@ static struct proto_ops algif_aead_ops = {
513518
.poll = aead_poll,
514519
};
515520

521+
static int aead_check_key(struct socket *sock)
522+
{
523+
int err = 0;
524+
struct sock *psk;
525+
struct alg_sock *pask;
526+
struct aead_tfm *tfm;
527+
struct sock *sk = sock->sk;
528+
struct alg_sock *ask = alg_sk(sk);
529+
530+
lock_sock(sk);
531+
if (ask->refcnt)
532+
goto unlock_child;
533+
534+
psk = ask->parent;
535+
pask = alg_sk(ask->parent);
536+
tfm = pask->private;
537+
538+
err = -ENOKEY;
539+
lock_sock_nested(psk, SINGLE_DEPTH_NESTING);
540+
if (!tfm->has_key)
541+
goto unlock;
542+
543+
if (!pask->refcnt++)
544+
sock_hold(psk);
545+
546+
ask->refcnt = 1;
547+
sock_put(psk);
548+
549+
err = 0;
550+
551+
unlock:
552+
release_sock(psk);
553+
unlock_child:
554+
release_sock(sk);
555+
556+
return err;
557+
}
558+
559+
static int aead_sendmsg_nokey(struct socket *sock, struct msghdr *msg,
560+
size_t size)
561+
{
562+
int err;
563+
564+
err = aead_check_key(sock);
565+
if (err)
566+
return err;
567+
568+
return aead_sendmsg(sock, msg, size);
569+
}
570+
571+
static ssize_t aead_sendpage_nokey(struct socket *sock, struct page *page,
572+
int offset, size_t size, int flags)
573+
{
574+
int err;
575+
576+
err = aead_check_key(sock);
577+
if (err)
578+
return err;
579+
580+
return aead_sendpage(sock, page, offset, size, flags);
581+
}
582+
583+
static int aead_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
584+
size_t ignored, int flags)
585+
{
586+
int err;
587+
588+
err = aead_check_key(sock);
589+
if (err)
590+
return err;
591+
592+
return aead_recvmsg(sock, msg, ignored, flags);
593+
}
594+
595+
static struct proto_ops algif_aead_ops_nokey = {
596+
.family = PF_ALG,
597+
598+
.connect = sock_no_connect,
599+
.socketpair = sock_no_socketpair,
600+
.getname = sock_no_getname,
601+
.ioctl = sock_no_ioctl,
602+
.listen = sock_no_listen,
603+
.shutdown = sock_no_shutdown,
604+
.getsockopt = sock_no_getsockopt,
605+
.mmap = sock_no_mmap,
606+
.bind = sock_no_bind,
607+
.accept = sock_no_accept,
608+
.setsockopt = sock_no_setsockopt,
609+
610+
.release = af_alg_release,
611+
.sendmsg = aead_sendmsg_nokey,
612+
.sendpage = aead_sendpage_nokey,
613+
.recvmsg = aead_recvmsg_nokey,
614+
.poll = aead_poll,
615+
};
616+
516617
static void *aead_bind(const char *name, u32 type, u32 mask)
517618
{
518-
return crypto_alloc_aead(name, type, mask);
619+
struct aead_tfm *tfm;
620+
struct crypto_aead *aead;
621+
622+
tfm = kzalloc(sizeof(*tfm), GFP_KERNEL);
623+
if (!tfm)
624+
return ERR_PTR(-ENOMEM);
625+
626+
aead = crypto_alloc_aead(name, type, mask);
627+
if (IS_ERR(aead)) {
628+
kfree(tfm);
629+
return ERR_CAST(aead);
630+
}
631+
632+
tfm->aead = aead;
633+
634+
return tfm;
519635
}
520636

521637
static void aead_release(void *private)
522638
{
523-
crypto_free_aead(private);
639+
struct aead_tfm *tfm = private;
640+
641+
crypto_free_aead(tfm->aead);
642+
kfree(tfm);
524643
}
525644

526645
static int aead_setauthsize(void *private, unsigned int authsize)
527646
{
528-
return crypto_aead_setauthsize(private, authsize);
647+
struct aead_tfm *tfm = private;
648+
649+
return crypto_aead_setauthsize(tfm->aead, authsize);
529650
}
530651

531652
static int aead_setkey(void *private, const u8 *key, unsigned int keylen)
532653
{
533-
return crypto_aead_setkey(private, key, keylen);
654+
struct aead_tfm *tfm = private;
655+
int err;
656+
657+
err = crypto_aead_setkey(tfm->aead, key, keylen);
658+
tfm->has_key = !err;
659+
660+
return err;
534661
}
535662

536663
static void aead_sock_destruct(struct sock *sk)
@@ -546,12 +673,14 @@ static void aead_sock_destruct(struct sock *sk)
546673
af_alg_release_parent(sk);
547674
}
548675

549-
static int aead_accept_parent(void *private, struct sock *sk)
676+
static int aead_accept_parent_nokey(void *private, struct sock *sk)
550677
{
551678
struct aead_ctx *ctx;
552679
struct alg_sock *ask = alg_sk(sk);
553-
unsigned int len = sizeof(*ctx) + crypto_aead_reqsize(private);
554-
unsigned int ivlen = crypto_aead_ivsize(private);
680+
struct aead_tfm *tfm = private;
681+
struct crypto_aead *aead = tfm->aead;
682+
unsigned int len = sizeof(*ctx) + crypto_aead_reqsize(aead);
683+
unsigned int ivlen = crypto_aead_ivsize(aead);
555684

556685
ctx = sock_kmalloc(sk, len, GFP_KERNEL);
557686
if (!ctx)
@@ -577,7 +706,7 @@ static int aead_accept_parent(void *private, struct sock *sk)
577706

578707
ask->private = ctx;
579708

580-
aead_request_set_tfm(&ctx->aead_req, private);
709+
aead_request_set_tfm(&ctx->aead_req, aead);
581710
aead_request_set_callback(&ctx->aead_req, CRYPTO_TFM_REQ_MAY_BACKLOG,
582711
af_alg_complete, &ctx->completion);
583712

@@ -586,13 +715,25 @@ static int aead_accept_parent(void *private, struct sock *sk)
586715
return 0;
587716
}
588717

718+
static int aead_accept_parent(void *private, struct sock *sk)
719+
{
720+
struct aead_tfm *tfm = private;
721+
722+
if (!tfm->has_key)
723+
return -ENOKEY;
724+
725+
return aead_accept_parent_nokey(private, sk);
726+
}
727+
589728
static const struct af_alg_type algif_type_aead = {
590729
.bind = aead_bind,
591730
.release = aead_release,
592731
.setkey = aead_setkey,
593732
.setauthsize = aead_setauthsize,
594733
.accept = aead_accept_parent,
734+
.accept_nokey = aead_accept_parent_nokey,
595735
.ops = &algif_aead_ops,
736+
.ops_nokey = &algif_aead_ops_nokey,
596737
.name = "aead",
597738
.owner = THIS_MODULE
598739
};

0 commit comments

Comments
 (0)