/* BFD back-end for PDB Multi-Stream Format archives.
   Copyright (C) 2022 Free Software Foundation, Inc.

   This file is part of BFD, the Binary File Descriptor library.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

/* This describes the MSF file archive format, which is used for the
   PDB debug info generated by MSVC. See https://llvm.org/docs/PDB/MsfFile.html
   for a full description of the format.  */

#include "sysdep.h"
#include "bfd.h"
#include "libbfd.h"

/* "Microsoft C/C++ MSF 7.00\r\n\x1a\x44\x53\0\0\0" */
static const uint8_t pdb_magic[] =
{ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66,
  0x74, 0x20, 0x43, 0x2f, 0x43, 0x2b, 0x2b, 0x20,
  0x4d, 0x53, 0x46, 0x20, 0x37, 0x2e, 0x30, 0x30,
  0x0d, 0x0a, 0x1a, 0x44, 0x53, 0x00, 0x00, 0x00 };

#define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))

static bfd_cleanup
pdb_archive_p (bfd *abfd)
{
  int ret;
  char magic[sizeof (pdb_magic)];

  ret = bfd_bread (magic, sizeof (magic), abfd);
  if (ret != sizeof (magic))
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  if (memcmp (magic, pdb_magic, sizeof (magic)))
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  void *tdata = bfd_zalloc (abfd, sizeof (struct artdata));
  if (tdata == NULL)
    return NULL;
  bfd_ardata (abfd) = tdata;

  return _bfd_no_cleanup;
}

