1 /* Return block represented by attribute. 2 Copyright (C) 2004 Red Hat, Inc. 3 Written by Ulrich Drepper <drepper (at) redhat.com>, 2004. 4 5 This program is Open Source software; you can redistribute it and/or 6 modify it under the terms of the Open Software License version 1.0 as 7 published by the Open Source Initiative. 8 9 You should have received a copy of the Open Software License along 10 with this program; if not, you may obtain a copy of the Open Software 11 License version 1.0 from http://www.opensource.org/licenses/osl.php or 12 by writing the Open Source Initiative c/o Lawrence Rosen, Esq., 13 3001 King Ranch Road, Ukiah, CA 95482. */ 14 15 #ifdef HAVE_CONFIG_H 16 # include <config.h> 17 #endif 18 19 #include <dwarf.h> 20 #include "libdwP.h" 21 22 23 int 24 dwarf_formblock (attr, return_block) 25 Dwarf_Attribute *attr; 26 Dwarf_Block *return_block; 27 { 28 if (attr == NULL) 29 return -1; 30 31 unsigned int u128; 32 unsigned char *datap; 33 34 switch (attr->form) 35 { 36 case DW_FORM_block1: 37 return_block->length = *(uint8_t *) attr->valp; 38 return_block->data = attr->valp + 1; 39 break; 40 41 case DW_FORM_block2: 42 return_block->length = read_2ubyte_unaligned (attr->cu->dbg, attr->valp); 43 return_block->data = attr->valp + 2; 44 break; 45 46 case DW_FORM_block4: 47 return_block->length = read_4ubyte_unaligned (attr->cu->dbg, attr->valp); 48 return_block->data = attr->valp + 4; 49 break; 50 51 case DW_FORM_block: 52 datap = attr->valp; 53 get_uleb128 (u128, datap); 54 return_block->length = u128; 55 return_block->data = datap; 56 break; 57 58 default: 59 __libdw_seterrno (DWARF_E_NO_BLOCK); 60 return -1; 61 } 62 63 if (return_block->data + return_block->length 64 > ((unsigned char *) attr->cu->dbg->sectiondata[IDX_debug_info]->d_buf 65 + attr->cu->dbg->sectiondata[IDX_debug_info]->d_size)) 66 { 67 /* Block does not fit. */ 68 __libdw_seterrno (DWARF_E_INVALID_DWARF); 69 return -1; 70 } 71 72 return 0; 73 } 74