1*839529caSEd Maste /*- 2*839529caSEd Maste * Copyright (c) 2016 Kai Wang 3*839529caSEd Maste * All rights reserved. 4*839529caSEd Maste * 5*839529caSEd Maste * Redistribution and use in source and binary forms, with or without 6*839529caSEd Maste * modification, are permitted provided that the following conditions 7*839529caSEd Maste * are met: 8*839529caSEd Maste * 1. Redistributions of source code must retain the above copyright 9*839529caSEd Maste * notice, this list of conditions and the following disclaimer. 10*839529caSEd Maste * 2. Redistributions in binary form must reproduce the above copyright 11*839529caSEd Maste * notice, this list of conditions and the following disclaimer in the 12*839529caSEd Maste * documentation and/or other materials provided with the distribution. 13*839529caSEd Maste * 14*839529caSEd Maste * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*839529caSEd Maste * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*839529caSEd Maste * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*839529caSEd Maste * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*839529caSEd Maste * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*839529caSEd Maste * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*839529caSEd Maste * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*839529caSEd Maste * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*839529caSEd Maste * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*839529caSEd Maste * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*839529caSEd Maste * SUCH DAMAGE. 25*839529caSEd Maste */ 26*839529caSEd Maste 27*839529caSEd Maste #include <errno.h> 28*839529caSEd Maste 29*839529caSEd Maste #include "_libpe.h" 30*839529caSEd Maste 31*839529caSEd Maste ELFTC_VCSID("$Id: pe_symtab.c 3312 2016-01-10 09:23:51Z kaiwang27 $"); 32*839529caSEd Maste 33*839529caSEd Maste int 34*839529caSEd Maste pe_update_symtab(PE *pe, char *symtab, size_t sz, unsigned int nsym) 35*839529caSEd Maste { 36*839529caSEd Maste PE_Scn *ps; 37*839529caSEd Maste PE_SecBuf *sb; 38*839529caSEd Maste PE_SecHdr *sh; 39*839529caSEd Maste 40*839529caSEd Maste if (pe == NULL || symtab == NULL || sz == 0) { 41*839529caSEd Maste errno = EINVAL; 42*839529caSEd Maste return (-1); 43*839529caSEd Maste } 44*839529caSEd Maste 45*839529caSEd Maste if (pe->pe_cmd == PE_C_READ || pe->pe_flags & LIBPE_F_FD_DONE) { 46*839529caSEd Maste errno = EACCES; 47*839529caSEd Maste return (-1); 48*839529caSEd Maste } 49*839529caSEd Maste 50*839529caSEd Maste /* Remove the old symbol table. */ 51*839529caSEd Maste STAILQ_FOREACH(ps, &pe->pe_scn, ps_next) { 52*839529caSEd Maste if (ps->ps_ndx == 0xFFFFFFFFU) 53*839529caSEd Maste libpe_release_scn(ps); 54*839529caSEd Maste } 55*839529caSEd Maste 56*839529caSEd Maste /* 57*839529caSEd Maste * Insert the new symbol table. 58*839529caSEd Maste */ 59*839529caSEd Maste 60*839529caSEd Maste if ((ps = libpe_alloc_scn(pe)) == NULL) 61*839529caSEd Maste return (-1); 62*839529caSEd Maste 63*839529caSEd Maste STAILQ_INSERT_TAIL(&pe->pe_scn, ps, ps_next); 64*839529caSEd Maste ps->ps_ndx = 0xFFFFFFFFU; 65*839529caSEd Maste ps->ps_flags |= PE_F_DIRTY; 66*839529caSEd Maste 67*839529caSEd Maste /* 68*839529caSEd Maste * Set the symbol table section offset to the maximum to make sure 69*839529caSEd Maste * that it will be placed in the end of the file during section 70*839529caSEd Maste * layout. 71*839529caSEd Maste */ 72*839529caSEd Maste sh = &ps->ps_sh; 73*839529caSEd Maste sh->sh_rawptr = 0xFFFFFFFFU; 74*839529caSEd Maste sh->sh_rawsize = sz; 75*839529caSEd Maste 76*839529caSEd Maste /* Allocate the buffer. */ 77*839529caSEd Maste if ((sb = libpe_alloc_buffer(ps, 0)) == NULL) 78*839529caSEd Maste return (-1); 79*839529caSEd Maste sb->sb_flags |= PE_F_DIRTY; 80*839529caSEd Maste sb->sb_pb.pb_size = sz; 81*839529caSEd Maste sb->sb_pb.pb_buf = symtab; 82*839529caSEd Maste 83*839529caSEd Maste pe->pe_nsym = nsym; 84*839529caSEd Maste 85*839529caSEd Maste return (0); 86*839529caSEd Maste } 87