| From 54a7151b1496cddbb7a83546b7998103e98edc88 Mon Sep 17 00:00:00 2001 |
| From: Fredrik Noring <noring@nocrew.org> |
| Date: Wed, 27 Mar 2019 19:12:50 +0100 |
| Subject: kbuild: modversions: Fix relative CRC byte order interpretation |
| |
| From: Fredrik Noring <noring@nocrew.org> |
| |
| commit 54a7151b1496cddbb7a83546b7998103e98edc88 upstream. |
| |
| Fix commit 56067812d5b0 ("kbuild: modversions: add infrastructure for |
| emitting relative CRCs") where CRCs are interpreted in host byte order |
| rather than proper kernel byte order. The bug is conditional on |
| CONFIG_MODULE_REL_CRCS. |
| |
| For example, when loading a BE module into a BE kernel compiled with a LE |
| system, the error "disagrees about version of symbol module_layout" is |
| produced. A message such as "Found checksum D7FA6856 vs module 5668FAD7" |
| will be given with debug enabled, which indicates an obvious endian |
| problem within __kcrctab within the kernel image. |
| |
| The general solution is to use the macro TO_NATIVE, as is done in |
| similar cases throughout modpost.c. With this correction it has been |
| verified that a BE kernel compiled with a LE system accepts BE modules. |
| |
| This change has also been verified with a LE kernel compiled with a LE |
| system, in which case TO_NATIVE returns its value unmodified since the |
| byte orders match. This is by far the common case. |
| |
| Fixes: 56067812d5b0 ("kbuild: modversions: add infrastructure for emitting relative CRCs") |
| Signed-off-by: Fredrik Noring <noring@nocrew.org> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| scripts/mod/modpost.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/scripts/mod/modpost.c |
| +++ b/scripts/mod/modpost.c |
| @@ -645,7 +645,7 @@ static void handle_modversions(struct mo |
| info->sechdrs[sym->st_shndx].sh_offset - |
| (info->hdr->e_type != ET_REL ? |
| info->sechdrs[sym->st_shndx].sh_addr : 0); |
| - crc = *crcp; |
| + crc = TO_NATIVE(*crcp); |
| } |
| sym_update_crc(symname + strlen(CRC_PFX), mod, crc, |
| export); |