static bfd *
pdb_get_elt_at_index (bfd *abfd, symindex sym_index)
{
  char int_buf[sizeof (uint32_t)];
  uint32_t block_size, block_map_addr, block, num_files;
  uint32_t first_dir_block, dir_offset, file_size, block_off, left;
  char name[10];
  bfd *file;
  char *buf;

  /* Get block_size.  */

  if (bfd_seek (abfd, sizeof (pdb_magic), SEEK_SET))
    return NULL;

  if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    {
      bfd_set_error (bfd_error_malformed_archive);
      return NULL;
    }

  block_size = bfd_getl32 (int_buf);
  if ((block_size & -block_size) != block_size
      || block_size < 512
      || block_size > 4096)
    {
      bfd_set_error (bfd_error_malformed_archive);
      return NULL;
    }

  /* Get block_map_addr.  */

  if (bfd_seek (abfd, 4 * sizeof (uint32_t), SEEK_CUR))
    return NULL;

  if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    {
      bfd_set_error (bfd_error_malformed_archive);
      return NULL;
    }

  block_map_addr = bfd_getl32 (int_buf);

  /* Get num_files.  */

  if (bfd_seek (abfd, block_map_addr * block_size, SEEK_SET))
    return NULL;

  if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    {
      bfd_set_error (bfd_error_malformed_archive);
      return NULL;
    }

  first_dir_block = bfd_getl32 (int_buf);

  if (bfd_seek (abfd, first_dir_block * block_size, SEEK_SET))
    return NULL;

  if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    {
      bfd_set_error (bfd_error_malformed_archive);
      return NULL;
    }

  num_files = bfd_getl32 (int_buf);

  if (sym_index >= num_files)
    {
      bfd_set_error (bfd_error_no_more_archived_files);
      return NULL;
    }

  /* Read file size.  */

  dir_offset = sizeof (uint32_t) * (sym_index + 1);

  if (dir_offset >= block_size)
    {
      uint32_t block_map_addr_off;

      block_map_addr_off = ((dir_offset / block_size) * sizeof (uint32_t));

      if (bfd_seek (abfd, (block_map_addr * block_size) + block_map_addr_off,
		    SEEK_SET))
	return NULL;

      if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
	{
	  bfd_set_error (bfd_error_malformed_archive);
	  return NULL;
	}

      block = bfd_getl32 (int_buf);
    }
  else
    {
      block = first_dir_block;
    }

  if (bfd_seek (abfd, (block * block_size) + (dir_offset % block_size),
		SEEK_SET))
    return NULL;

  if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    {
      bfd_set_error (bfd_error_malformed_archive);
      return NULL;
    }

  file_size = bfd_getl32 (int_buf);

  /* Undocumented? Seen on PDBs created by MSVC 2022.  */
  if (file_size == 0xffffffff)
    file_size = 0;

  /* Create BFD. */

  /* Four hex digits is enough - even though MSF allows for 32 bits, the
     PDB format itself only uses 16 bits for stream numbers.  */
  sprintf (name, "%04lx", sym_index);

  file = bfd_create (name, abfd);

  if (!file)
    return NULL;

  if (!bfd_make_writable (file))
    goto fail;

  file->arelt_data =
    (struct areltdata *) bfd_zmalloc (sizeof (struct areltdata));

  if (!file->arelt_data)
    goto fail;

  arch_eltdata (file)->parsed_size = file_size;
  arch_eltdata (file)->key = sym_index;

  if (file_size == 0)
    return file;

  block_off = 0;

  /* Sum number of blocks in previous files.  */

  if (sym_index != 0)
    {
      dir_offset = sizeof (uint32_t);

      if (bfd_seek (abfd, (first_dir_block * block_size) + sizeof (uint32_t),
		    SEEK_SET))
	goto fail;

      for (symindex i = 0; i < sym_index; i++)
	{
	  uint32_t size, num_blocks;

	  if ((dir_offset % block_size) == 0)
	    {
	      uint32_t block_map_addr_off;

	      block_map_addr_off =
		((dir_offset / block_size) * sizeof (uint32_t));

	      if (bfd_seek
		  (abfd, (block_map_addr * block_size) + block_map_addr_off,
		   SEEK_SET))
		goto fail;

	      if (bfd_bread (int_buf, sizeof (uint32_t), abfd) !=
		  sizeof (uint32_t))
		{
		  bfd_set_error (bfd_error_malformed_archive);
		  goto fail;
		}

	      block = bfd_getl32 (int_buf);

	      if (bfd_seek (abfd, block * block_size, SEEK_SET))
		goto fail;
	    }

	  if (bfd_bread (int_buf, sizeof (uint32_t), abfd) !=
	      sizeof (uint32_t))
	    {
	      bfd_set_error (bfd_error_malformed_archive);
	      goto fail;
	    }

	  size = bfd_getl32 (int_buf);

	  if (size == 0xffffffff)
	    size = 0;

	  num_blocks = (size + block_size - 1) / block_size;
	  block_off += num_blocks;

	  dir_offset += sizeof (uint32_t);
	}
    }

  /* Read blocks, and write into new BFD.  */

  dir_offset = sizeof (uint32_t) * (num_files + block_off + 1);

  if (dir_offset >= block_size)
    {
      uint32_t block_map_addr_off;

      block_map_addr_off = ((dir_offset / block_size) * sizeof (uint32_t));

      if (bfd_seek (abfd, (block_map_addr * block_size) + block_map_addr_off,
		    SEEK_SET))
	goto fail;

      if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
	{
	  bfd_set_error (bfd_error_malformed_archive);
	  goto fail;
	}

      block = bfd_getl32 (int_buf);
    }
  else
    {
      block = first_dir_block;
    }

  buf = bfd_malloc (block_size);
  if (!buf)
    goto fail;

  left = file_size;
  do
    {
      uint32_t file_block, to_read;

      if ((dir_offset % block_size) == 0 && left != file_size)
	{
	  uint32_t block_map_addr_off;

	  block_map_addr_off =
	    ((dir_offset / block_size) * sizeof (uint32_t));

	  if (bfd_seek
	      (abfd, (block_map_addr * block_size) + block_map_addr_off,
	       SEEK_SET))
	    goto fail2;

	  if (bfd_bread (int_buf, sizeof (uint32_t), abfd) !=
	      sizeof (uint32_t))
	    {
	      bfd_set_error (bfd_error_malformed_archive);
	      goto fail2;
	    }

	  block = bfd_getl32 (int_buf);
	}

      if (bfd_seek (abfd, (block * block_size) + (dir_offset % block_size),
		    SEEK_SET))
	goto fail2;

      if (bfd_bread (int_buf, sizeof (uint32_t), abfd) != sizeof (uint32_t))
	{
	  bfd_set_error (bfd_error_malformed_archive);
	  goto fail2;
	}

      file_block = bfd_getl32 (int_buf);

      if (bfd_seek (abfd, file_block * block_size, SEEK_SET))
	goto fail2;

      to_read = left > block_size ? block_size : left;

      if (bfd_bread (buf, to_read, abfd) != to_read)
	{
	  bfd_set_error (bfd_error_malformed_archive);
	  goto fail2;
	}

      if (bfd_bwrite (buf, to_read, file) != to_read)
	goto fail2;

      if (left > block_size)
	left -= block_size;
      else
	break;

      dir_offset += sizeof (uint32_t);
    }
  while (left > 0);

  free (buf);

  return file;

fail2:
  free (buf);

fail:
  bfd_close (file);
  return NULL;
}

