]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
elf: Use nocancel pread64() instead of lseek()+read()
authorLeandro Pereira <leandro.pereira@microsoft.com>
Wed, 2 Oct 2019 16:48:17 +0000 (12:48 -0400)
committerCarlos O'Donell <carlos@redhat.com>
Fri, 18 Oct 2019 19:55:33 +0000 (15:55 -0400)
Transforms this, when linking in a shared object:

  openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
  read(3, "\177ELF\2\1\1\3"..., 832) = 832
  lseek(3, 792, SEEK_SET)           = 792
  read(3, "\4\0\0\0\24\0\0\0"..., 68) = 68
  fstat(3, {st_mode=S_IFREG|0755, st_size=6699224, ...}) = 0
  lseek(3, 792, SEEK_SET)           = 792
  read(3, "\4\0\0\0\24\0\0\0"..., 68) = 68
  lseek(3, 864, SEEK_SET)           = 864
  read(3, "\4\0\0\0\20\0\0\0"..., 32) = 32

Into this:

  openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
  read(3, "\177ELF\2\1\1\3"..., 832) = 832
  pread(3, "\4\0\0\0\24\0\0\0"..., 68, 792) = 68
  fstat(3, {st_mode=S_IFREG|0755, st_size=6699224, ...}) = 0
  pread(3, "\4\0\0\0\24\0\0\0"..., 68, 792) = 68
  pread(3, "\4\0\0\0\20\0\0\0"..., 32, 864) = 32

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
elf/dl-load.c
sysdeps/x86/dl-prop.h

index 1ed7a7bbd6eb339f70a689d7033cd7a91124e42f..c1bc8c26be1229fafc2a03afd9fb27edbcf8c3a8 100644 (file)
@@ -1015,8 +1015,8 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
   else
     {
       phdr = alloca (maplength);
-      __lseek (fd, header->e_phoff, SEEK_SET);
-      if ((size_t) __read_nocancel (fd, (void *) phdr, maplength) != maplength)
+      if ((size_t) __pread64_nocancel (fd, (void *) phdr, maplength,
+                                      header->e_phoff) != maplength)
        {
          errstring = N_("cannot read file data");
          goto call_lose_errno;
@@ -1664,9 +1664,8 @@ open_verify (const char *name, int fd,
       else
        {
          phdr = alloca (maplength);
-         __lseek (fd, ehdr->e_phoff, SEEK_SET);
-         if ((size_t) __read_nocancel (fd, (void *) phdr, maplength)
-             != maplength)
+         if ((size_t) __pread64_nocancel (fd, (void *) phdr, maplength,
+                                          ehdr->e_phoff) != maplength)
            {
            read_error:
              errval = errno;
@@ -1704,8 +1703,8 @@ open_verify (const char *name, int fd,
 
                    abi_note = abi_note_malloced;
                  }
-               __lseek (fd, ph->p_offset, SEEK_SET);
-               if (__read_nocancel (fd, (void *) abi_note, size) != size)
+               if (__pread64_nocancel (fd, (void *) abi_note, size,
+                                       ph->p_offset) != size)
                  {
                    free (abi_note_malloced);
                    goto read_error;
index a99eec11b9848f2fcce67900841f32b5981b43ab..fa5bd988ca1a673480fe83ea0018339bfbbf683d 100644 (file)
@@ -167,8 +167,7 @@ _dl_process_pt_note (struct link_map *l, const ElfW(Phdr) *ph,
          note_malloced = malloc (size);
          note = note_malloced;
        }
-      __lseek (fd, ph->p_offset, SEEK_SET);
-      if (__read_nocancel (fd, (void *) note, size) != size)
+      if (__pread64_nocancel (fd, (void *) note, size, ph->p_offset) != size)
        {
          if (note_malloced)
            free (note_malloced);