Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/ctld/pdu.c
Show First 20 Lines • Show All 111 Lines • ▼ Show 20 Lines | pdu_receive_proxy(struct pdu *pdu) | ||||
kernel_receive(pdu); | kernel_receive(pdu); | ||||
len = pdu_ahs_length(pdu); | len = pdu_ahs_length(pdu); | ||||
if (len > 0) | if (len > 0) | ||||
log_errx(1, "protocol error: non-empty AHS"); | log_errx(1, "protocol error: non-empty AHS"); | ||||
len = pdu_data_segment_length(pdu); | len = pdu_data_segment_length(pdu); | ||||
assert(len <= MAX_DATA_SEGMENT_LENGTH); | assert(len <= pdu->pdu_connection->conn_max_recv_data_segment_length); | ||||
pdu->pdu_data_len = len; | pdu->pdu_data_len = len; | ||||
} | } | ||||
static void | static void | ||||
pdu_send_proxy(struct pdu *pdu) | pdu_send_proxy(struct pdu *pdu) | ||||
{ | { | ||||
assert(proxy_mode); | assert(proxy_mode); | ||||
Show All 30 Lines | while (len > 0) { | ||||
len -= ret; | len -= ret; | ||||
data += ret; | data += ret; | ||||
} | } | ||||
} | } | ||||
void | void | ||||
pdu_receive(struct pdu *pdu) | pdu_receive(struct pdu *pdu) | ||||
{ | { | ||||
struct connection *conn; | |||||
size_t len, padding; | size_t len, padding; | ||||
char dummy[4]; | char dummy[4]; | ||||
#ifdef ICL_KERNEL_PROXY | #ifdef ICL_KERNEL_PROXY | ||||
if (proxy_mode) | if (proxy_mode) | ||||
return (pdu_receive_proxy(pdu)); | return (pdu_receive_proxy(pdu)); | ||||
#endif | #endif | ||||
assert(proxy_mode == false); | assert(proxy_mode == false); | ||||
conn = pdu->pdu_connection; | |||||
pdu_read(pdu->pdu_connection->conn_socket, | pdu_read(conn->conn_socket, (char *)pdu->pdu_bhs, | ||||
(char *)pdu->pdu_bhs, sizeof(*pdu->pdu_bhs)); | sizeof(*pdu->pdu_bhs)); | ||||
len = pdu_ahs_length(pdu); | len = pdu_ahs_length(pdu); | ||||
if (len > 0) | if (len > 0) | ||||
log_errx(1, "protocol error: non-empty AHS"); | log_errx(1, "protocol error: non-empty AHS"); | ||||
len = pdu_data_segment_length(pdu); | len = pdu_data_segment_length(pdu); | ||||
if (len > 0) { | if (len > 0) { | ||||
if (len > MAX_DATA_SEGMENT_LENGTH) { | if ((int)len > conn->conn_max_recv_data_segment_length) { | ||||
log_errx(1, "protocol error: received PDU " | log_errx(1, "protocol error: received PDU " | ||||
"with DataSegmentLength exceeding %d", | "with DataSegmentLength exceeding %d", | ||||
MAX_DATA_SEGMENT_LENGTH); | conn->conn_max_recv_data_segment_length); | ||||
} | } | ||||
pdu->pdu_data_len = len; | pdu->pdu_data_len = len; | ||||
pdu->pdu_data = malloc(len); | pdu->pdu_data = malloc(len); | ||||
if (pdu->pdu_data == NULL) | if (pdu->pdu_data == NULL) | ||||
log_err(1, "malloc"); | log_err(1, "malloc"); | ||||
pdu_read(pdu->pdu_connection->conn_socket, | pdu_read(conn->conn_socket, (char *)pdu->pdu_data, | ||||
(char *)pdu->pdu_data, pdu->pdu_data_len); | pdu->pdu_data_len); | ||||
padding = pdu_padding(pdu); | padding = pdu_padding(pdu); | ||||
if (padding != 0) { | if (padding != 0) { | ||||
assert(padding < sizeof(dummy)); | assert(padding < sizeof(dummy)); | ||||
pdu_read(pdu->pdu_connection->conn_socket, | pdu_read(conn->conn_socket, (char *)dummy, padding); | ||||
(char *)dummy, padding); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
void | void | ||||
pdu_send(struct pdu *pdu) | pdu_send(struct pdu *pdu) | ||||
{ | { | ||||
ssize_t ret, total_len; | ssize_t ret, total_len; | ||||
▲ Show 20 Lines • Show All 52 Lines • Show Last 20 Lines |