Author: kaiw
Date: Wed Jul 21 13:18:57 2010
New Revision: 210351
URL: http://svn.freebsd.org/changeset/base/210351

Log:
  * Note that ar(1) archives may also be opened using `elf_memory(3)`.
  * Ignore the passed in value of the `fd` argument for ar(1) archives
    opened with elf_memory(3).
  
  Obtained from:        elftoolchain
  MFC after:            1 month

Modified:
  head/lib/libelf/elf_begin.3
  head/lib/libelf/elf_begin.c

Modified: head/lib/libelf/elf_begin.3
==============================================================================
--- head/lib/libelf/elf_begin.3 Wed Jul 21 13:01:21 2010        (r210350)
+++ head/lib/libelf/elf_begin.3 Wed Jul 21 13:18:57 2010        (r210351)
@@ -23,7 +23,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd June 21, 2006
+.Dd April 11, 2010
 .Dt ELF_BEGIN 3
 .Os
 .Sh NAME
@@ -163,7 +163,9 @@ archive may be opened in read mode (with
 set to
 .Dv ELF_C_READ )
 using
-.Fn elf_begin .
+.Fn elf_begin
+or
+.Fn elf_memory .
 The returned ELF descriptor can be passed into to
 subsequent calls to
 .Fn elf_begin

Modified: head/lib/libelf/elf_begin.c
==============================================================================
--- head/lib/libelf/elf_begin.c Wed Jul 21 13:01:21 2010        (r210350)
+++ head/lib/libelf/elf_begin.c Wed Jul 21 13:18:57 2010        (r210351)
@@ -131,13 +131,15 @@ elf_begin(int fd, Elf_Cmd c, Elf *a)
        case ELF_C_READ:
                /*
                 * Descriptor `a' could be for a regular ELF file, or
-                * for an ar(1) archive.
+                * for an ar(1) archive.  If descriptor `a' was opened
+                * using a valid file descriptor, we need to check if
+                * the passed in `fd' value matches the original one.
                 */
-               if (a && (a->e_fd != fd || c != a->e_cmd)) {
+               if (a &&
+                   ((a->e_fd != -1 && a->e_fd != fd) || c != a->e_cmd)) {
                        LIBELF_SET_ERROR(ARGUMENT, 0);
                        return (NULL);
                }
-
                break;
 
        default:
@@ -149,7 +151,7 @@ elf_begin(int fd, Elf_Cmd c, Elf *a)
        if (a == NULL)
                e = _libelf_open_object(fd, c);
        else if (a->e_kind == ELF_K_AR)
-               e = _libelf_ar_open_member(fd, c, a);
+               e = _libelf_ar_open_member(a->e_fd, c, a);
        else
                (e = a)->e_activations++;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to