* Write kernel dump headers at the beginning and end of the dump extent. * Write the kernel dump encryption key after the leading header if we were * configured to do so. */
| 1483 | * configured to do so. |
| 1484 | */ |
| 1485 | static int |
| 1486 | dump_write_headers(struct dumperinfo *di, struct kerneldumpheader *kdh) |
| 1487 | { |
| 1488 | #ifdef EKCD |
| 1489 | struct kerneldumpcrypto *kdc; |
| 1490 | #endif |
| 1491 | void *buf, *key; |
| 1492 | size_t hdrsz; |
| 1493 | uint64_t extent; |
| 1494 | uint32_t keysize; |
| 1495 | int error; |
| 1496 | |
| 1497 | hdrsz = sizeof(*kdh); |
| 1498 | if (hdrsz > di->blocksize) |
| 1499 | return (ENOMEM); |
| 1500 | |
| 1501 | #ifdef EKCD |
| 1502 | kdc = di->kdcrypto; |
| 1503 | key = kdc->kdc_dumpkey; |
| 1504 | keysize = kerneldumpcrypto_dumpkeysize(kdc); |
| 1505 | #else |
| 1506 | key = NULL; |
| 1507 | keysize = 0; |
| 1508 | #endif |
| 1509 | |
| 1510 | /* |
| 1511 | * If the dump device has special handling for headers, let it take care |
| 1512 | * of writing them out. |
| 1513 | */ |
| 1514 | if (di->dumper_hdr != NULL) |
| 1515 | return (di->dumper_hdr(di, kdh, key, keysize)); |
| 1516 | |
| 1517 | if (hdrsz == di->blocksize) |
| 1518 | buf = kdh; |
| 1519 | else { |
| 1520 | buf = di->blockbuf; |
| 1521 | memset(buf, 0, di->blocksize); |
| 1522 | memcpy(buf, kdh, hdrsz); |
| 1523 | } |
| 1524 | |
| 1525 | extent = dtoh64(kdh->dumpextent); |
| 1526 | #ifdef EKCD |
| 1527 | if (kdc != NULL) { |
| 1528 | error = dump_write(di, kdc->kdc_dumpkey, 0, |
| 1529 | di->mediaoffset + di->mediasize - di->blocksize - extent - |
| 1530 | keysize, keysize); |
| 1531 | if (error != 0) |
| 1532 | return (error); |
| 1533 | } |
| 1534 | #endif |
| 1535 | |
| 1536 | error = dump_write(di, buf, 0, |
| 1537 | di->mediaoffset + di->mediasize - 2 * di->blocksize - extent - |
| 1538 | keysize, di->blocksize); |
| 1539 | if (error == 0) |
| 1540 | error = dump_write(di, buf, 0, di->mediaoffset + di->mediasize - |
| 1541 | di->blocksize, di->blocksize); |
| 1542 | return (error); |
no test coverage detected