mkswap, readahead: stop using fdlength, it is reported to be unreliable
No binary (build failed)
—
(log yok)
| @@ -475,6 +475,7 @@ void xsetuid(uid_t uid) | |
| } | |
| // Return how long the file at fd is, if there's any way to determine it. | |
| + | #ifdef UNUSED |
| off_t fdlength(int fd) | |
| { | |
| off_t bottom = 0, top = 0, pos; | |
| @@ -513,6 +514,7 @@ off_t fdlength(int fd) | |
| return pos + 1; | |
| } | |
| + | #endif |
| int bb_putchar(int ch) | |
| { | |
| @@ -22,9 +22,16 @@ int readahead_main(int argc, char **argv) | |
| while (*++argv) { | |
| int fd = open_or_warn(*argv, O_RDONLY); | |
| if (fd >= 0) { | |
| - | int r = readahead(fd, 0, fdlength(fd)); |
| + | off_t len; |
| + | int r; |
| + | |
| + | /* fdlength was reported to be unreliable - use seek */ |
| + | len = xlseek(fd, 0, SEEK_END); |
| + | xlseek(fd, 0, SEEK_SET); |
| + | r = readahead(fd, 0, len); |
| close(fd); | |
| - | if (r >= 0) continue; |
| + | if (r >= 0) |
| + | continue; |
| } | |
| retval = EXIT_FAILURE; | |
| } | |
| @@ -64,9 +64,11 @@ int mkswap_main(int argc, char **argv) | |
| // Figure out how big the device is and announce our intentions. | |
| fd = xopen(argv[1], O_RDWR); | |
| - | len = fdlength(fd); |
| + | /* fdlength was reported to be unreliable - use seek */ |
| + | len = xlseek(fd, 0, SEEK_END); |
| + | xlseek(fd, 0, SEEK_SET); |
| pagesize = getpagesize(); | |
| - | printf("Setting up swapspace version 1, size = %"OFF_FMT"d bytes\n", |
| + | printf("Setting up swapspace version 1, size = %"OFF_FMT"u bytes\n", |
| len - pagesize); | |
| mkswap_selinux_setcontext(fd, argv[1]); | |