[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] xen/build-id: Drop xen_build_id_check()



The function is misnamed; it really is looking for a GNU Build ID note, not a
Xen note as the name suggests.

It also has an awkward API to use.  For a GNU Build ID, the content is always
at +16 from the start, so really doesn't need to be returned by pointer, nor
is it necessary be doing additional checks on the returned pointers being
valid.

Switching to is_gnu_build_id() allows xen_build_init() to be simplified,
returning after the first successful find rather than passing an rc down the
function to skip later checks.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
CC: Anthony PERARD <anthony.perard@xxxxxxxxxx>
CC: Michal Orzel <michal.orzel@xxxxxxx>
CC: Jan Beulich <jbeulich@xxxxxxxx>
CC: Julien Grall <julien@xxxxxxx>
CC: Roger Pau Monné <roger@xxxxxxxxxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>

The 16 probably ought to be a define somewhere, but I see no obvious
candidates in the ELF spec.
---
 xen/common/livepatch.c    | 13 +++++--------
 xen/common/version.c      | 41 +++++++--------------------------------
 xen/include/xen/version.h |  2 --
 3 files changed, 12 insertions(+), 44 deletions(-)

diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
index 7515a040ad46..9960db589b76 100644
--- a/xen/common/livepatch.c
+++ b/xen/common/livepatch.c
@@ -453,22 +453,19 @@ static int parse_buildid(const struct livepatch_elf_sec 
*sec,
                          struct livepatch_build_id *id)
 {
     const Elf_Note *n;
-    int rc;
+    unsigned int len;
 
     /* Presence of the sections is ensured by check_special_sections(). */
     ASSERT(sec);
 
     n = sec->addr;
+    len = sec->sec->sh_size;
 
-    if ( sec->sec->sh_size <= sizeof(*n) )
+    if ( !is_gnu_build_id(n, len) )
         return -EINVAL;
 
-    rc = xen_build_id_check(n, sec->sec->sh_size, &id->p, &id->len);
-    if ( rc )
-        return rc;
-
-    if ( !id->len || !id->p )
-        return -EINVAL;
+    id->p   = n   + NT_GNU_HDR_SIZE;
+    id->len = len - NT_GNU_HDR_SIZE;
 
    return 0;
 }
diff --git a/xen/common/version.c b/xen/common/version.c
index 7eb8a0221d82..63a5261a2279 100644
--- a/xen/common/version.c
+++ b/xen/common/version.c
@@ -145,36 +145,6 @@ bool is_gnu_build_id(const Elf_Note *n, unsigned int len)
     return true;
 }
 
-int xen_build_id_check(const Elf_Note *n, unsigned int n_sz,
-                       const void **p, unsigned int *len)
-{
-    /* Check if we really have a build-id. */
-    ASSERT(n_sz > sizeof(*n));
-
-    if ( NT_GNU_BUILD_ID != n->type )
-        return -ENODATA;
-
-    if ( n->namesz + n->descsz < n->namesz )
-        return -EINVAL;
-
-    if ( n->namesz < 4 /* GNU\0 */)
-        return -EINVAL;
-
-    if ( n->namesz + n->descsz > n_sz - sizeof(*n) )
-        return -EINVAL;
-
-    /* Sanity check, name should be "GNU" for ld-generated build-id. */
-    if ( strncmp(ELFNOTE_NAME(n), "GNU", n->namesz) != 0 )
-        return -ENODATA;
-
-    if ( len )
-        *len = n->descsz;
-    if ( p )
-        *p = ELFNOTE_DESC(n);
-
-    return 0;
-}
-
 struct pe_external_debug_directory
 {
     uint32_t characteristics;
@@ -201,7 +171,6 @@ void __init xen_build_init(void)
 {
     const Elf_Note *n = __note_gnu_build_id_start;
     unsigned int sz;
-    int rc;
 
     /* --build-id invoked with wrong parameters. */
     if ( __note_gnu_build_id_end <= &n[0] )
@@ -213,14 +182,18 @@ void __init xen_build_init(void)
 
     sz = (uintptr_t)__note_gnu_build_id_end - (uintptr_t)n;
 
-    rc = xen_build_id_check(n, sz, &xen_build_id, &xen_build_id_len);
+    if ( is_gnu_build_id(n, sz) )
+    {
+        xen_build_id     = n  + NT_GNU_HDR_SIZE;
+        xen_build_id_len = sz - NT_GNU_HDR_SIZE;
+        return;
+    }
 
 #ifdef CONFIG_X86
     /*
      * xen.efi built with a new enough toolchain will have a CodeView record,
      * not an ELF note.
      */
-    if ( rc )
     {
         const struct pe_external_debug_directory *dir = (const void *)n;
 
@@ -241,7 +214,7 @@ void __init xen_build_init(void)
             {
                 xen_build_id = info->signature;
                 xen_build_id_len = sizeof(info->signature);
-                rc = 0;
+                return;
             }
         }
     }
diff --git a/xen/include/xen/version.h b/xen/include/xen/version.h
index ee857616f9e4..6e9a24b7fadf 100644
--- a/xen/include/xen/version.h
+++ b/xen/include/xen/version.h
@@ -25,8 +25,6 @@ extern unsigned int xen_build_id_len; /* 0 -> No build id. */
 
 #ifdef BUILD_ID
 void xen_build_init(void);
-int xen_build_id_check(const Elf_Note *n, unsigned int n_sz,
-                       const void **p, unsigned int *len);
 bool is_gnu_build_id(const Elf_Note *n, unsigned int len);
 #else
 static inline void xen_build_init(void) {};
-- 
2.39.5




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.