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 2017 Joyent, Inc.
14 */
15
16 /*
17 * Regression test for illumos #6961. We mistakenly zeroed out a character that
18 * we shouldn't have when dealing with a 64-bit libc.
19 */
20
21 #include <stdio.h>
22 #include <string.h>
23 #include <strings.h>
24 #include <stdlib.h>
25
26 static void
print_diff(char * test,char * correct,char * wrong)27 print_diff(char *test, char *correct, char *wrong)
28 {
29 int i;
30 printf("test failed: received incorrect octal for case %s\n", test);
31 for (i = 0; i < 32; i++) {
32 printf("byte %d: expected 0x%x, found 0x%x\n", i, correct[i],
33 wrong[i]);
34 }
35 }
36
37 int
main(void)38 main(void)
39 {
40 int ret = 0;
41 char buf[32];
42
43 /* ~0L in octal */
44 char octal0[32] = { 'r', 'r', 'r', 'r', '1', '7', '7', '7', '7', '7',
45 '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
46 '7', '7', '7', '\0', 'r', 'r', 'r', 'r', 'r' };
47
48 char decimal0[32] = { 'r', 'r', 'r', 'r', '-', '1', '\0', 'r', 'r', 'r',
49 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
50 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r' };
51
52 char hex0[32] = { 'r', 'r', 'r', 'r', 'f', 'f', 'f', 'f', 'f', 'f',
53 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', '\0', 'r', 'r',
54 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r' };
55
56 /* 42 in octal */
57 char octal1[32] = { 'r', 'r', 'r', 'r', '5', '2', '\0', 'r', 'r', 'r',
58 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
59 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r' };
60
61 /* 42 in decimal */
62 char decimal1[32] = { 'r', 'r', 'r', 'r', '4', '2', '\0', 'r', 'r', 'r',
63 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
64 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r' };
65
66 /* 42 in hex */
67 char hex1[32] = { 'r', 'r', 'r', 'r', '2', 'a', '\0', 'r', 'r', 'r',
68 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
69 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r' };
70
71
72 (void) memset(buf, 'r', sizeof (buf));
73 (void) snprintf(buf + 4, sizeof (buf) - 4, "%lo", ~0L);
74 if (bcmp(octal0, buf, sizeof (buf)) != 0) {
75 print_diff("~0 in Octal", octal0, buf);
76 ret++;
77 }
78
79 (void) memset(buf, 'r', sizeof (buf));
80 (void) snprintf(buf + 4, sizeof (buf) - 4, "%lo", 42L);
81 if (bcmp(octal1, buf, sizeof (buf)) != 0) {
82 print_diff("42 in Octal", octal1, buf);
83 ret++;
84 }
85
86 (void) memset(buf, 'r', sizeof (buf));
87 (void) snprintf(buf + 4, sizeof (buf) - 4, "%ld", ~0L);
88 if (bcmp(decimal0, buf, sizeof (buf)) != 0) {
89 print_diff("~0 in Decimal", decimal0, buf);
90 ret++;
91 }
92
93 (void) memset(buf, 'r', sizeof (buf));
94 (void) snprintf(buf + 4, sizeof (buf) - 4, "%ld", 42L);
95 if (bcmp(decimal1, buf, sizeof (buf)) != 0) {
96 print_diff("42 in Decimal", decimal1, buf);
97 ret++;
98 }
99
100 (void) memset(buf, 'r', sizeof (buf));
101 (void) snprintf(buf + 4, sizeof (buf) - 4, "%lx", ~0L);
102 if (bcmp(hex0, buf, sizeof (buf)) != 0) {
103 print_diff("~0 in Hex", hex0, buf);
104 ret++;
105 }
106
107 (void) memset(buf, 'r', sizeof (buf));
108 (void) snprintf(buf + 4, sizeof (buf) - 4, "%lx", 42L);
109 if (bcmp(hex1, buf, sizeof (buf)) != 0) {
110 print_diff("42 in Hex", hex1, buf);
111 ret++;
112 }
113
114 return (ret);
115 }
116