1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.unix.Chroot -analyzer-store region -verify %s
21c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu
31c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xuextern int chroot(const char* path);
41c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xuextern int chdir(const char* path);
51c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu
61c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xuvoid foo(void) {
71c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu}
81c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu
91c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xuvoid f1(void) {
101c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  chroot("/usr/local"); // root changed.
111c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  foo(); // expected-warning {{No call of chdir("/") immediately after chroot}}
121c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu}
131c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu
141c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xuvoid f2(void) {
151c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  chroot("/usr/local"); // root changed.
161c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  chdir("/"); // enter the jail.
171c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  foo(); // no-warning
181c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu}
191c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu
201c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xuvoid f3(void) {
211c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  chroot("/usr/local"); // root changed.
221c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  chdir("../"); // change working directory, still out of jail.
231c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu  foo(); // expected-warning {{No call of chdir("/") immediately after chroot}}
241c9e6b1bad53486efd12564f76e960efd0d9dd61Zhongxing Xu}
25