Commit Diff


commit - 1a99859b357957715fb62ced6ddef871ca9ab3a0
commit + 4ad573d0d5675212b0b5719a0a5c1de22974dd0e
blob - f22f44c9b8e54865668b48f49aadcba59786de90
blob + de266c42b8d60b2c4a929990edac3a357eb720ad
--- config.c
+++ config.c
@@ -419,18 +419,14 @@ static int
 load_file(int fd, uint8_t **data, size_t *len)
 {
 	struct stat	 sb;
-	FILE		*fp;
-	size_t		 r;
+	ssize_t		 r;
 
 	if (fstat(fd, &sb) == -1)
 		fatal("fstat");
 
-	if ((fp = fdopen(fd, "r")) == NULL)
-		fatal("fdopen");
-
 	if (sb.st_size < 0 /* || sb.st_size > SIZE_MAX */) {
 		log_warnx("file too large");
-		fclose(fp);
+		close(fd);
 		return -1;
 	}
 	*len = sb.st_size;
@@ -438,15 +434,15 @@ load_file(int fd, uint8_t **data, size_t *len)
 	if ((*data = malloc(*len)) == NULL)
 		fatal("malloc");
 
-	r = fread(*data, 1, *len, fp);
-	if (r != *len) {
-		log_warn("read");
-		fclose(fp);
+	r = pread(fd, *data, *len, 0);
+	if (r == -1 || (size_t)r != *len) {
+		log_warn("read failed");
+		close(fd);
 		free(*data);
 		return -1;
 	}
 
-	fclose(fp);
+	close(fd);
 	return 0;
 }