1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2020 Oxide Computer Company
14 */
15
16 /*
17 * Regression test for 12768 '12392 regressed ftello64 behavior'. The heart of
18 * the problem was a bad cast that resulted in us not properly transmitting that
19 * size.
20 */
21
22 #include <stdio.h>
23 #include <err.h>
24 #include <stdlib.h>
25 #include <sys/sysmacros.h>
26
27 int
main(void)28 main(void)
29 {
30 FILE *f;
31 size_t i;
32 int ret = EXIT_SUCCESS;
33 static off_t offsets[] = {
34 23,
35 0xa0000, /* 64 KiB */
36 0x100000, /* 1 MiB */
37 0x7fffffffULL, /* 2 GiB - 1 */
38 0xc0000000ULL, /* 3 GiB */
39 0x200005432ULL /* 8 GiB + misc */
40 };
41
42 f = tmpfile();
43 if (f == NULL) {
44 err(EXIT_FAILURE, "TEST FAILED: failed to create "
45 "temporary file");
46 }
47
48 for (i = 0; i < ARRAY_SIZE(offsets); i++) {
49 off_t ftret;
50
51 if (fseeko(f, offsets[i], SEEK_SET) != 0) {
52 warn("TEST FAILED: failed to seek to %lld",
53 (long long)offsets[i]);
54 ret = EXIT_FAILURE;
55 }
56
57 ftret = ftello(f);
58 if (ftret == -1) {
59 warn("TEST FAILED: failed to get stream position at "
60 "%lld", (long long)offsets[i]);
61 ret = EXIT_FAILURE;
62 }
63
64 if (ftret != offsets[i]) {
65 warnx("TEST FAILED: stream position mismatch: expected "
66 "%lld, found %lld", (long long)offsets[i],
67 (long long)ftret);
68 ret = EXIT_FAILURE;
69 }
70 }
71
72 return (ret);
73 }
74