History

Merge tag 's390-5.4-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Vasily Gorbik: - Add R_390_GLOB_DAT relocation type support. This fixes boot problem on linux-next. - Fix memory leak in zcrypt * tag 's390-5.4-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/kaslr: add support for R_390_GLOB_DAT relocation type s390/zcrypt: fix memleak at release

Linus Torvalds committed 7 years ago

Commit f877bee2 parents 4fac240 ac493033 files · +13 −5Browse files

Unified · Split

3 files
  1. arch/s390/boot/startup.c +11 −3
  2. arch/s390/kernel/machine_kexec_reloc.c +1 −0
  3. drivers/s390/crypto/zcrypt_api.c +1 −2
arch/s390/boot/startup.c+11−3
@@ -101,10 +101,18 @@ static void handle_relocs(unsigned long offset) · 100 unmodified lines
101101 dynsym = (Elf64_Sym *) vmlinux.dynsym_start;
102102 for (rela = rela_start; rela < rela_end; rela++) {
103103 loc = rela->r_offset + offset;
104− val = rela->r_addend + offset;
104+ val = rela->r_addend;
105105 r_sym = ELF64_R_SYM(rela->r_info);
106− if (r_sym)
107− val += dynsym[r_sym].st_value;
106+ if (r_sym) {
107+ if (dynsym[r_sym].st_shndx != SHN_UNDEF)
108+ val += dynsym[r_sym].st_value + offset;
109+ } else {
110+ /*
111+ * 0 == undefined symbol table index (STN_UNDEF),
112+ * used for R_390_RELATIVE, only add KASLR offset
113+ */
114+ val += offset;
115+ }
108116 r_type = ELF64_R_TYPE(rela->r_info);
109117 rc = arch_kexec_do_relocs(r_type, (void *) loc, val, 0);
110118 if (rc)
arch/s390/kernel/machine_kexec_reloc.c+1−0
@@ -27,6 +27,7 @@ int arch_kexec_do_relocs(int r_type, void *loc, unsigned long val, · 26 unmodified lines
2727 *(u32 *)loc = val;
2828 break;
2929 case R_390_64: /* Direct 64 bit. */
30+ case R_390_GLOB_DAT:
3031 *(u64 *)loc = val;
3132 break;
3233 case R_390_PC16: /* PC relative 16 bit. */
drivers/s390/crypto/zcrypt_api.c+1−2
@@ -522,8 +522,7 @@ static int zcrypt_release(struct inode *inode, struct file *filp) · 521 unmodified lines
522522 if (filp->f_inode->i_cdev == &zcrypt_cdev) {
523523 struct zcdn_device *zcdndev;
524524
525− if (mutex_lock_interruptible(&ap_perms_mutex))
526− return -ERESTARTSYS;
525+ mutex_lock(&ap_perms_mutex);
527526 zcdndev = find_zcdndev_by_devt(filp->f_inode->i_rdev);
528527 mutex_unlock(&ap_perms_mutex);
529528 if (zcdndev) {