Fossil SCM
Extra resilience on the automatic chroot mechanism.
Commit
13d3cad50c52037d54d9a1fbf6570e4291ba3d14
Parent
afc4bf41fa54d80…
1 file changed
+6
-4
+6
-4
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -834,19 +834,21 @@ | ||
| 834 | 834 | char *zDir; |
| 835 | 835 | |
| 836 | 836 | file_canonical_name(zRepo, &dir); |
| 837 | 837 | zDir = blob_str(&dir); |
| 838 | 838 | if( file_isdir(zDir)==1 ){ |
| 839 | - chdir(zDir); | |
| 840 | - chroot(zDir); | |
| 839 | + if( chdir(zDir) || chroot(zDir) || chdir("/") ){ | |
| 840 | + fossil_fatal("unable to chroot into %s", zDir); | |
| 841 | + } | |
| 841 | 842 | zRepo = "/"; |
| 842 | 843 | }else{ |
| 843 | 844 | for(i=strlen(zDir)-1; i>0 && zDir[i]!='/'; i--){} |
| 844 | 845 | if( zDir[i]!='/' ) fossil_panic("bad repository name: %s", zRepo); |
| 845 | 846 | zDir[i] = 0; |
| 846 | - chdir(zDir); | |
| 847 | - chroot(zDir); | |
| 847 | + if( chdir(zDir) || chroot(zDir) || chdir("/") ){ | |
| 848 | + fossil_fatal("unable to chroot into %s", zDir); | |
| 849 | + } | |
| 848 | 850 | zDir[i] = '/'; |
| 849 | 851 | zRepo = &zDir[i]; |
| 850 | 852 | } |
| 851 | 853 | if( stat(zRepo, &sStat)!=0 ){ |
| 852 | 854 | fossil_fatal("cannot stat() repository: %s", zRepo); |
| 853 | 855 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -834,19 +834,21 @@ | |
| 834 | char *zDir; |
| 835 | |
| 836 | file_canonical_name(zRepo, &dir); |
| 837 | zDir = blob_str(&dir); |
| 838 | if( file_isdir(zDir)==1 ){ |
| 839 | chdir(zDir); |
| 840 | chroot(zDir); |
| 841 | zRepo = "/"; |
| 842 | }else{ |
| 843 | for(i=strlen(zDir)-1; i>0 && zDir[i]!='/'; i--){} |
| 844 | if( zDir[i]!='/' ) fossil_panic("bad repository name: %s", zRepo); |
| 845 | zDir[i] = 0; |
| 846 | chdir(zDir); |
| 847 | chroot(zDir); |
| 848 | zDir[i] = '/'; |
| 849 | zRepo = &zDir[i]; |
| 850 | } |
| 851 | if( stat(zRepo, &sStat)!=0 ){ |
| 852 | fossil_fatal("cannot stat() repository: %s", zRepo); |
| 853 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -834,19 +834,21 @@ | |
| 834 | char *zDir; |
| 835 | |
| 836 | file_canonical_name(zRepo, &dir); |
| 837 | zDir = blob_str(&dir); |
| 838 | if( file_isdir(zDir)==1 ){ |
| 839 | if( chdir(zDir) || chroot(zDir) || chdir("/") ){ |
| 840 | fossil_fatal("unable to chroot into %s", zDir); |
| 841 | } |
| 842 | zRepo = "/"; |
| 843 | }else{ |
| 844 | for(i=strlen(zDir)-1; i>0 && zDir[i]!='/'; i--){} |
| 845 | if( zDir[i]!='/' ) fossil_panic("bad repository name: %s", zRepo); |
| 846 | zDir[i] = 0; |
| 847 | if( chdir(zDir) || chroot(zDir) || chdir("/") ){ |
| 848 | fossil_fatal("unable to chroot into %s", zDir); |
| 849 | } |
| 850 | zDir[i] = '/'; |
| 851 | zRepo = &zDir[i]; |
| 852 | } |
| 853 | if( stat(zRepo, &sStat)!=0 ){ |
| 854 | fossil_fatal("cannot stat() repository: %s", zRepo); |
| 855 |