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