xref: /llvm-project/compiler-rt/test/msan/Linux/b64.cpp (revision 5732cdc1be519eba3fe176cae2c8fea1e0ce7ea7)
1 // RUN: %clangxx_msan -O0 %s -o %t && %run %t
2 // RUN: not %run %t NTOP_READ 2>&1 | FileCheck %s --check-prefix=NTOP_READ
3 // RUN: not %run %t PTON_READ 2>&1 | FileCheck %s --check-prefix=PTON_READ
4 
5 #include <assert.h>
6 #include <resolv.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <sys/types.h>
10 
11 #include <sanitizer/msan_interface.h>
12 
main(int iArgc,char * szArgv[])13 int main(int iArgc, char *szArgv[]) {
14   char* test = nullptr;
15   if (iArgc > 1) {
16     test = szArgv[1];
17   }
18 
19   if (test == nullptr) {
20     // Check NTOP writing
21     const char *src = "base64 test data";
22     size_t src_len = strlen(src);
23     size_t dst_len = ((src_len + 2) / 3) * 4 + 1;
24     char dst[dst_len];
25     int res = b64_ntop(reinterpret_cast<const unsigned char *>(src), src_len,
26                        dst, dst_len);
27     assert(res >= 0);
28     __msan_check_mem_is_initialized(dst, res);
29 
30     // Check PTON writing
31     unsigned char target[dst_len];
32     res = b64_pton(dst, target, dst_len);
33     assert(res >= 0);
34     __msan_check_mem_is_initialized(target, res);
35 
36     // Check NTOP writing for zero length src
37     src = "";
38     src_len = strlen(src);
39     assert(((src_len + 2) / 3) * 4 + 1 < dst_len);
40     res = b64_ntop(reinterpret_cast<const unsigned char *>(src), src_len,
41                        dst, dst_len);
42     assert(res >= 0);
43     __msan_check_mem_is_initialized(dst, res);
44 
45     // Check PTON writing for zero length src
46     dst[0] = '\0';
47     res = b64_pton(dst, target, dst_len);
48     assert(res >= 0);
49     __msan_check_mem_is_initialized(target, res);
50 
51     return 0;
52   }
53 
54   if (strcmp(test, "NTOP_READ") == 0) {
55     // Check NTOP reading
56     size_t src_len = 80;
57     char src[src_len];
58     __msan_poison(src, src_len);
59     size_t dst_len = ((src_len + 2) / 3) * 4 + 1;
60     char dst[dst_len];
61     int res = b64_ntop(reinterpret_cast<const unsigned char *>(src), src_len,
62                        dst, dst_len);
63     // NTOP_READ: Uninitialized bytes in __b64_ntop
64     return 0;
65   }
66 
67   if (strcmp(test, "PTON_READ") == 0) {
68     // Check PTON reading
69     size_t src_len = 80;
70     char src[src_len];
71     strcpy(src, "junk longer than zero");
72     // pretend it is uninitialized
73     __msan_poison(src, src_len);
74     unsigned char target[src_len];
75     int res = b64_pton(src, target, src_len);
76     // PTON_READ: Uninitialized bytes in __b64_pton
77     return 0;
78   }
79 
80   return 0;
81 }
82