Fossil SCM
When chroot()'ing for root user, close the repo _before_ the chroot, not after. Problem reported via ML.
Commit
e65162b4ad664ae3782598c65ead286fd6acbaf0
Parent
5e6fa72016aafa9…
1 file changed
+4
-4
+4
-4
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -1149,10 +1149,13 @@ | ||
| 1149 | 1149 | if( getuid()==0 ){ |
| 1150 | 1150 | int i; |
| 1151 | 1151 | struct stat sStat; |
| 1152 | 1152 | Blob dir; |
| 1153 | 1153 | char *zDir; |
| 1154 | + if( g.db!=0 ){ | |
| 1155 | + db_close(1); | |
| 1156 | + } | |
| 1154 | 1157 | |
| 1155 | 1158 | file_canonical_name(zRepo, &dir, 0); |
| 1156 | 1159 | zDir = blob_str(&dir); |
| 1157 | 1160 | if( file_isdir(zDir)==1 ){ |
| 1158 | 1161 | if( file_chdir(zDir, 1) ){ |
| @@ -1177,14 +1180,11 @@ | ||
| 1177 | 1180 | i = setgid(sStat.st_gid); |
| 1178 | 1181 | i = i || setuid(sStat.st_uid); |
| 1179 | 1182 | if(i){ |
| 1180 | 1183 | fossil_fatal("setgid/uid() failed with errno %d", errno); |
| 1181 | 1184 | } |
| 1182 | - if( g.db!=0 ){ | |
| 1183 | - db_close(1); | |
| 1184 | - db_open_repository(zRepo); | |
| 1185 | - } | |
| 1185 | + db_open_repository(zRepo); | |
| 1186 | 1186 | } |
| 1187 | 1187 | #endif |
| 1188 | 1188 | return zRepo; |
| 1189 | 1189 | } |
| 1190 | 1190 | |
| 1191 | 1191 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -1149,10 +1149,13 @@ | |
| 1149 | if( getuid()==0 ){ |
| 1150 | int i; |
| 1151 | struct stat sStat; |
| 1152 | Blob dir; |
| 1153 | char *zDir; |
| 1154 | |
| 1155 | file_canonical_name(zRepo, &dir, 0); |
| 1156 | zDir = blob_str(&dir); |
| 1157 | if( file_isdir(zDir)==1 ){ |
| 1158 | if( file_chdir(zDir, 1) ){ |
| @@ -1177,14 +1180,11 @@ | |
| 1177 | i = setgid(sStat.st_gid); |
| 1178 | i = i || setuid(sStat.st_uid); |
| 1179 | if(i){ |
| 1180 | fossil_fatal("setgid/uid() failed with errno %d", errno); |
| 1181 | } |
| 1182 | if( g.db!=0 ){ |
| 1183 | db_close(1); |
| 1184 | db_open_repository(zRepo); |
| 1185 | } |
| 1186 | } |
| 1187 | #endif |
| 1188 | return zRepo; |
| 1189 | } |
| 1190 | |
| 1191 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -1149,10 +1149,13 @@ | |
| 1149 | if( getuid()==0 ){ |
| 1150 | int i; |
| 1151 | struct stat sStat; |
| 1152 | Blob dir; |
| 1153 | char *zDir; |
| 1154 | if( g.db!=0 ){ |
| 1155 | db_close(1); |
| 1156 | } |
| 1157 | |
| 1158 | file_canonical_name(zRepo, &dir, 0); |
| 1159 | zDir = blob_str(&dir); |
| 1160 | if( file_isdir(zDir)==1 ){ |
| 1161 | if( file_chdir(zDir, 1) ){ |
| @@ -1177,14 +1180,11 @@ | |
| 1180 | i = setgid(sStat.st_gid); |
| 1181 | i = i || setuid(sStat.st_uid); |
| 1182 | if(i){ |
| 1183 | fossil_fatal("setgid/uid() failed with errno %d", errno); |
| 1184 | } |
| 1185 | db_open_repository(zRepo); |
| 1186 | } |
| 1187 | #endif |
| 1188 | return zRepo; |
| 1189 | } |
| 1190 | |
| 1191 |