<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Memory leak in FileArchive::find()"
   href="http://llvm.org/bugs/show_bug.cgi?id=21681">21681</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Memory leak in FileArchive::find()
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>lld
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>All Bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>devlists@shadowlab.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>In Resolver::handleArchiveFile(), there is a call to archiveFile->find() that
may end up calling FileArchive::find().

FileArchive::find() create a new File (enclosed in a unique_ptr) and then
return it by releasing ownership (comment before the return statement: "// give
up the pointer so that this object no longer manages it").

The problem is that find() is a virtual method and may or may not returns a
owned pointer. The caller (Resolver) has no way to know if it should delete the
pointer after use. In fact, other implementation of ArchiveLibraryFile returns
a owned-pointer that must not be freed by the find() caller.

I think a solution could be to add a FileVectorT to FileArchive to keep track
of all returned files, and delete them when the FileArchive is destroyed.

Anyway, we should clarify the ownership of the pointer returned by the
ArchiveLibraryFile::find() virtual method and make sure all subclasses conform
to that contract.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>