static bfd *
pdb_openr_next_archived_file (bfd *archive, bfd *last_file)
{
  if (!last_file)
    return pdb_get_elt_at_index (archive, 0);
  else
    return pdb_get_elt_at_index (archive, arch_eltdata (last_file)->key + 1);
}

static int
pdb_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
{
  buf->st_mtime = 0;
  buf->st_uid = 0;
  buf->st_gid = 0;
  buf->st_mode = 0644;
  buf->st_size = arch_eltdata (abfd)->parsed_size;

  return 0;
}

static uint32_t
pdb_allocate_block (uint32_t *num_blocks, uint32_t block_size)
{
  uint32_t block;

  block = *num_blocks;

  (*num_blocks)++;

  /* If new interval, skip two blocks for free space map.  */

  if ((block % block_size) == 1)
    {
      block += 2;
      (*num_blocks) += 2;
    }

  return block;
}

static bool
pdb_write_directory (bfd *abfd, uint32_t block_size, uint32_t num_files,
		     uint32_t block_map_addr, uint32_t * num_blocks)
{
  char tmp[sizeof (uint32_t)];
  uint32_t block, left, block_map_off;
  bfd *arelt;
  char *buf;

  /* Allocate first block for directory.  */

  block = pdb_allocate_block (num_blocks, block_size);
  left = block_size;

  /* Write allocated block no. at beginning of block map.  */

  if (bfd_seek (abfd, block_map_addr * block_size, SEEK_SET))
    return false;

  bfd_putl32 (block, tmp);

  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    return false;

  block_map_off = sizeof (uint32_t);

  /* Write num_files at beginning of directory.  */

  if (bfd_seek (abfd, block * block_size, SEEK_SET))
    return false;

  bfd_putl32 (num_files, tmp);

  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    return false;

  left -= sizeof (uint32_t);

  /* Write file sizes.  */

  arelt = abfd->archive_head;
  while (arelt)
    {
      if (left == 0)
	{
	  if (block_map_off == block_size) /* Too many blocks.  */
	    {
	      bfd_set_error (bfd_error_invalid_operation);
	      return false;
	    }

	  block = pdb_allocate_block (num_blocks, block_size);
	  left = block_size;

	  if (bfd_seek
	      (abfd, (block_map_addr * block_size) + block_map_off, SEEK_SET))
	    return false;

	  bfd_putl32 (block, tmp);

	  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
	    return false;

	  block_map_off += sizeof (uint32_t);

	  if (bfd_seek (abfd, block * block_size, SEEK_SET))
	    return false;
	}

      bfd_putl32 (bfd_get_size (arelt), tmp);

      if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
	return false;

      left -= sizeof (uint32_t);

      arelt = arelt->archive_next;
    }

  /* Write blocks.  */

  buf = bfd_malloc (block_size);
  if (!buf)
    return false;

  arelt = abfd->archive_head;
  while (arelt)
    {
      ufile_ptr size = bfd_get_size (arelt);
      uint32_t req_blocks = (size + block_size - 1) / block_size;

      if (bfd_seek (arelt, 0, SEEK_SET))
	{
	  free (buf);
	  return false;
	}

      for (uint32_t i = 0; i < req_blocks; i++)
	{
	  uint32_t file_block, to_read;

	  if (left == 0)
	    {
	      if (block_map_off == block_size) /* Too many blocks.  */
		{
		  bfd_set_error (bfd_error_invalid_operation);
		  free (buf);
		  return false;
		}

	      block = pdb_allocate_block (num_blocks, block_size);
	      left = block_size;

	      if (bfd_seek
		  (abfd, (block_map_addr * block_size) + block_map_off,
		   SEEK_SET))
		{
		  free (buf);
		  return false;
		}

	      bfd_putl32 (block, tmp);

	      if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) !=
		  sizeof (uint32_t))
		{
		  free (buf);
		  return false;
		}

	      block_map_off += sizeof (uint32_t);

	      if (bfd_seek (abfd, block * block_size, SEEK_SET))
		{
		  free (buf);
		  return false;
		}
	    }

	  /* Allocate block and write number into directory.  */

	  file_block = pdb_allocate_block (num_blocks, block_size);

	  bfd_putl32 (file_block, tmp);

	  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
	    {
	      free (buf);
	      return false;
	    }

	  left -= sizeof (uint32_t);

	  /* Read file contents into buffer.  */

	  to_read = size > block_size ? block_size : size;

	  if (bfd_bread (buf, to_read, arelt) != to_read)
	    {
	      free (buf);
	      return false;
	    }

	  size -= to_read;

	  if (to_read < block_size)
	    memset (buf + to_read, 0, block_size - to_read);

	  if (bfd_seek (abfd, file_block * block_size, SEEK_SET))
	    {
	      free (buf);
	      return false;
	    }

	  /* Write file contents into allocated block.  */

	  if (bfd_bwrite (buf, block_size, abfd) != block_size)
	    {
	      free (buf);
	      return false;
	    }

	  if (bfd_seek
	      (abfd, (block * block_size) + block_size - left, SEEK_SET))
	    {
	      free (buf);
	      return false;
	    }
	}

      arelt = arelt->archive_next;
    }

  memset (buf, 0, left);

  if (bfd_bwrite (buf, left, abfd) != left)
    {
      free (buf);
      return false;
    }

  free (buf);

  return true;
}

