This fairly mechanical conversion is needed for the upcoming libcrypto
bump. This is similar to the changes made in libexec/spamd/sync.c a
while back.
Index: usr.sbin/dhcpd/sync.c
===================================================================
RCS file: /cvs/src/usr.sbin/dhcpd/sync.c,v
retrieving revision 1.23
diff -u -p -r1.23 sync.c
--- usr.sbin/dhcpd/sync.c 13 Feb 2017 23:04:05 -0000 1.23
+++ usr.sbin/dhcpd/sync.c 5 Jan 2022 09:44:21 -0000
@@ -393,7 +393,7 @@ sync_lease(struct lease *lease)
char pad[DHCP_ALIGNBYTES];
u_int16_t leaselen, padlen;
int i = 0;
- HMAC_CTX ctx;
+ HMAC_CTX *ctx;
u_int hmac_len;
if (sync_key == NULL)
@@ -403,8 +403,10 @@ sync_lease(struct lease *lease)
memset(&lv, 0, sizeof(lv));
memset(&pad, 0, sizeof(pad));
- HMAC_CTX_init(&ctx);
- HMAC_Init(&ctx, sync_key, strlen(sync_key), EVP_sha1());
+ if ((ctx = HMAC_CTX_new()) == NULL)
+ goto bad;
+ if (!HMAC_Init_ex(ctx, sync_key, strlen(sync_key), EVP_sha1(), NULL))
+ goto bad;
leaselen = sizeof(lv);
padlen = DHCP_ALIGN(leaselen) - leaselen;
@@ -416,7 +418,8 @@ sync_lease(struct lease *lease)
hdr.sh_length = htons(sizeof(hdr) + sizeof(lv) + padlen + sizeof(end));
iov[i].iov_base = &hdr;
iov[i].iov_len = sizeof(hdr);
- HMAC_Update(&ctx, iov[i].iov_base, iov[i].iov_len);
+ if (!HMAC_Update(ctx, iov[i].iov_base, iov[i].iov_len))
+ goto bad;
i++;
/* Add single DHCP sync address entry */
@@ -434,12 +437,14 @@ sync_lease(struct lease *lease)
piaddr(lease->ip_addr), ntohl(lv.lv_starts), ntohl(lv.lv_ends));
iov[i].iov_base = &lv;
iov[i].iov_len = sizeof(lv);
- HMAC_Update(&ctx, iov[i].iov_base, iov[i].iov_len);
+ if (!HMAC_Update(ctx, iov[i].iov_base, iov[i].iov_len))
+ goto bad;
i++;
iov[i].iov_base = pad;
iov[i].iov_len = padlen;
- HMAC_Update(&ctx, iov[i].iov_base, iov[i].iov_len);
+ if (!HMAC_Update(ctx, iov[i].iov_base, iov[i].iov_len))
+ goto bad;
i++;
/* Add end marker */
@@ -447,12 +452,16 @@ sync_lease(struct lease *lease)
end.st_length = htons(sizeof(end));
iov[i].iov_base = &end;
iov[i].iov_len = sizeof(end);
- HMAC_Update(&ctx, iov[i].iov_base, iov[i].iov_len);
+ if (!HMAC_Update(ctx, iov[i].iov_base, iov[i].iov_len))
+ goto bad;
i++;
- HMAC_Final(&ctx, hdr.sh_hmac, &hmac_len);
+ if (!HMAC_Final(ctx, hdr.sh_hmac, &hmac_len))
+ goto bad;
/* Send message to the target hosts */
sync_send(iov, i);
- HMAC_CTX_cleanup(&ctx);
+
+ bad:
+ HMAC_CTX_free(ctx);
}