You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
6.2 KiB
175 lines
6.2 KiB
From 83ec905922b496e1a5756e3a88405eb6c2c6ba88 Mon Sep 17 00:00:00 2001
|
|
From: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
Date: Fri, 14 Jun 2013 16:43:16 +0100
|
|
Subject: [PATCH 05/23] libelf: abolish elf_sval and elf_access_signed
|
|
|
|
These are not used anywhere.
|
|
|
|
This is part of the fix to a security issue, XSA-55.
|
|
|
|
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
|
---
|
|
xen/common/libelf/libelf-tools.c | 28 ----------------------------
|
|
xen/include/xen/libelf.h | 11 -----------
|
|
2 files changed, 0 insertions(+), 39 deletions(-)
|
|
|
|
diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c
|
|
index cb97908..2f54142 100644
|
|
--- a/xen/common/libelf/libelf-tools.c
|
|
+++ b/xen/common/libelf/libelf-tools.c
|
|
@@ -48,34 +48,6 @@ uint64_t elf_access_unsigned(struct elf_binary * elf, const void *ptr,
|
|
}
|
|
}
|
|
|
|
-int64_t elf_access_signed(struct elf_binary *elf, const void *ptr,
|
|
- uint64_t offset, size_t size)
|
|
-{
|
|
- int need_swap = elf_swap(elf);
|
|
- const int8_t *s8;
|
|
- const int16_t *s16;
|
|
- const int32_t *s32;
|
|
- const int64_t *s64;
|
|
-
|
|
- switch ( size )
|
|
- {
|
|
- case 1:
|
|
- s8 = ptr + offset;
|
|
- return *s8;
|
|
- case 2:
|
|
- s16 = ptr + offset;
|
|
- return need_swap ? bswap_16(*s16) : *s16;
|
|
- case 4:
|
|
- s32 = ptr + offset;
|
|
- return need_swap ? bswap_32(*s32) : *s32;
|
|
- case 8:
|
|
- s64 = ptr + offset;
|
|
- return need_swap ? bswap_64(*s64) : *s64;
|
|
- default:
|
|
- return 0;
|
|
- }
|
|
-}
|
|
-
|
|
uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr)
|
|
{
|
|
int elf_round = (elf_64bit(elf) ? 8 : 4) - 1;
|
|
diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h
|
|
index e8f6508..38e490c 100644
|
|
--- a/xen/include/xen/libelf.h
|
|
+++ b/xen/include/xen/libelf.h
|
|
@@ -136,23 +136,12 @@ struct elf_binary {
|
|
offsetof(typeof(*(str)),e32.elem), \
|
|
sizeof((str)->e32.elem)))
|
|
|
|
-#define elf_sval(elf, str, elem) \
|
|
- ((ELFCLASS64 == (elf)->class) \
|
|
- ? elf_access_signed((elf), (str), \
|
|
- offsetof(typeof(*(str)),e64.elem), \
|
|
- sizeof((str)->e64.elem)) \
|
|
- : elf_access_signed((elf), (str), \
|
|
- offsetof(typeof(*(str)),e32.elem), \
|
|
- sizeof((str)->e32.elem)))
|
|
-
|
|
#define elf_size(elf, str) \
|
|
((ELFCLASS64 == (elf)->class) \
|
|
? sizeof((str)->e64) : sizeof((str)->e32))
|
|
|
|
uint64_t elf_access_unsigned(struct elf_binary *elf, const void *ptr,
|
|
uint64_t offset, size_t size);
|
|
-int64_t elf_access_signed(struct elf_binary *elf, const void *ptr,
|
|
- uint64_t offset, size_t size);
|
|
|
|
uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr);
|
|
|
|
--
|
|
1.7.2.5
|
|
#From 682a04488e7b3bd6c3448ab60599566eb7c6177a Mon Sep 17 00:00:00 2001
|
|
#From: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
#Date: Fri, 14 Jun 2013 16:43:16 +0100
|
|
#Subject: [PATCH 06/23] libelf: move include of <asm/guest_access.h> to top of file
|
|
#
|
|
#libelf-loader.c #includes <asm/guest_access.h>, when being compiled
|
|
#for Xen. Currently it does this in the middle of the file.
|
|
#
|
|
#Move this #include to the top of the file, before libelf-private.h.
|
|
#This is necessary because in forthcoming patches we will introduce
|
|
#private #defines of memcpy etc. which would interfere with definitions
|
|
#in headers #included from guest_access.h.
|
|
#
|
|
#No semantic or functional change in this patch.
|
|
#
|
|
#This is part of the fix to a security issue, XSA-55.
|
|
#
|
|
#Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
#Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
|
#Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
#---
|
|
# xen/common/libelf/libelf-loader.c | 5 ++++-
|
|
# 1 files changed, 4 insertions(+), 1 deletions(-)
|
|
#
|
|
diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c
|
|
index 0559d88..ec0706b 100644
|
|
--- a/xen/common/libelf/libelf-loader.c
|
|
+++ b/xen/common/libelf/libelf-loader.c
|
|
@@ -16,6 +16,10 @@
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
+#ifdef __XEN__
|
|
+#include <asm/guest_access.h>
|
|
+#endif
|
|
+
|
|
#include "libelf-private.h"
|
|
|
|
/* ------------------------------------------------------------------------ */
|
|
@@ -116,7 +120,6 @@ static int elf_load_image(struct elf_binary *elf,
|
|
return 0;
|
|
}
|
|
#else
|
|
-#include <asm/guest_access.h>
|
|
|
|
void elf_set_verbose(struct elf_binary *elf)
|
|
{
|
|
--
|
|
1.7.2.5
|
|
#From de9089b449d2508b1ba05590905c7ebaee00c8c4 Mon Sep 17 00:00:00 2001
|
|
#From: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
#Date: Fri, 14 Jun 2013 16:43:16 +0100
|
|
#Subject: [PATCH 07/23] libelf/xc_dom_load_elf_symtab: Do not use "syms" uninitialised
|
|
#
|
|
#xc_dom_load_elf_symtab (with load==0) calls elf_round_up, but it
|
|
#mistakenly used the uninitialised variable "syms" when calculating
|
|
#dom->bsd_symtab_start. This should be a reference to "elf".
|
|
#
|
|
#This change might have the effect of rounding the value differently.
|
|
#Previously if the uninitialised value (a single byte on the stack) was
|
|
#ELFCLASS64 (ie, 2), the alignment would be to 8 bytes, otherwise to 4.
|
|
#
|
|
#However, the value is calculated from dom->kernel_seg.vend so this
|
|
#could only make a difference if that value wasn't already aligned to 8
|
|
#bytes.
|
|
#
|
|
#This is part of the fix to a security issue, XSA-55.
|
|
#
|
|
#Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
#Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
|
#---
|
|
# tools/libxc/xc_dom_elfloader.c | 2 +-
|
|
# 1 files changed, 1 insertions(+), 1 deletions(-)
|
|
#
|
|
diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
|
|
index 031b5b6..e82f6e9 100644
|
|
--- a/tools/libxc/xc_dom_elfloader.c
|
|
+++ b/tools/libxc/xc_dom_elfloader.c
|
|
@@ -144,7 +144,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom,
|
|
hdr = xc_dom_malloc(dom, size);
|
|
if ( hdr == NULL )
|
|
return 0;
|
|
- dom->bsd_symtab_start = elf_round_up(&syms, dom->kernel_seg.vend);
|
|
+ dom->bsd_symtab_start = elf_round_up(elf, dom->kernel_seg.vend);
|
|
}
|
|
|
|
memcpy(hdr + sizeof(int),
|
|
--
|
|
1.7.2.5
|