Path: blob/main/contrib/elftoolchain/libpe/pe_coff.c
39478 views
/*-1* Copyright (c) 2015 Kai Wang2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12*13* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23* SUCH DAMAGE.24*/2526#include <errno.h>27#include <stdlib.h>28#include <string.h>2930#include "_libpe.h"3132ELFTC_VCSID("$Id: pe_coff.c 3312 2016-01-10 09:23:51Z kaiwang27 $");3334PE_CoffHdr *35pe_coff_header(PE *pe)36{3738if (pe->pe_ch == NULL) {39errno = ENOENT;40return (NULL);41}4243return (pe->pe_ch);44}4546PE_OptHdr *47pe_opt_header(PE *pe)48{4950if (pe->pe_oh == NULL) {51errno = ENOENT;52return (NULL);53}5455return (pe->pe_oh);56}5758PE_DataDir *59pe_data_dir(PE *pe)60{6162if (pe->pe_dd == NULL) {63errno = ENOENT;64return (NULL);65}6667return (pe->pe_dd);68}6970int71pe_update_coff_header(PE *pe, PE_CoffHdr *ch)72{7374if (pe == NULL || ch == NULL) {75errno = EINVAL;76return (-1);77}7879if (pe->pe_cmd == PE_C_READ || pe->pe_flags & LIBPE_F_FD_DONE) {80errno = EACCES;81return (-1);82}8384if (pe->pe_ch == NULL) {85if ((pe->pe_ch = malloc(sizeof(PE_CoffHdr))) == NULL) {86errno = ENOMEM;87return (-1);88}89} else {90/* Rewrite optional header if `optsize' field changed. */91if (pe->pe_ch->ch_optsize != ch->ch_optsize)92pe->pe_flags |= LIBPE_F_DIRTY_OPT_HEADER;93}9495*pe->pe_ch = *ch;9697pe->pe_flags |= LIBPE_F_DIRTY_COFF_HEADER;9899return (0);100}101102int103pe_update_opt_header(PE *pe, PE_OptHdr *oh)104{105106if (pe == NULL || oh == NULL) {107errno = EINVAL;108return (-1);109}110111if (pe->pe_cmd == PE_C_READ || pe->pe_flags & LIBPE_F_FD_DONE) {112errno = EACCES;113return (-1);114}115116if (pe->pe_oh == NULL) {117if ((pe->pe_oh = malloc(sizeof(PE_OptHdr))) == NULL) {118errno = ENOMEM;119return (-1);120}121}122123*pe->pe_oh = *oh;124125pe->pe_flags |= LIBPE_F_DIRTY_OPT_HEADER;126127return (0);128}129130int131pe_update_data_dir(PE *pe, PE_DataDir *dd)132{133134if (pe == NULL || dd == NULL) {135errno = EINVAL;136return (-1);137}138139if (pe->pe_cmd == PE_C_READ || pe->pe_flags & LIBPE_F_FD_DONE) {140errno = EACCES;141return (-1);142}143144if (pe->pe_dd == NULL) {145if ((pe->pe_dd = malloc(sizeof(PE_DataDir))) == NULL) {146errno = ENOMEM;147return (-1);148}149}150151*pe->pe_dd = *dd;152153pe->pe_flags |= LIBPE_F_DIRTY_OPT_HEADER;154155return (0);156}157158159