MCPcopy Create free account
hub / github.com/apache/qpid-proton / app_inbytes_progress

Function app_inbytes_progress

c/src/ssl/schannel.cpp:1527–1581  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1525
1526
1527static 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
1584static void app_inbytes_advance(pn_transport_t *transport, size_t consumed)

Callers 1

app_inbytes_advanceFunction · 0.85

Calls 8

pn_buffer_clearFunction · 0.85
pn_buffer_bytesFunction · 0.85
pn_buffer_trimFunction · 0.85
pn_buffer_availableFunction · 0.85
grow_inbuf2Function · 0.85
_pni_minFunction · 0.85
pn_buffer_appendFunction · 0.85
rewind_sc_inbufFunction · 0.85

Tested by

no test coverage detected