Fix snprintf() overflow issues
[akaros.git] / user / utest / devvars.c
1 /* Copyright (c) 2015 Google Inc
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details. */
4
5 #include <utest/utest.h>
6
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10 #include <unistd.h>
11 #include <parlib/net.h>
12
13 TEST_SUITE("DEVVARS");
14
15 static bool test_read_var(const char *name, const char *val)
16 {
17         char buf[128];
18         int fd, ret;
19
20         ret = snprintf(buf, sizeof(buf), "#vars/%s", name);
21         if (snprintf_error(ret, sizeof(buf)))
22                 UT_ASSERT_FMT("snprintf failed!", FALSE);
23         fd = open(buf, O_READ);
24         UT_ASSERT_FMT("Could not open vars file %s, check CONFIG_DEVVARS_TEST",
25                       fd >= 0, buf);
26         ret = read(fd, buf, sizeof(buf));
27         UT_ASSERT_FMT("Could not read vars file %s", ret > 0, buf);
28         UT_ASSERT_FMT("Value differs, got %s, wanted %s", strcmp(buf, val) == 0,
29                       buf, val);
30         return TRUE;
31 }
32
33 bool test_devvars_fmt(void)
34 {
35         if (!test_read_var("s!s", "string"))
36                 return FALSE;
37         if (!test_read_var("c!c", "x"))
38                 return FALSE;
39         if (!test_read_var("u8!ub", "8"))
40                 return FALSE;
41         if (!test_read_var("u16!uh", "16"))
42                 return FALSE;
43         if (!test_read_var("u32!uw", "32"))
44                 return FALSE;
45         if (!test_read_var("u64!ug", "64"))
46                 return FALSE;
47         if (!test_read_var("d8!db", "-8"))
48                 return FALSE;
49         if (!test_read_var("d16!dh", "-16"))
50                 return FALSE;
51         if (!test_read_var("d32!dw", "-32"))
52                 return FALSE;
53         if (!test_read_var("d64!dg", "-64"))
54                 return FALSE;
55         if (!test_read_var("x8!xb", "0x8"))
56                 return FALSE;
57         if (!test_read_var("x16!xh", "0x16"))
58                 return FALSE;
59         if (!test_read_var("x32!xw", "0x32"))
60                 return FALSE;
61         if (!test_read_var("x64!xg", "0x64"))
62                 return FALSE;
63         if (!test_read_var("o8!ob", "01"))
64                 return FALSE;
65         if (!test_read_var("o16!oh", "016"))
66                 return FALSE;
67         if (!test_read_var("o32!ow", "032"))
68                 return FALSE;
69         if (!test_read_var("o64!og", "064"))
70                 return FALSE;
71         return TRUE;
72 }
73
74 static bool test_new_var(const char *name, const char *val)
75 {
76         char buf[128];
77         char path[128];
78         int fd, ret;
79
80         ret = snprintf(path, sizeof(path), "#vars/%s", name);
81         if (snprintf_error(ret, sizeof(path)))
82                 UT_ASSERT_FMT("snprintf failed!", FALSE);
83         fd = open(path, O_READ | O_CREATE, S_IRUSR);
84         UT_ASSERT_FMT("Could not open vars file %s, check CONFIG_DEVVARS_TEST",
85                       fd >= 0, path);
86         ret = read(fd, buf, sizeof(buf));
87         UT_ASSERT_FMT("Could not read vars file %s", ret > 0, path);
88         UT_ASSERT_FMT("Value differs, got %s, wanted %s", strcmp(buf, val) == 0,
89                       buf, val);
90         ret = unlink(path);
91         UT_ASSERT_FMT("Could not remove %s", ret == 0, path);
92         return TRUE;
93 }
94
95 bool test_devvars_newfile(void)
96 {
97         if (!test_new_var("devvars_foobar!s", "foobar"))
98                 return FALSE;
99         return TRUE;
100 }
101
102 /* Make sure test_read_var() knows how to fail */
103 bool test_devvars_test(void)
104 {
105         UT_ASSERT_FMT("Opened when it shouldn't have",
106                       !test_read_var("NO_SUCH_FILE!xw", "0x32"));
107         UT_ASSERT_FMT("Got the wrong value but thought it was fine",
108                       !test_read_var("x32!xw", "0xdeadbeef"));
109         return TRUE;
110 }
111
112 struct utest utests[] = {
113         UTEST_REG(devvars_fmt),
114         UTEST_REG(devvars_newfile),
115         UTEST_REG(devvars_test),
116 };
117 int num_utests = sizeof(utests) / sizeof(struct utest);
118
119 int main(int argc, char *argv[])
120 {
121         char **whitelist = &argv[1];
122         int whitelist_len = argc - 1;
123
124         RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
125 }