1 1.5 christos /* $NetBSD: libdwarf_rw.c,v 1.5 2024/03/03 17:37:32 christos Exp $ */ 2 1.2 christos 3 1.1 christos /*- 4 1.1 christos * Copyright (c) 2007 John Birrell (jb (at) freebsd.org) 5 1.1 christos * Copyright (c) 2010 Kai Wang 6 1.1 christos * All rights reserved. 7 1.1 christos * 8 1.1 christos * Redistribution and use in source and binary forms, with or without 9 1.1 christos * modification, are permitted provided that the following conditions 10 1.1 christos * are met: 11 1.1 christos * 1. Redistributions of source code must retain the above copyright 12 1.1 christos * notice, this list of conditions and the following disclaimer. 13 1.1 christos * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 christos * notice, this list of conditions and the following disclaimer in the 15 1.1 christos * documentation and/or other materials provided with the distribution. 16 1.1 christos * 17 1.1 christos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 1.1 christos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 1.1 christos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 1.1 christos * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 1.1 christos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 christos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 1.1 christos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 1.1 christos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 1.1 christos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 christos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 christos * SUCH DAMAGE. 28 1.1 christos */ 29 1.1 christos 30 1.1 christos #include "_libdwarf.h" 31 1.1 christos 32 1.5 christos __RCSID("$NetBSD: libdwarf_rw.c,v 1.5 2024/03/03 17:37:32 christos Exp $"); 33 1.5 christos ELFTC_VCSID("Id: libdwarf_rw.c 4007 2023-10-12 18:17:02Z kaiwang27"); 34 1.1 christos 35 1.1 christos uint64_t 36 1.1 christos _dwarf_read_lsb(uint8_t *data, uint64_t *offsetp, int bytes_to_read) 37 1.1 christos { 38 1.1 christos uint64_t ret; 39 1.1 christos uint8_t *src; 40 1.1 christos 41 1.1 christos src = data + *offsetp; 42 1.1 christos 43 1.1 christos ret = 0; 44 1.1 christos switch (bytes_to_read) { 45 1.1 christos case 8: 46 1.1 christos ret |= ((uint64_t) src[4]) << 32 | ((uint64_t) src[5]) << 40; 47 1.1 christos ret |= ((uint64_t) src[6]) << 48 | ((uint64_t) src[7]) << 56; 48 1.3 christos /* FALLTHROUGH */ 49 1.1 christos case 4: 50 1.5 christos ret |= ((uint64_t) src[3]) << 24; 51 1.5 christos /* FALLTHROUGH */ 52 1.5 christos case 3: 53 1.5 christos ret |= ((uint64_t) src[2]) << 16; 54 1.3 christos /* FALLTHROUGH */ 55 1.1 christos case 2: 56 1.1 christos ret |= ((uint64_t) src[1]) << 8; 57 1.3 christos /* FALLTHROUGH */ 58 1.1 christos case 1: 59 1.1 christos ret |= src[0]; 60 1.1 christos break; 61 1.1 christos default: 62 1.1 christos return (0); 63 1.1 christos } 64 1.1 christos 65 1.1 christos *offsetp += bytes_to_read; 66 1.1 christos 67 1.1 christos return (ret); 68 1.1 christos } 69 1.1 christos 70 1.1 christos uint64_t 71 1.1 christos _dwarf_decode_lsb(uint8_t **data, int bytes_to_read) 72 1.1 christos { 73 1.1 christos uint64_t ret; 74 1.1 christos uint8_t *src; 75 1.1 christos 76 1.1 christos src = *data; 77 1.1 christos 78 1.1 christos ret = 0; 79 1.1 christos switch (bytes_to_read) { 80 1.1 christos case 8: 81 1.1 christos ret |= ((uint64_t) src[4]) << 32 | ((uint64_t) src[5]) << 40; 82 1.1 christos ret |= ((uint64_t) src[6]) << 48 | ((uint64_t) src[7]) << 56; 83 1.3 christos /* FALLTHROUGH */ 84 1.1 christos case 4: 85 1.5 christos ret |= ((uint64_t) src[3]) << 24; 86 1.5 christos /* FALLTHROUGH */ 87 1.5 christos case 3: 88 1.5 christos ret |= ((uint64_t) src[2]) << 16; 89 1.3 christos /* FALLTHROUGH */ 90 1.1 christos case 2: 91 1.1 christos ret |= ((uint64_t) src[1]) << 8; 92 1.3 christos /* FALLTHROUGH */ 93 1.1 christos case 1: 94 1.1 christos ret |= src[0]; 95 1.1 christos break; 96 1.1 christos default: 97 1.1 christos return (0); 98 1.1 christos } 99 1.1 christos 100 1.1 christos *data += bytes_to_read; 101 1.1 christos 102 1.1 christos return (ret); 103 1.1 christos } 104 1.1 christos 105 1.1 christos uint64_t 106 1.1 christos _dwarf_read_msb(uint8_t *data, uint64_t *offsetp, int bytes_to_read) 107 1.1 christos { 108 1.1 christos uint64_t ret; 109 1.1 christos uint8_t *src; 110 1.1 christos 111 1.1 christos src = data + *offsetp; 112 1.1 christos 113 1.1 christos switch (bytes_to_read) { 114 1.1 christos case 1: 115 1.1 christos ret = src[0]; 116 1.1 christos break; 117 1.1 christos case 2: 118 1.1 christos ret = src[1] | ((uint64_t) src[0]) << 8; 119 1.1 christos break; 120 1.5 christos case 3: 121 1.5 christos ret = src[2] | ((uint64_t) src[1]) << 8; 122 1.5 christos ret |= ((uint64_t) src[0]) << 16; 123 1.5 christos break; 124 1.1 christos case 4: 125 1.1 christos ret = src[3] | ((uint64_t) src[2]) << 8; 126 1.1 christos ret |= ((uint64_t) src[1]) << 16 | ((uint64_t) src[0]) << 24; 127 1.1 christos break; 128 1.1 christos case 8: 129 1.1 christos ret = src[7] | ((uint64_t) src[6]) << 8; 130 1.1 christos ret |= ((uint64_t) src[5]) << 16 | ((uint64_t) src[4]) << 24; 131 1.1 christos ret |= ((uint64_t) src[3]) << 32 | ((uint64_t) src[2]) << 40; 132 1.1 christos ret |= ((uint64_t) src[1]) << 48 | ((uint64_t) src[0]) << 56; 133 1.1 christos break; 134 1.1 christos default: 135 1.1 christos return (0); 136 1.1 christos } 137 1.1 christos 138 1.1 christos *offsetp += bytes_to_read; 139 1.1 christos 140 1.1 christos return (ret); 141 1.1 christos } 142 1.1 christos 143 1.1 christos uint64_t 144 1.1 christos _dwarf_decode_msb(uint8_t **data, int bytes_to_read) 145 1.1 christos { 146 1.1 christos uint64_t ret; 147 1.1 christos uint8_t *src; 148 1.1 christos 149 1.1 christos src = *data; 150 1.1 christos 151 1.1 christos ret = 0; 152 1.1 christos switch (bytes_to_read) { 153 1.1 christos case 1: 154 1.1 christos ret = src[0]; 155 1.1 christos break; 156 1.1 christos case 2: 157 1.1 christos ret = src[1] | ((uint64_t) src[0]) << 8; 158 1.1 christos break; 159 1.5 christos case 3: 160 1.5 christos ret = src[2] | ((uint64_t) src[1]) << 8; 161 1.5 christos ret |= ((uint64_t) src[0]) << 16; 162 1.5 christos break; 163 1.1 christos case 4: 164 1.1 christos ret = src[3] | ((uint64_t) src[2]) << 8; 165 1.1 christos ret |= ((uint64_t) src[1]) << 16 | ((uint64_t) src[0]) << 24; 166 1.1 christos break; 167 1.1 christos case 8: 168 1.1 christos ret = src[7] | ((uint64_t) src[6]) << 8; 169 1.1 christos ret |= ((uint64_t) src[5]) << 16 | ((uint64_t) src[4]) << 24; 170 1.1 christos ret |= ((uint64_t) src[3]) << 32 | ((uint64_t) src[2]) << 40; 171 1.1 christos ret |= ((uint64_t) src[1]) << 48 | ((uint64_t) src[0]) << 56; 172 1.1 christos break; 173 1.1 christos default: 174 1.1 christos return (0); 175 1.1 christos } 176 1.1 christos 177 1.1 christos *data += bytes_to_read; 178 1.1 christos 179 1.1 christos return (ret); 180 1.1 christos } 181 1.1 christos 182 1.1 christos void 183 1.1 christos _dwarf_write_lsb(uint8_t *data, uint64_t *offsetp, uint64_t value, 184 1.1 christos int bytes_to_write) 185 1.1 christos { 186 1.1 christos uint8_t *dst; 187 1.1 christos 188 1.1 christos dst = data + *offsetp; 189 1.1 christos 190 1.1 christos switch (bytes_to_write) { 191 1.1 christos case 8: 192 1.1 christos dst[7] = (value >> 56) & 0xff; 193 1.1 christos dst[6] = (value >> 48) & 0xff; 194 1.1 christos dst[5] = (value >> 40) & 0xff; 195 1.1 christos dst[4] = (value >> 32) & 0xff; 196 1.3 christos /* FALLTHROUGH */ 197 1.1 christos case 4: 198 1.1 christos dst[3] = (value >> 24) & 0xff; 199 1.1 christos dst[2] = (value >> 16) & 0xff; 200 1.3 christos /* FALLTHROUGH */ 201 1.1 christos case 2: 202 1.1 christos dst[1] = (value >> 8) & 0xff; 203 1.3 christos /* FALLTHROUGH */ 204 1.1 christos case 1: 205 1.1 christos dst[0] = value & 0xff; 206 1.1 christos break; 207 1.1 christos default: 208 1.1 christos return; 209 1.1 christos } 210 1.1 christos 211 1.1 christos *offsetp += bytes_to_write; 212 1.1 christos } 213 1.1 christos 214 1.1 christos int 215 1.1 christos _dwarf_write_lsb_alloc(uint8_t **block, uint64_t *size, uint64_t *offsetp, 216 1.1 christos uint64_t value, int bytes_to_write, Dwarf_Error *error) 217 1.1 christos { 218 1.1 christos 219 1.1 christos assert(*size > 0); 220 1.1 christos 221 1.1 christos while (*offsetp + bytes_to_write > *size) { 222 1.1 christos *size *= 2; 223 1.1 christos *block = realloc(*block, (size_t) *size); 224 1.1 christos if (*block == NULL) { 225 1.1 christos DWARF_SET_ERROR(NULL, error, DW_DLE_MEMORY); 226 1.1 christos return (DW_DLE_MEMORY); 227 1.1 christos } 228 1.1 christos } 229 1.1 christos 230 1.1 christos _dwarf_write_lsb(*block, offsetp, value, bytes_to_write); 231 1.1 christos 232 1.1 christos return (DW_DLE_NONE); 233 1.1 christos } 234 1.1 christos 235 1.1 christos void 236 1.1 christos _dwarf_write_msb(uint8_t *data, uint64_t *offsetp, uint64_t value, 237 1.1 christos int bytes_to_write) 238 1.1 christos { 239 1.1 christos uint8_t *dst; 240 1.1 christos 241 1.1 christos dst = data + *offsetp; 242 1.1 christos 243 1.1 christos switch (bytes_to_write) { 244 1.1 christos case 8: 245 1.1 christos dst[7] = value & 0xff; 246 1.1 christos dst[6] = (value >> 8) & 0xff; 247 1.1 christos dst[5] = (value >> 16) & 0xff; 248 1.1 christos dst[4] = (value >> 24) & 0xff; 249 1.1 christos value >>= 32; 250 1.3 christos /* FALLTHROUGH */ 251 1.1 christos case 4: 252 1.1 christos dst[3] = value & 0xff; 253 1.1 christos dst[2] = (value >> 8) & 0xff; 254 1.1 christos value >>= 16; 255 1.3 christos /* FALLTHROUGH */ 256 1.1 christos case 2: 257 1.1 christos dst[1] = value & 0xff; 258 1.1 christos value >>= 8; 259 1.3 christos /* FALLTHROUGH */ 260 1.1 christos case 1: 261 1.1 christos dst[0] = value & 0xff; 262 1.1 christos break; 263 1.1 christos default: 264 1.1 christos return; 265 1.1 christos } 266 1.1 christos 267 1.1 christos *offsetp += bytes_to_write; 268 1.1 christos } 269 1.1 christos 270 1.1 christos int 271 1.1 christos _dwarf_write_msb_alloc(uint8_t **block, uint64_t *size, uint64_t *offsetp, 272 1.1 christos uint64_t value, int bytes_to_write, Dwarf_Error *error) 273 1.1 christos { 274 1.1 christos 275 1.1 christos assert(*size > 0); 276 1.1 christos 277 1.1 christos while (*offsetp + bytes_to_write > *size) { 278 1.1 christos *size *= 2; 279 1.1 christos *block = realloc(*block, (size_t) *size); 280 1.1 christos if (*block == NULL) { 281 1.1 christos DWARF_SET_ERROR(NULL, error, DW_DLE_MEMORY); 282 1.1 christos return (DW_DLE_MEMORY); 283 1.1 christos } 284 1.1 christos } 285 1.1 christos 286 1.1 christos _dwarf_write_msb(*block, offsetp, value, bytes_to_write); 287 1.1 christos 288 1.1 christos return (DW_DLE_NONE); 289 1.1 christos } 290 1.1 christos 291 1.1 christos int64_t 292 1.1 christos _dwarf_read_sleb128(uint8_t *data, uint64_t *offsetp) 293 1.1 christos { 294 1.1 christos int64_t ret = 0; 295 1.1 christos uint8_t b; 296 1.1 christos int shift = 0; 297 1.1 christos uint8_t *src; 298 1.1 christos 299 1.1 christos src = data + *offsetp; 300 1.1 christos 301 1.1 christos do { 302 1.1 christos b = *src++; 303 1.1 christos ret |= ((b & 0x7f) << shift); 304 1.1 christos (*offsetp)++; 305 1.1 christos shift += 7; 306 1.1 christos } while ((b & 0x80) != 0); 307 1.1 christos 308 1.1 christos if (shift < 64 && (b & 0x40) != 0) 309 1.5 christos ret |= (~0UL << shift); 310 1.1 christos 311 1.1 christos return (ret); 312 1.1 christos } 313 1.1 christos 314 1.1 christos int 315 1.1 christos _dwarf_write_sleb128(uint8_t *data, uint8_t *end, int64_t val) 316 1.1 christos { 317 1.1 christos uint8_t *p; 318 1.1 christos 319 1.1 christos p = data; 320 1.1 christos 321 1.1 christos for (;;) { 322 1.1 christos if (p >= end) 323 1.1 christos return (-1); 324 1.1 christos *p = val & 0x7f; 325 1.1 christos val >>= 7; 326 1.1 christos if ((val == 0 && (*p & 0x40) == 0) || 327 1.1 christos (val == -1 && (*p & 0x40) != 0)) { 328 1.1 christos p++; 329 1.1 christos break; 330 1.1 christos } 331 1.1 christos *p++ |= 0x80; 332 1.1 christos } 333 1.1 christos 334 1.1 christos return (p - data); 335 1.1 christos } 336 1.1 christos 337 1.1 christos int 338 1.1 christos _dwarf_write_sleb128_alloc(uint8_t **block, uint64_t *size, uint64_t *offsetp, 339 1.1 christos int64_t val, Dwarf_Error *error) 340 1.1 christos { 341 1.1 christos int len; 342 1.1 christos 343 1.1 christos assert(*size > 0); 344 1.1 christos 345 1.1 christos while ((len = _dwarf_write_sleb128(*block + *offsetp, *block + *size, 346 1.1 christos val)) < 0) { 347 1.1 christos *size *= 2; 348 1.1 christos *block = realloc(*block, (size_t) *size); 349 1.1 christos if (*block == NULL) { 350 1.1 christos DWARF_SET_ERROR(NULL, error, DW_DLE_MEMORY); 351 1.1 christos return (DW_DLE_MEMORY); 352 1.1 christos } 353 1.1 christos } 354 1.1 christos 355 1.1 christos *offsetp += len; 356 1.1 christos 357 1.1 christos return (DW_DLE_NONE); 358 1.1 christos } 359 1.1 christos 360 1.1 christos uint64_t 361 1.1 christos _dwarf_read_uleb128(uint8_t *data, uint64_t *offsetp) 362 1.1 christos { 363 1.1 christos uint64_t ret = 0; 364 1.1 christos uint8_t b; 365 1.1 christos int shift = 0; 366 1.1 christos uint8_t *src; 367 1.1 christos 368 1.1 christos src = data + *offsetp; 369 1.1 christos 370 1.1 christos do { 371 1.1 christos b = *src++; 372 1.1 christos ret |= ((b & 0x7f) << shift); 373 1.1 christos (*offsetp)++; 374 1.1 christos shift += 7; 375 1.1 christos } while ((b & 0x80) != 0); 376 1.1 christos 377 1.1 christos return (ret); 378 1.1 christos } 379 1.1 christos 380 1.1 christos int 381 1.1 christos _dwarf_write_uleb128(uint8_t *data, uint8_t *end, uint64_t val) 382 1.1 christos { 383 1.1 christos uint8_t *p; 384 1.1 christos 385 1.1 christos p = data; 386 1.1 christos 387 1.1 christos do { 388 1.1 christos if (p >= end) 389 1.1 christos return (-1); 390 1.1 christos *p = val & 0x7f; 391 1.1 christos val >>= 7; 392 1.1 christos if (val > 0) 393 1.1 christos *p |= 0x80; 394 1.1 christos p++; 395 1.1 christos } while (val > 0); 396 1.1 christos 397 1.1 christos return (p - data); 398 1.1 christos } 399 1.1 christos 400 1.1 christos int 401 1.1 christos _dwarf_write_uleb128_alloc(uint8_t **block, uint64_t *size, uint64_t *offsetp, 402 1.1 christos uint64_t val, Dwarf_Error *error) 403 1.1 christos { 404 1.1 christos int len; 405 1.1 christos 406 1.1 christos assert(*size > 0); 407 1.1 christos 408 1.1 christos while ((len = _dwarf_write_uleb128(*block + *offsetp, *block + *size, 409 1.1 christos val)) < 0) { 410 1.1 christos *size *= 2; 411 1.1 christos *block = realloc(*block, (size_t) *size); 412 1.1 christos if (*block == NULL) { 413 1.1 christos DWARF_SET_ERROR(NULL, error, DW_DLE_MEMORY); 414 1.1 christos return (DW_DLE_MEMORY); 415 1.1 christos } 416 1.1 christos } 417 1.1 christos 418 1.1 christos *offsetp += len; 419 1.1 christos 420 1.1 christos return (DW_DLE_NONE); 421 1.1 christos } 422 1.1 christos 423 1.1 christos int64_t 424 1.1 christos _dwarf_decode_sleb128(uint8_t **dp) 425 1.1 christos { 426 1.1 christos int64_t ret = 0; 427 1.1 christos uint8_t b; 428 1.1 christos int shift = 0; 429 1.1 christos 430 1.1 christos uint8_t *src = *dp; 431 1.1 christos 432 1.1 christos do { 433 1.1 christos b = *src++; 434 1.1 christos ret |= ((b & 0x7f) << shift); 435 1.1 christos shift += 7; 436 1.1 christos } while ((b & 0x80) != 0); 437 1.1 christos 438 1.1 christos if (shift < 64 && (b & 0x40) != 0) 439 1.5 christos ret |= (~0UL << shift); 440 1.1 christos 441 1.1 christos *dp = src; 442 1.1 christos 443 1.1 christos return (ret); 444 1.1 christos } 445 1.1 christos 446 1.1 christos uint64_t 447 1.1 christos _dwarf_decode_uleb128(uint8_t **dp) 448 1.1 christos { 449 1.1 christos uint64_t ret = 0; 450 1.1 christos uint8_t b; 451 1.1 christos int shift = 0; 452 1.1 christos 453 1.1 christos uint8_t *src = *dp; 454 1.1 christos 455 1.1 christos do { 456 1.1 christos b = *src++; 457 1.1 christos ret |= ((b & 0x7f) << shift); 458 1.1 christos shift += 7; 459 1.1 christos } while ((b & 0x80) != 0); 460 1.1 christos 461 1.1 christos *dp = src; 462 1.1 christos 463 1.1 christos return (ret); 464 1.1 christos } 465 1.1 christos 466 1.1 christos char * 467 1.1 christos _dwarf_read_string(void *data, Dwarf_Unsigned size, uint64_t *offsetp) 468 1.1 christos { 469 1.1 christos char *ret, *src; 470 1.1 christos 471 1.1 christos ret = src = (char *) data + *offsetp; 472 1.1 christos 473 1.1 christos while (*src != '\0' && *offsetp < size) { 474 1.1 christos src++; 475 1.1 christos (*offsetp)++; 476 1.1 christos } 477 1.1 christos 478 1.1 christos if (*src == '\0' && *offsetp < size) 479 1.1 christos (*offsetp)++; 480 1.1 christos 481 1.1 christos return (ret); 482 1.1 christos } 483 1.1 christos 484 1.1 christos void 485 1.1 christos _dwarf_write_string(void *data, uint64_t *offsetp, char *string) 486 1.1 christos { 487 1.1 christos char *dst; 488 1.1 christos 489 1.1 christos dst = (char *) data + *offsetp; 490 1.1 christos strcpy(dst, string); 491 1.1 christos (*offsetp) += strlen(string) + 1; 492 1.1 christos } 493 1.1 christos 494 1.1 christos int 495 1.1 christos _dwarf_write_string_alloc(uint8_t **block, uint64_t *size, uint64_t *offsetp, 496 1.1 christos char *string, Dwarf_Error *error) 497 1.1 christos { 498 1.1 christos size_t len; 499 1.1 christos 500 1.1 christos assert(*size > 0); 501 1.1 christos 502 1.1 christos len = strlen(string) + 1; 503 1.1 christos while (*offsetp + len > *size) { 504 1.1 christos *size *= 2; 505 1.1 christos *block = realloc(*block, (size_t) *size); 506 1.1 christos if (*block == NULL) { 507 1.1 christos DWARF_SET_ERROR(NULL, error, DW_DLE_MEMORY); 508 1.1 christos return (DW_DLE_MEMORY); 509 1.1 christos } 510 1.1 christos } 511 1.1 christos 512 1.1 christos _dwarf_write_string(*block, offsetp, string); 513 1.1 christos 514 1.1 christos return (DW_DLE_NONE); 515 1.1 christos } 516 1.1 christos 517 1.1 christos uint8_t * 518 1.1 christos _dwarf_read_block(void *data, uint64_t *offsetp, uint64_t length) 519 1.1 christos { 520 1.1 christos uint8_t *ret, *src; 521 1.1 christos 522 1.1 christos ret = src = (uint8_t *) data + *offsetp; 523 1.1 christos 524 1.1 christos (*offsetp) += length; 525 1.1 christos 526 1.1 christos return (ret); 527 1.1 christos } 528 1.1 christos 529 1.1 christos void 530 1.1 christos _dwarf_write_block(void *data, uint64_t *offsetp, uint8_t *blk, 531 1.1 christos uint64_t length) 532 1.1 christos { 533 1.1 christos uint8_t *dst; 534 1.1 christos 535 1.1 christos dst = (uint8_t *) data + *offsetp; 536 1.1 christos memcpy(dst, blk, length); 537 1.1 christos (*offsetp) += length; 538 1.1 christos } 539 1.1 christos 540 1.1 christos int 541 1.1 christos _dwarf_write_block_alloc(uint8_t **block, uint64_t *size, uint64_t *offsetp, 542 1.1 christos uint8_t *blk, uint64_t length, Dwarf_Error *error) 543 1.1 christos { 544 1.1 christos 545 1.1 christos assert(*size > 0); 546 1.1 christos 547 1.1 christos while (*offsetp + length > *size) { 548 1.1 christos *size *= 2; 549 1.1 christos *block = realloc(*block, (size_t) *size); 550 1.1 christos if (*block == NULL) { 551 1.1 christos DWARF_SET_ERROR(NULL, error, DW_DLE_MEMORY); 552 1.1 christos return (DW_DLE_MEMORY); 553 1.1 christos } 554 1.1 christos } 555 1.1 christos 556 1.1 christos _dwarf_write_block(*block, offsetp, blk, length); 557 1.1 christos 558 1.1 christos return (DW_DLE_NONE); 559 1.1 christos } 560 1.1 christos 561 1.1 christos void 562 1.1 christos _dwarf_write_padding(void *data, uint64_t *offsetp, uint8_t byte, 563 1.1 christos uint64_t length) 564 1.1 christos { 565 1.1 christos uint8_t *dst; 566 1.1 christos 567 1.1 christos dst = (uint8_t *) data + *offsetp; 568 1.1 christos memset(dst, byte, length); 569 1.1 christos (*offsetp) += length; 570 1.1 christos } 571 1.1 christos 572 1.1 christos int 573 1.1 christos _dwarf_write_padding_alloc(uint8_t **block, uint64_t *size, uint64_t *offsetp, 574 1.1 christos uint8_t byte, uint64_t cnt, Dwarf_Error *error) 575 1.1 christos { 576 1.1 christos assert(*size > 0); 577 1.1 christos 578 1.1 christos while (*offsetp + cnt > *size) { 579 1.1 christos *size *= 2; 580 1.1 christos *block = realloc(*block, (size_t) *size); 581 1.1 christos if (*block == NULL) { 582 1.1 christos DWARF_SET_ERROR(NULL, error, DW_DLE_MEMORY); 583 1.1 christos return (DW_DLE_MEMORY); 584 1.1 christos } 585 1.1 christos } 586 1.1 christos 587 1.1 christos _dwarf_write_padding(*block, offsetp, byte, cnt); 588 1.1 christos 589 1.1 christos return (DW_DLE_NONE); 590 1.1 christos } 591