[PATCH 1/1] bfd: fix potential missing seek

Alan Modra amodra@gmail.com
Sun Nov 30 03:28:17 GMT 2025


On Sat, Nov 29, 2025 at 12:45:27PM +0100, Roman Kapl wrote:
> If a file was closed by cache and then bfd_open_file was called followed
> by e.g. bfd_seek to the original position, the seek would be optimized out
> while the real file position was still zero (as fopened).  I added
> `bfd_io_force` to force the seek at next IO occasion.
> 
> This could led e.g. to appearence of a corrupted object in ld:
>   symbol number 0 uses unsupported binding of 6
>   or invalid string offset #X >= #Y for section
> 
> To reproduce in a real scenario, both large number of input archives and
> certain object layout is needed, so it seemed to be rare. To reproduce
> this better, 1) make sure to hit the cache limit (e.g lower it in code)
> 2) use some plugin (they do bfd_open_file) 3) from main pull in archives
> that have symbols like this:
>      5: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 C<int>::C()
>      6: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    2 C<float>::C()
>      7: 0000000000000000    39 FUNC    GLOBAL DEFAULT    3 export1()
> 
> The last read before cache close will be #6, after re-open it will try
> to read export symbols and fail.
> 
> Signed-off-by: Roman Kapl <code@rkapl.cz>

Thanks!  Applied.

> ---
>  bfd/cache.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/bfd/cache.c b/bfd/cache.c
> index 3bf9c944..3342e2d5 100644
> --- a/bfd/cache.c
> +++ b/bfd/cache.c
> @@ -177,6 +177,7 @@ bfd_cache_delete (bfd *abfd)
>    BFD_ASSERT (open_files > 0);
>    --open_files;
>    abfd->flags |= BFD_CLOSED_BY_CACHE;
> +  abfd->last_io = bfd_io_force;
>  
>    return ret;
>  }
> -- 
> 2.52.0

-- 
Alan Modra


More information about the Binutils mailing list