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 --- |