libiscsiutil: Change keys_load/save to operate on data buffers.

This will be used in future changes to support large text requests
spanning multiple PDUs.

Provide wrapper functions keys_load/save_pdu that operate use a PDU's
data buffer.

Reviewed by:	mav
Sponsored by:	Chelsio Communications
Differential Revision:	https://reviews.freebsd.org/D33547
This commit is contained in:
John Baldwin 2021-12-22 10:42:29 -08:00
parent 2ccb8fde5e
commit 25700db366
6 changed files with 49 additions and 35 deletions

View file

@ -59,22 +59,22 @@ keys_delete(struct keys *keys)
} }
void void
keys_load(struct keys *keys, const struct pdu *pdu) keys_load(struct keys *keys, const char *data, size_t len)
{ {
int i; int i;
char *keys_data, *name, *pair, *value; char *keys_data, *name, *pair, *value;
size_t pair_len; size_t pair_len;
if (pdu->pdu_data_len == 0) if (len == 0)
return; return;
if (pdu->pdu_data[pdu->pdu_data_len - 1] != '\0') if (data[len - 1] != '\0')
log_errx(1, "protocol error: key not NULL-terminated\n"); log_errx(1, "protocol error: key not NULL-terminated\n");
keys_data = malloc(pdu->pdu_data_len); keys_data = malloc(len);
if (keys_data == NULL) if (keys_data == NULL)
log_err(1, "malloc"); log_err(1, "malloc");
memcpy(keys_data, pdu->pdu_data, pdu->pdu_data_len); memcpy(keys_data, data, len);
/* /*
* XXX: Review this carefully. * XXX: Review this carefully.
@ -96,15 +96,15 @@ keys_load(struct keys *keys, const struct pdu *pdu)
keys->keys_names[i], keys->keys_values[i]); keys->keys_names[i], keys->keys_values[i]);
pair += pair_len + 1; /* +1 to skip the terminating '\0'. */ pair += pair_len + 1; /* +1 to skip the terminating '\0'. */
if (pair == keys_data + pdu->pdu_data_len) if (pair == keys_data + len)
break; break;
assert(pair < keys_data + pdu->pdu_data_len); assert(pair < keys_data + len);
} }
free(keys_data); free(keys_data);
} }
void void
keys_save(struct keys *keys, struct pdu *pdu) keys_save(struct keys *keys, char **datap, size_t *lenp)
{ {
FILE *fp; FILE *fp;
char *data; char *data;
@ -131,8 +131,8 @@ keys_save(struct keys *keys, struct pdu *pdu)
data = NULL; data = NULL;
} }
pdu->pdu_data = data; *datap = data;
pdu->pdu_data_len = len; *lenp = len;
} }
const char * const char *

View file

@ -109,14 +109,28 @@ void rchap_delete(struct rchap *rchap);
struct keys *keys_new(void); struct keys *keys_new(void);
void keys_delete(struct keys *key); void keys_delete(struct keys *key);
void keys_load(struct keys *keys, const struct pdu *pdu); void keys_load(struct keys *keys, const char *data,
void keys_save(struct keys *keys, struct pdu *pdu); size_t len);
void keys_save(struct keys *keys, char **datap,
size_t *lenp);
const char *keys_find(struct keys *keys, const char *name); const char *keys_find(struct keys *keys, const char *name);
void keys_add(struct keys *keys, void keys_add(struct keys *keys,
const char *name, const char *value); const char *name, const char *value);
void keys_add_int(struct keys *keys, void keys_add_int(struct keys *keys,
const char *name, int value); const char *name, int value);
static __inline void
keys_load_pdu(struct keys *keys, const struct pdu *pdu)
{
keys_load(keys, pdu->pdu_data, pdu->pdu_data_len);
}
static __inline void
keys_save_pdu(struct keys *keys, struct pdu *pdu)
{
keys_save(keys, &pdu->pdu_data, &pdu->pdu_data_len);
}
struct pdu *pdu_new(struct connection *ic); struct pdu *pdu_new(struct connection *ic);
struct pdu *pdu_new_response(struct pdu *request); struct pdu *pdu_new_response(struct pdu *request);
int pdu_ahs_length(const struct pdu *pdu); int pdu_ahs_length(const struct pdu *pdu);

