diff options
author | Patrick Williams <patrick@stwcx.xyz> | 2016-08-17 14:31:25 -0500 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2016-08-22 16:43:26 +0000 |
commit | 60f9d69e016b11c468c98ea75ba0a60c44afbbc4 (patch) | |
tree | ecb49581a9e41a37943c22cd9ef3f63451b20ee7 /import-layers/yocto-poky/meta/recipes-devtools/rpm/rpm/debugedit-segv.patch | |
parent | e18c61205e0234b03697129c20cc69c9b3940efc (diff) | |
download | blackbird-openbmc-60f9d69e016b11c468c98ea75ba0a60c44afbbc4.tar.gz blackbird-openbmc-60f9d69e016b11c468c98ea75ba0a60c44afbbc4.zip |
yocto-poky: Move to import-layers subdir
We are going to import additional layers, so create a subdir to
hold all of the layers that we import with git-subtree.
Change-Id: I6f732153a22be8ca663035c518837e3cc5ec0799
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Diffstat (limited to 'import-layers/yocto-poky/meta/recipes-devtools/rpm/rpm/debugedit-segv.patch')
-rw-r--r-- | import-layers/yocto-poky/meta/recipes-devtools/rpm/rpm/debugedit-segv.patch | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/import-layers/yocto-poky/meta/recipes-devtools/rpm/rpm/debugedit-segv.patch b/import-layers/yocto-poky/meta/recipes-devtools/rpm/rpm/debugedit-segv.patch new file mode 100644 index 000000000..c83c8b5f3 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-devtools/rpm/rpm/debugedit-segv.patch @@ -0,0 +1,100 @@ +During the recalculation of the buildid, it's necessary to change the word +back to the original endian. However, if we do this in-place, we've also +affected the headers that we're also working on. The side effect of this is +we can no longer rely on 'sh_type' as it may have been changed. + +This patch ensures that any time we translate the loaded data to the machine +format, we only do it in a backup copy and never the original copy. + +Note: in all other places a backup copy was used, just not buildid processing. + +Also the process (...) function was modified to verify the data is not +NULL as well. This is an extra check and is not strictly necessary. + +Upstream-Status: Submitted [RPM5 maintainer] + +Signed-off-by: Mark Hatle <mark.hatle@windriver.com> + +Index: rpm/tools/debugedit.c +=================================================================== +--- rpm.orig/tools/debugedit.c ++++ rpm/tools/debugedit.c +@@ -1403,7 +1403,8 @@ static inline void process (hashFunction + const void *data, size_t size) + { + memchunk chunk = { .data = (void *) data, .size = size }; +- hashFunctionContextUpdateMC (ctx, &chunk); ++ if (data != NULL && size != 0) ++ hashFunctionContextUpdateMC (ctx, &chunk); + } + + /* Compute a fresh build ID bit-string from the editted file contents. */ +@@ -1456,14 +1457,16 @@ handle_build_id (DSO *dso, Elf_Data *bui + GElf_Ehdr ehdr; + GElf_Phdr phdr; + GElf_Shdr shdr; +- } u; +- Elf_Data x = { .d_version = EV_CURRENT, .d_buf = &u }; +- +- x.d_type = ELF_T_EHDR; +- x.d_size = sizeof u.ehdr; +- u.ehdr = dso->ehdr; +- u.ehdr.e_phoff = u.ehdr.e_shoff = 0; +- if (elf64_xlatetom (&x, &x, dso->ehdr.e_ident[EI_DATA]) == NULL) ++ } u1, u2; ++ Elf_Data src = { .d_version = EV_CURRENT, .d_buf = &u1 }; ++ Elf_Data dest = { .d_version = EV_CURRENT, .d_buf = &u2 }; ++ ++ src.d_type = ELF_T_EHDR; ++ src.d_size = sizeof u1.ehdr; ++ dest.d_size = sizeof u2.ehdr; ++ u1.ehdr = dso->ehdr; ++ u1.ehdr.e_phoff = u1.ehdr.e_shoff = 0; ++ if (elf64_xlatetom (&dest, &src, dso->ehdr.e_ident[EI_DATA]) == NULL) + { + bad: + fprintf (stderr, "Failed to compute header checksum: %s\n", +@@ -1471,29 +1474,31 @@ handle_build_id (DSO *dso, Elf_Data *bui + exit (1); + } + +- x.d_type = ELF_T_PHDR; +- x.d_size = sizeof u.phdr; ++ src.d_type = ELF_T_PHDR; ++ src.d_size = sizeof u1.phdr; ++ dest.d_size = sizeof u2.phdr; + for (i = 0; i < dso->ehdr.e_phnum; ++i) + { +- if (gelf_getphdr (dso->elf, i, &u.phdr) == NULL) ++ if (gelf_getphdr (dso->elf, i, &u1.phdr) == NULL) + goto bad; +- if (elf64_xlatetom (&x, &x, dso->ehdr.e_ident[EI_DATA]) == NULL) ++ if (elf64_xlatetom (&dest, &src, dso->ehdr.e_ident[EI_DATA]) == NULL) + goto bad; +- process (&ctx, x.d_buf, x.d_size); ++ process (&ctx, dest.d_buf, dest.d_size); + } + +- x.d_type = ELF_T_SHDR; +- x.d_size = sizeof u.shdr; ++ src.d_type = ELF_T_SHDR; ++ src.d_size = sizeof u1.shdr; ++ dest.d_size = sizeof u2.shdr; + for (i = 0; i < dso->ehdr.e_shnum; ++i) + if (dso->scn[i] != NULL) + { +- u.shdr = dso->shdr[i]; +- u.shdr.sh_offset = 0; +- if (elf64_xlatetom (&x, &x, dso->ehdr.e_ident[EI_DATA]) == NULL) ++ u1.shdr = dso->shdr[i]; ++ u1.shdr.sh_offset = 0; ++ if (elf64_xlatetom (&dest, &src, dso->ehdr.e_ident[EI_DATA]) == NULL) + goto bad; +- process (&ctx, x.d_buf, x.d_size); ++ process (&ctx, dest.d_buf, dest.d_size); + +- if (u.shdr.sh_type != SHT_NOBITS) ++ if (u1.shdr.sh_type != SHT_NOBITS) + { + Elf_Data *d = elf_rawdata (dso->scn[i], NULL); + if (d == NULL) |