static bool
pdb_write_bitmap (bfd *abfd, uint32_t block_size, uint32_t num_blocks)
{
  char *buf;
  uint32_t num_intervals = (num_blocks + block_size - 1) / block_size;

  buf = bfd_malloc (block_size);
  if (!buf)
    return false;

  num_blocks--;			/* Superblock not included.  */

  for (uint32_t i = 0; i < num_intervals; i++)
    {
      if (bfd_seek (abfd, ((i * block_size) + 1) * block_size, SEEK_SET))
	{
	  free (buf);
	  return false;
	}

      /* All of our blocks are contiguous, making our free block map simple.
         0 = used, 1 = free.  */

      if (num_blocks >= 8)
	memset (buf, 0,
		(num_blocks / 8) >
		block_size ? block_size : (num_blocks / 8));

      if (num_blocks < block_size * 8)
	{
	  unsigned int off = num_blocks / 8;

	  if (num_blocks % 8)
	    {
	      buf[off] = (1 << (8 - (num_blocks % 8))) - 1;
	      off++;
	    }

	  if (off < block_size)
	    memset (buf + off, 0xff, block_size - off);
	}

      if (num_blocks < block_size * 8)
	num_blocks = 0;
      else
	num_blocks -= block_size * 8;

      if (bfd_bwrite (buf, block_size, abfd) != block_size)
	return false;
    }

  free (buf);

  return true;
}

