keys.c (6378393308bc6bd81fb871dacf6b03cf1a390d8b) keys.c (fd99905b4591a5e4df3dda32e4c67258aaf44517)
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2012 The FreeBSD Foundation
5 *
6 * This software was developed by Edward Tomasz Napierala under sponsorship
7 * from the FreeBSD Foundation.
8 *

--- 37 unchanged lines hidden (view full) ---

46
47 return (keys);
48}
49
50void
51keys_delete(struct keys *keys)
52{
53
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2012 The FreeBSD Foundation
5 *
6 * This software was developed by Edward Tomasz Napierala under sponsorship
7 * from the FreeBSD Foundation.
8 *

--- 37 unchanged lines hidden (view full) ---

46
47 return (keys);
48}
49
50void
51keys_delete(struct keys *keys)
52{
53
54 free(keys->keys_data);
54 for (int i = 0; i < KEYS_MAX; i++) {
55 free(keys->keys_names[i]);
56 free(keys->keys_values[i]);
57 }
55 free(keys);
56}
57
58void
59keys_load(struct keys *keys, const struct pdu *pdu)
60{
61 int i;
58 free(keys);
59}
60
61void
62keys_load(struct keys *keys, const struct pdu *pdu)
63{
64 int i;
62 char *pair;
65 char *keys_data, *name, *pair, *value;
63 size_t pair_len;
64
65 if (pdu->pdu_data_len == 0)
66 return;
67
68 if (pdu->pdu_data[pdu->pdu_data_len - 1] != '\0')
69 log_errx(1, "protocol error: key not NULL-terminated\n");
70
66 size_t pair_len;
67
68 if (pdu->pdu_data_len == 0)
69 return;
70
71 if (pdu->pdu_data[pdu->pdu_data_len - 1] != '\0')
72 log_errx(1, "protocol error: key not NULL-terminated\n");
73
71 assert(keys->keys_data == NULL);
72 keys->keys_data_len = pdu->pdu_data_len;
73 keys->keys_data = malloc(keys->keys_data_len);
74 if (keys->keys_data == NULL)
74 keys_data = malloc(pdu->pdu_data_len);
75 if (keys_data == NULL)
75 log_err(1, "malloc");
76 log_err(1, "malloc");
76 memcpy(keys->keys_data, pdu->pdu_data, keys->keys_data_len);
77 memcpy(keys_data, pdu->pdu_data, pdu->pdu_data_len);
77
78 /*
79 * XXX: Review this carefully.
80 */
78
79 /*
80 * XXX: Review this carefully.
81 */
81 pair = keys->keys_data;
82 pair = keys_data;
82 for (i = 0;; i++) {
83 if (i >= KEYS_MAX)
84 log_errx(1, "too many keys received");
85
86 pair_len = strlen(pair);
87
83 for (i = 0;; i++) {
84 if (i >= KEYS_MAX)
85 log_errx(1, "too many keys received");
86
87 pair_len = strlen(pair);
88
88 keys->keys_values[i] = pair;
89 keys->keys_names[i] = strsep(&keys->keys_values[i], "=");
90 if (keys->keys_names[i] == NULL || keys->keys_values[i] == NULL)
89 value = pair;
90 name = strsep(&value, "=");
91 if (name == NULL || value == NULL)
91 log_errx(1, "malformed keys");
92 log_errx(1, "malformed keys");
93 keys->keys_names[i] = checked_strdup(name);
94 keys->keys_values[i] = checked_strdup(value);
92 log_debugx("key received: \"%s=%s\"",
93 keys->keys_names[i], keys->keys_values[i]);
94
95 pair += pair_len + 1; /* +1 to skip the terminating '\0'. */
95 log_debugx("key received: \"%s=%s\"",
96 keys->keys_names[i], keys->keys_values[i]);
97
98 pair += pair_len + 1; /* +1 to skip the terminating '\0'. */
96 if (pair == keys->keys_data + keys->keys_data_len)
99 if (pair == keys_data + pdu->pdu_data_len)
97 break;
100 break;
98 assert(pair < keys->keys_data + keys->keys_data_len);
101 assert(pair < keys_data + pdu->pdu_data_len);
99 }
102 }
103 free(keys_data);
100}
101
102void
103keys_save(struct keys *keys, struct pdu *pdu)
104{
105 char *data;
106 size_t len;
107 int i;

--- 88 unchanged lines hidden ---
104}
105
106void
107keys_save(struct keys *keys, struct pdu *pdu)
108{
109 char *data;
110 size_t len;
111 int i;

--- 88 unchanged lines hidden ---