| 1525 | |
| 1526 | |
| 1527 | static void app_inbytes_progress(pn_transport_t *transport, size_t minimum) |
| 1528 | { |
| 1529 | pni_ssl_t *ssl = transport->ssl; |
| 1530 | // Make more decrypted data available, if possible. Otherwise, move |
| 1531 | // unread bytes to front of inbuf2 to make room for next bulk decryption. |
| 1532 | // SSL may have chopped up data that app layer expects to be |
| 1533 | // contiguous. Start, continue or stop double buffering here. |
| 1534 | if (ssl->double_buffered) { |
| 1535 | if (ssl->app_inbytes.size == 0) { |
| 1536 | // no straggler bytes, optimistically stop for now |
| 1537 | ssl->double_buffered = false; |
| 1538 | pn_buffer_clear(ssl->inbuf2); |
| 1539 | ssl->app_inbytes.start = ssl->in_data; |
| 1540 | ssl->app_inbytes.size = ssl->in_data_count; |
| 1541 | } else { |
| 1542 | pn_bytes_t ib2 = pn_buffer_bytes(ssl->inbuf2); |
| 1543 | assert(ssl->app_inbytes.size <= ib2.size); |
| 1544 | size_t consumed = ib2.size - ssl->app_inbytes.size; |
| 1545 | if (consumed > 0) { |
| 1546 | memmove((void *)ib2.start, ib2.start + consumed, ssl->app_inbytes.size); |
| 1547 | pn_buffer_trim(ssl->inbuf2, 0, consumed); |
| 1548 | } |
| 1549 | if (!pn_buffer_available(ssl->inbuf2)) { |
| 1550 | if (!grow_inbuf2(transport, minimum)) |
| 1551 | // could not add room |
| 1552 | return; |
| 1553 | } |
| 1554 | size_t count = _pni_min(ssl->in_data_count, pn_buffer_available(ssl->inbuf2)); |
| 1555 | pn_buffer_append(ssl->inbuf2, ssl->in_data, count); |
| 1556 | ssl->in_data += count; |
| 1557 | ssl->in_data_count -= count; |
| 1558 | ssl->app_inbytes = pn_buffer_bytes(ssl->inbuf2); |
| 1559 | } |
| 1560 | } else { |
| 1561 | if (ssl->app_inbytes.size) { |
| 1562 | // start double buffering the left over bytes |
| 1563 | ssl->double_buffered = true; |
| 1564 | pn_buffer_clear(ssl->inbuf2); |
| 1565 | if (!pn_buffer_available(ssl->inbuf2)) { |
| 1566 | if (!grow_inbuf2(transport, minimum)) |
| 1567 | // could not add room |
| 1568 | return; |
| 1569 | } |
| 1570 | size_t count = _pni_min(ssl->in_data_count, pn_buffer_available(ssl->inbuf2)); |
| 1571 | pn_buffer_append(ssl->inbuf2, ssl->in_data, count); |
| 1572 | ssl->in_data += count; |
| 1573 | ssl->in_data_count -= count; |
| 1574 | ssl->app_inbytes = pn_buffer_bytes(ssl->inbuf2); |
| 1575 | } else { |
| 1576 | // already pointing at all available bytes until next decrypt |
| 1577 | } |
| 1578 | } |
| 1579 | if (ssl->in_data_count == 0) |
| 1580 | rewind_sc_inbuf(ssl); |
| 1581 | } |
| 1582 | |
| 1583 | |
| 1584 | static void app_inbytes_advance(pn_transport_t *transport, size_t consumed) |
no test coverage detected