static bool
pdb_write_contents (bfd *abfd)
{
  char tmp[sizeof (uint32_t)];
  const uint32_t block_size = 0x400;
  uint32_t block_map_addr;
  uint32_t num_blocks;
  uint32_t num_files = 0;
  uint32_t num_directory_bytes = sizeof (uint32_t);
  bfd *arelt;

  if (bfd_bwrite (pdb_magic, sizeof (pdb_magic), abfd) != sizeof (pdb_magic))
    return false;

  bfd_putl32 (block_size, tmp);

  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    return false;

  bfd_putl32 (1, tmp); /* Free block map block (always either 1 or 2).  */

  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    return false;

  arelt = abfd->archive_head;

  while (arelt)
    {
      uint32_t blocks_required =
	(bfd_get_size (arelt) + block_size - 1) / block_size;

      num_directory_bytes += sizeof (uint32_t); /* Size.  */
      num_directory_bytes += blocks_required * sizeof (uint32_t); /* Blocks.  */

      num_files++;

      arelt = arelt->archive_next;
    }

  /* Superblock plus two bitmap blocks.  */
  num_blocks = 3;

  /* Skip num_blocks for now.  */
  if (bfd_seek (abfd, sizeof (uint32_t), SEEK_CUR))
    return false;

  bfd_putl32 (num_directory_bytes, tmp);

  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    return false;

  /* Skip unknown uint32_t (always 0?).  */
  if (bfd_seek (abfd, sizeof (uint32_t), SEEK_CUR))
    return false;

  block_map_addr = pdb_allocate_block (&num_blocks, block_size);

  bfd_putl32 (block_map_addr, tmp);

  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    return false;

  if (!pdb_write_directory
      (abfd, block_size, num_files, block_map_addr, &num_blocks))
    return false;

  if (!pdb_write_bitmap (abfd, block_size, num_blocks))
    return false;

  /* Write num_blocks now we know it.  */

  if (bfd_seek
      (abfd, sizeof (pdb_magic) + sizeof (uint32_t) + sizeof (uint32_t),
       SEEK_SET))
    return false;

  bfd_putl32 (num_blocks, tmp);

  if (bfd_bwrite (tmp, sizeof (uint32_t), abfd) != sizeof (uint32_t))
    return false;

  return true;
}

#define pdb_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
#define pdb_new_section_hook _bfd_generic_new_section_hook
#define pdb_get_section_contents _bfd_generic_get_section_contents
#define pdb_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
#define pdb_close_and_cleanup _bfd_generic_close_and_cleanup

#define pdb_slurp_armap _bfd_noarchive_slurp_armap
#define pdb_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
#define pdb_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
#define pdb_truncate_arname _bfd_noarchive_truncate_arname
#define pdb_write_armap _bfd_noarchive_write_armap
#define pdb_read_ar_hdr _bfd_noarchive_read_ar_hdr
#define pdb_write_ar_hdr _bfd_noarchive_write_ar_hdr
#define pdb_update_armap_timestamp _bfd_noarchive_update_armap_timestamp

const bfd_target pdb_vec =
{
  "pdb",
  bfd_target_unknown_flavour,
  BFD_ENDIAN_LITTLE,		/* target byte order */
  BFD_ENDIAN_LITTLE,		/* target headers byte order */
  0,				/* object flags */
  0,				/* section flags */
  0,				/* leading underscore */
  ' ',				/* ar_pad_char */
  16,				/* ar_max_namelen */
  0,				/* match priority.  */
  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
  bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
  bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs.  */

  {				/* bfd_check_format */
    _bfd_dummy_target,
    _bfd_dummy_target,
    pdb_archive_p,
    _bfd_dummy_target
  },
  {				/* bfd_set_format */
    _bfd_bool_bfd_false_error,
    _bfd_bool_bfd_false_error,
    _bfd_bool_bfd_true,
    _bfd_bool_bfd_false_error
  },
  {				/* bfd_write_contents */
    _bfd_bool_bfd_true,
    _bfd_bool_bfd_false_error,
    pdb_write_contents,
    _bfd_bool_bfd_false_error
  },

  BFD_JUMP_TABLE_GENERIC (pdb),
  BFD_JUMP_TABLE_COPY (_bfd_generic),
  BFD_JUMP_TABLE_CORE (_bfd_nocore),
  BFD_JUMP_TABLE_ARCHIVE (pdb),
  BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
  BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
  BFD_JUMP_TABLE_WRITE (_bfd_generic),
  BFD_JUMP_TABLE_LINK (_bfd_nolink),
  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),

  NULL,

  NULL
};
