From 2ecfc040a09f8c42f67bbfdcc4bd02ef84dac8b7 Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Wed, 1 Jan 2025 15:10:28 -0600 Subject: [PATCH] pkg: refactor out a pkg_read_fd() We already have to do this for reading the pubkey, just pull it out for other uses. The ECC signer will use this to verify the bootstrap if the PUBKEY mechanism is used. Reviewed by: bapt, emaste Differential Revision: https://reviews.freebsd.org/D48107 --- usr.sbin/pkg/pkg.c | 40 +++++++++++++++++++++++++++------------- usr.sbin/pkg/pkg.h | 2 ++ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/usr.sbin/pkg/pkg.c b/usr.sbin/pkg/pkg.c index 4d476f7653f..6d0a75d2786 100644 --- a/usr.sbin/pkg/pkg.c +++ b/usr.sbin/pkg/pkg.c @@ -451,32 +451,46 @@ load_fingerprints(const char *path, int *count) return (fingerprints); } +char * +pkg_read_fd(int fd, size_t *osz) +{ + char *obuf; + char buf[4096]; + FILE *fp; + ssize_t r; + + obuf = NULL; + *osz = 0; + fp = open_memstream(&obuf, osz); + if (fp == NULL) + err(EXIT_FAILURE, "open_memstream()"); + + while ((r = read(fd, buf, sizeof(buf))) >0) { + fwrite(buf, 1, r, fp); + } + + if (ferror(fp)) + errx(EXIT_FAILURE, "reading file"); + + fclose(fp); + + return (obuf); +} + static struct pubkey * read_pubkey(int fd) { struct pubkey *pk; char *sigb; size_t sigsz; - FILE *sig; - char buf[4096]; - int r; if (lseek(fd, 0, 0) == -1) { warn("lseek"); return (NULL); } - sigsz = 0; - sigb = NULL; - sig = open_memstream(&sigb, &sigsz); - if (sig == NULL) - err(EXIT_FAILURE, "open_memstream()"); + sigb = pkg_read_fd(fd, &sigsz); - while ((r = read(fd, buf, sizeof(buf))) >0) { - fwrite(buf, 1, r, sig); - } - - fclose(sig); pk = calloc(1, sizeof(struct pubkey)); pk->siglen = sigsz; pk->sig = calloc(1, pk->siglen); diff --git a/usr.sbin/pkg/pkg.h b/usr.sbin/pkg/pkg.h index d42f5a95d32..2d0dab96a20 100644 --- a/usr.sbin/pkg/pkg.h +++ b/usr.sbin/pkg/pkg.h @@ -63,4 +63,6 @@ struct pubkey { int siglen; }; +char *pkg_read_fd(int fd, size_t *osz); + #endif /* _PKG_H */