View file

@ -287,7 +287,7 @@ discovery(struct ctld_connection *conn)
log_debugx("beginning discovery session; waiting for Text PDU"); log_debugx("beginning discovery session; waiting for Text PDU");
request = text_receive(&conn->conn); request = text_receive(&conn->conn);
request_keys = keys_new(); request_keys = keys_new();
keys_load(request_keys, request); keys_load_pdu(request_keys, request);
send_targets = keys_find(request_keys, "SendTargets"); send_targets = keys_find(request_keys, "SendTargets");
if (send_targets == NULL) if (send_targets == NULL)
@ -317,7 +317,7 @@ discovery(struct ctld_connection *conn)
} }
} }
} }
keys_save(response_keys, response); keys_save_pdu(response_keys, response);
pdu_send(response); pdu_send(response);
pdu_delete(response); pdu_delete(response);

View file

@ -236,7 +236,7 @@ login_receive_chap_a(struct connection *conn)
request = login_receive(conn, false); request = login_receive(conn, false);
request_keys = keys_new(); request_keys = keys_new();
keys_load(request_keys, request); keys_load_pdu(request_keys, request);
chap_a = keys_find(request_keys, "CHAP_A"); chap_a = keys_find(request_keys, "CHAP_A");
if (chap_a == NULL) { if (chap_a == NULL) {
@ -270,7 +270,7 @@ login_send_chap_c(struct pdu *request, struct chap *chap)
keys_add(response_keys, "CHAP_C", chap_c); keys_add(response_keys, "CHAP_C", chap_c);
free(chap_i); free(chap_i);
free(chap_c); free(chap_c);
keys_save(response_keys, response); keys_save_pdu(response_keys, response);
pdu_send(response); pdu_send(response);
pdu_delete(response); pdu_delete(response);
keys_delete(response_keys); keys_delete(response_keys);
@ -288,7 +288,7 @@ login_receive_chap_r(struct connection *conn, struct auth_group *ag,
request = login_receive(conn, false); request = login_receive(conn, false);
request_keys = keys_new(); request_keys = keys_new();
keys_load(request_keys, request); keys_load_pdu(request_keys, request);
chap_n = keys_find(request_keys, "CHAP_N"); chap_n = keys_find(request_keys, "CHAP_N");
if (chap_n == NULL) { if (chap_n == NULL) {
@ -352,7 +352,7 @@ login_send_chap_success(struct pdu *request,
* Actually, one more thing: mutual authentication. * Actually, one more thing: mutual authentication.
*/ */
request_keys = keys_new(); request_keys = keys_new();
keys_load(request_keys, request); keys_load_pdu(request_keys, request);
chap_i = keys_find(request_keys, "CHAP_I"); chap_i = keys_find(request_keys, "CHAP_I");
chap_c = keys_find(request_keys, "CHAP_C"); chap_c = keys_find(request_keys, "CHAP_C");
if (chap_i != NULL || chap_c != NULL) { if (chap_i != NULL || chap_c != NULL) {
@ -389,7 +389,7 @@ login_send_chap_success(struct pdu *request,
keys_add(response_keys, "CHAP_N", auth->a_mutual_user); keys_add(response_keys, "CHAP_N", auth->a_mutual_user);
keys_add(response_keys, "CHAP_R", chap_r); keys_add(response_keys, "CHAP_R", chap_r);
free(chap_r); free(chap_r);
keys_save(response_keys, response); keys_save_pdu(response_keys, response);
keys_delete(response_keys); keys_delete(response_keys);
} else { } else {
log_debugx("initiator did not request target authentication"); log_debugx("initiator did not request target authentication");
@ -635,7 +635,7 @@ login_redirect(struct pdu *request, const char *target_address)
response_keys = keys_new(); response_keys = keys_new();
keys_add(response_keys, "TargetAddress", target_address); keys_add(response_keys, "TargetAddress", target_address);
keys_save(response_keys, response); keys_save_pdu(response_keys, response);
pdu_send(response); pdu_send(response);
pdu_delete(response); pdu_delete(response);
keys_delete(response_keys); keys_delete(response_keys);
@ -753,7 +753,7 @@ login_negotiate(struct ctld_connection *conn, struct pdu *request)
} }
request_keys = keys_new(); request_keys = keys_new();
keys_load(request_keys, request); keys_load_pdu(request_keys, request);
response = login_new_response(request); response = login_new_response(request);
bhslr2 = (struct iscsi_bhs_login_response *)response->pdu_bhs; bhslr2 = (struct iscsi_bhs_login_response *)response->pdu_bhs;
@ -801,7 +801,7 @@ login_negotiate(struct ctld_connection *conn, struct pdu *request)
log_debugx("operational parameter negotiation done; " log_debugx("operational parameter negotiation done; "
"transitioning to Full Feature Phase"); "transitioning to Full Feature Phase");
keys_save(response_keys, response); keys_save_pdu(response_keys, response);
pdu_send(response); pdu_send(response);
pdu_delete(response); pdu_delete(response);
keys_delete(response_keys); keys_delete(response_keys);
@ -867,7 +867,7 @@ login(struct ctld_connection *conn)
* XXX: Implement the C flag some day. * XXX: Implement the C flag some day.
*/ */
request_keys = keys_new(); request_keys = keys_new();
keys_load(request_keys, request); keys_load_pdu(request_keys, request);
assert(conn->conn_initiator_name == NULL); assert(conn->conn_initiator_name == NULL);
initiator_name = keys_find(request_keys, "InitiatorName"); initiator_name = keys_find(request_keys, "InitiatorName");
@ -1036,7 +1036,7 @@ login(struct ctld_connection *conn)
keys_add_int(response_keys, keys_add_int(response_keys,
"TargetPortalGroupTag", pg->pg_tag); "TargetPortalGroupTag", pg->pg_tag);
} }
keys_save(response_keys, response); keys_save_pdu(response_keys, response);
pdu_send(response); pdu_send(response);
pdu_delete(response); pdu_delete(response);

View file

@ -177,7 +177,7 @@ discovery(struct iscsid_connection *conn)
request = text_new_request(&conn->conn); request = text_new_request(&conn->conn);
request_keys = keys_new(); request_keys = keys_new();
keys_add(request_keys, "SendTargets", "All"); keys_add(request_keys, "SendTargets", "All");
keys_save(request_keys, request); keys_save_pdu(request_keys, request);
keys_delete(request_keys); keys_delete(request_keys);
request_keys = NULL; request_keys = NULL;
pdu_send(request); pdu_send(request);
@ -187,7 +187,7 @@ discovery(struct iscsid_connection *conn)
log_debugx("waiting for Text Response"); log_debugx("waiting for Text Response");
response = text_receive(&conn->conn); response = text_receive(&conn->conn);
response_keys = keys_new(); response_keys = keys_new();
keys_load(response_keys, response); keys_load_pdu(response_keys, response);
for (i = 0; i < KEYS_MAX; i++) { for (i = 0; i < KEYS_MAX; i++) {
if (response_keys->keys_names[i] == NULL) if (response_keys->keys_names[i] == NULL)
break; break;

View file

@ -198,7 +198,7 @@ login_handle_redirection(struct iscsid_connection *conn, struct pdu *response)
assert (bhslr->bhslr_status_class == 1); assert (bhslr->bhslr_status_class == 1);
response_keys = keys_new(); response_keys = keys_new();
keys_load(response_keys, response); keys_load_pdu(response_keys, response);
target_address = keys_find(response_keys, "TargetAddress"); target_address = keys_find(response_keys, "TargetAddress");
if (target_address == NULL) if (target_address == NULL)
@ -543,7 +543,7 @@ login_negotiate(struct iscsid_connection *conn)
keys_add(request_keys, "DefaultTime2Wait", "0"); keys_add(request_keys, "DefaultTime2Wait", "0");
keys_add(request_keys, "DefaultTime2Retain", "0"); keys_add(request_keys, "DefaultTime2Retain", "0");
keys_add(request_keys, "ErrorRecoveryLevel", "0"); keys_add(request_keys, "ErrorRecoveryLevel", "0");
keys_save(request_keys, request); keys_save_pdu(request_keys, request);
keys_delete(request_keys); keys_delete(request_keys);
request_keys = NULL; request_keys = NULL;
pdu_send(request); pdu_send(request);
@ -552,7 +552,7 @@ login_negotiate(struct iscsid_connection *conn)
response = login_receive(&conn->conn); response = login_receive(&conn->conn);
response_keys = keys_new(); response_keys = keys_new();
keys_load(response_keys, response); keys_load_pdu(response_keys, response);
for (i = 0; i < KEYS_MAX; i++) { for (i = 0; i < KEYS_MAX; i++) {
if (response_keys->keys_names[i] == NULL) if (response_keys->keys_names[i] == NULL)
break; break;
@ -607,7 +607,7 @@ login_send_chap_a(struct connection *conn)
request = login_new_request(conn, BHSLR_STAGE_SECURITY_NEGOTIATION); request = login_new_request(conn, BHSLR_STAGE_SECURITY_NEGOTIATION);
request_keys = keys_new(); request_keys = keys_new();
keys_add(request_keys, "CHAP_A", "5"); keys_add(request_keys, "CHAP_A", "5");
keys_save(request_keys, request); keys_save_pdu(request_keys, request);
keys_delete(request_keys); keys_delete(request_keys);
pdu_send(request); pdu_send(request);
pdu_delete(request); pdu_delete(request);
@ -636,7 +636,7 @@ login_send_chap_r(struct pdu *response)
conn = (struct iscsid_connection *)response->pdu_connection; conn = (struct iscsid_connection *)response->pdu_connection;
response_keys = keys_new(); response_keys = keys_new();
keys_load(response_keys, response); keys_load_pdu(response_keys, response);
/* /*
* First, compute the response. * First, compute the response.
@ -693,7 +693,7 @@ login_send_chap_r(struct pdu *response)
free(mutual_chap_c); free(mutual_chap_c);
} }
keys_save(request_keys, request); keys_save_pdu(request_keys, request);
keys_delete(request_keys); keys_delete(request_keys);
pdu_send(request); pdu_send(request);
pdu_delete(request); pdu_delete(request);
@ -710,7 +710,7 @@ login_verify_mutual(const struct pdu *response)
conn = (struct iscsid_connection *)response->pdu_connection; conn = (struct iscsid_connection *)response->pdu_connection;
response_keys = keys_new(); response_keys = keys_new();
keys_load(response_keys, response); keys_load_pdu(response_keys, response);
chap_n = keys_find(response_keys, "CHAP_N"); chap_n = keys_find(response_keys, "CHAP_N");
if (chap_n == NULL) if (chap_n == NULL)
@ -816,7 +816,7 @@ login(struct iscsid_connection *conn)
} else { } else {
keys_add(request_keys, "SessionType", "Discovery"); keys_add(request_keys, "SessionType", "Discovery");
} }
keys_save(request_keys, request); keys_save_pdu(request_keys, request);
keys_delete(request_keys); keys_delete(request_keys);
pdu_send(request); pdu_send(request);
pdu_delete(request); pdu_delete(request);
@ -824,7 +824,7 @@ login(struct iscsid_connection *conn)
response = login_receive(&conn->conn); response = login_receive(&conn->conn);
response_keys = keys_new(); response_keys = keys_new();
keys_load(response_keys, response); keys_load_pdu(response_keys, response);
for (i = 0; i < KEYS_MAX; i++) { for (i = 0; i < KEYS_MAX; i++) {
if (response_keys->keys_names[i] == NULL) if (response_keys->keys_names[i] == NULL)