Index: bin/cp/utils.c =================================================================== --- bin/cp/utils.c +++ bin/cp/utils.c @@ -75,11 +75,29 @@ #define BUFSIZE_SMALL (MAXPHYS) static ssize_t -copy_fallback(int from_fd, int to_fd, char *buf, size_t bufsize) +copy_fallback(int from_fd, int to_fd) { + static char *buf = NULL; + static size_t bufsize; + ssize_t rcount, wresid, wcount = 0; char *bufp; + if (!buf) { + /* + * Note that buf and bufsize are static. If + * malloc() fails, it will fail at the start + * and not copy only some files. + */ + if (sysconf(_SC_PHYS_PAGES) > PHYSPAGES_THRESHOLD) + bufsize = MIN(BUFSIZE_MAX, MAXPHYS * 8); + else + bufsize = BUFSIZE_SMALL; + buf = malloc(bufsize); + if (!buf) + err(1, "Not enough memory"); + } + rcount = read(from_fd, buf, bufsize); if (rcount <= 0) return (rcount); @@ -96,8 +114,6 @@ int copy_file(const FTSENT *entp, int dne) { - static char *buf = NULL; - static size_t bufsize; struct stat *fs; ssize_t rcount, wcount; size_t wresid; @@ -216,21 +232,6 @@ } else #endif { - if (buf == NULL) { - /* - * Note that buf and bufsize are static. If - * malloc() fails, it will fail at the start - * and not copy only some files. - */ - if (sysconf(_SC_PHYS_PAGES) > - PHYSPAGES_THRESHOLD) - bufsize = MIN(BUFSIZE_MAX, MAXPHYS * 8); - else - bufsize = BUFSIZE_SMALL; - buf = malloc(bufsize); - if (buf == NULL) - err(1, "Not enough memory"); - } wtotal = 0; do { if (use_copy_file_range) { @@ -241,10 +242,8 @@ use_copy_file_range = 0; } } - if (!use_copy_file_range) { - rcount = copy_fallback(from_fd, to_fd, - buf, bufsize); - } + if (!use_copy_file_range) + rcount = copy_fallback(from_fd, to_fd); wtotal += rcount; if (info) { info = 0;