| // RUN: %clang_analyze_cc1 -analyzer-checker=unix.Chroot -analyzer-output=text -verify %s | |
| extern int chroot(const char* path); | |
| extern int chdir(const char* path); | |
| void foo(void) { | |
| } | |
| void f1(void) { | |
| chroot("/usr/local"); // expected-note {{chroot called here}} | |
| foo(); | |
| // expected-warning@-1 {{No call of chdir("/") immediately after chroot}} | |
| // expected-note@-2 {{No call of chdir("/") immediately after chroot}} | |
| } | |
| void f2(void) { | |
| chroot("/usr/local"); // root changed. | |
| chdir("/"); // enter the jail. | |
| foo(); // no-warning | |
| } | |
| void f3(void) { | |
| chroot("/usr/local"); // expected-note {{chroot called here}} | |
| chdir("../"); // change working directory, still out of jail. | |
| foo(); | |
| // expected-warning@-1 {{No call of chdir("/") immediately after chroot}} | |
| // expected-note@-2 {{No call of chdir("/") immediately after chroot}} | |
| } | |
| void f4(void) { | |
| if (chroot("/usr/local") == 0) { | |
| chdir("../"); // change working directory, still out of jail. | |
| } | |
| } | |
| void f5(void) { | |
| int v = chroot("/usr/local"); | |
| if (v == -1) { | |
| foo(); // no warning, chroot failed | |
| chdir("../"); // change working directory, still out of jail. | |
| } | |
| } | |
| void f6(void) { | |
| if (chroot("/usr/local") == -1) { | |
| chdir("../"); // change working directory, still out of jail. | |
| } | |
| } | |
| void f7(void) { | |
| int v = chroot("/usr/local"); // expected-note {{chroot called here}} | |
| if (v == -1) { // expected-note {{Taking false branch}} | |
| foo(); // no warning, chroot failed | |
| chdir("../"); // change working directory, still out of jail. | |
| } else { | |
| foo(); | |
| // expected-warning@-1 {{No call of chdir("/") immediately after chroot}} | |
| // expected-note@-2 {{No call of chdir("/") immediately after chroot}} | |
| } | |
| } | |
| void f8() { | |
| chroot("/usr/local"); // expected-note {{chroot called here}} | |
| chdir("/usr"); // This chdir was ineffective because it's not exactly `chdir("/")`. | |
| foo(); | |
| // expected-warning@-1 {{No call of chdir("/") immediately after chroot}} | |
| // expected-note@-2 {{No call of chdir("/") immediately after chroot}} | |
| } |