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
Unified · Split
| @@ -101,10 +101,18 @@ static void handle_relocs(unsigned long offset) · 100 unmodified lines | |||
| 101 | dynsym = (Elf64_Sym *) vmlinux.dynsym_start; | 101 | dynsym = (Elf64_Sym *) vmlinux.dynsym_start; |
| 102 | for (rela = rela_start; rela < rela_end; rela++) { | 102 | for (rela = rela_start; rela < rela_end; rela++) { |
| 103 | loc = rela->r_offset + offset; | 103 | loc = rela->r_offset + offset; |
| 104 | val = rela->r_addend + offset; | 104 | val = rela->r_addend; |
| 105 | r_sym = ELF64_R_SYM(rela->r_info); | 105 | r_sym = ELF64_R_SYM(rela->r_info); |
| 106 | if (r_sym) | 106 | if (r_sym) { |
| 107 | val += dynsym[r_sym].st_value; | 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 | } | ||
| 108 | r_type = ELF64_R_TYPE(rela->r_info); | 116 | r_type = ELF64_R_TYPE(rela->r_info); |
| 109 | rc = arch_kexec_do_relocs(r_type, (void *) loc, val, 0); | 117 | rc = arch_kexec_do_relocs(r_type, (void *) loc, val, 0); |
| 110 | if (rc) | 118 | if (rc) |
| @@ -27,6 +27,7 @@ int arch_kexec_do_relocs(int r_type, void *loc, unsigned long val, · 26 unmodified lines | |||
| 27 | *(u32 *)loc = val; | 27 | *(u32 *)loc = val; |
| 28 | break; | 28 | break; |
| 29 | case R_390_64: /* Direct 64 bit. */ | 29 | case R_390_64: /* Direct 64 bit. */ |
| 30 | case R_390_GLOB_DAT: | ||
| 30 | *(u64 *)loc = val; | 31 | *(u64 *)loc = val; |
| 31 | break; | 32 | break; |
| 32 | case R_390_PC16: /* PC relative 16 bit. */ | 33 | case R_390_PC16: /* PC relative 16 bit. */ |
| @@ -522,8 +522,7 @@ static int zcrypt_release(struct inode *inode, struct file *filp) · 521 unmodified lines | |||
| 522 | if (filp->f_inode->i_cdev == &zcrypt_cdev) { | 522 | if (filp->f_inode->i_cdev == &zcrypt_cdev) { |
| 523 | struct zcdn_device *zcdndev; | 523 | struct zcdn_device *zcdndev; |
| 524 | 524 | ||
| 525 | if (mutex_lock_interruptible(&ap_perms_mutex)) | 525 | mutex_lock(&ap_perms_mutex); |
| 526 | return -ERESTARTSYS; | ||
| 527 | zcdndev = find_zcdndev_by_devt(filp->f_inode->i_rdev); | 526 | zcdndev = find_zcdndev_by_devt(filp->f_inode->i_rdev); |
| 528 | mutex_unlock(&ap_perms_mutex); | 527 | mutex_unlock(&ap_perms_mutex); |
| 529 | if (zcdndev) { | 528 | if (zcdndev) { |