db: more fix for read-only cache remounting

remount to read-write before trying to create the cache directory
subdirs. fix a fd leak that might prevent remounting back to rw.
cute-signatures
Timo Teräs 2011-05-27 16:49:25 +03:00
parent 38e54240a3
commit 95555ede4d
3 changed files with 15 additions and 18 deletions

View File

@ -110,7 +110,6 @@ struct apk_database {
apk_blob_t *arch;
unsigned int local_repos;
int permanent : 1;
int ro_cache : 1;
int compat_newfeatures : 1;
int compat_notinstallable : 1;

View File

@ -1218,10 +1218,22 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
db->cache_dir = apk_linked_cache_dir;
db->cache_fd = fd;
if ((dbopts->open_flags & (APK_OPENF_WRITE | APK_OPENF_CACHE_WRITE)) &&
fstatvfs(fd, &stvfs) == 0 && (stvfs.f_flag & ST_RDONLY) != 0) {
/* remount cache read-write */
db->cache_remount_dir = find_mountpoint(db->root_fd, db->cache_dir);
if (db->cache_remount_dir == NULL) {
apk_warning("Unable to find cache directory mount point");
} else if (do_remount(db->cache_remount_dir, "rw") != 0) {
free(db->cache_remount_dir);
db->cache_remount_dir = NULL;
apk_error("Unable to remount cache read-write");
r = EROFS;
goto ret_r;
}
}
mkdirat(db->cache_fd, "tmp", 0644);
db->cachetmp_fd = openat(db->cache_fd, "tmp", O_RDONLY | O_CLOEXEC);
if (fstatvfs(fd, &stvfs) == 0 && (stvfs.f_flag & ST_RDONLY) != 0)
db->ro_cache = 1;
} else {
if (fd >= 0)
close(fd);
@ -1264,21 +1276,6 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
}
}
if ((dbopts->open_flags & (APK_OPENF_WRITE | APK_OPENF_CACHE_WRITE)) &&
db->ro_cache) {
/* remount cache read-write */
db->cache_remount_dir = find_mountpoint(db->root_fd, db->cache_dir);
if (db->cache_remount_dir == NULL) {
apk_warning("Unable to find cache directory mount point");
} else if (do_remount(db->cache_remount_dir, "rw") != 0) {
free(db->cache_remount_dir);
db->cache_remount_dir = NULL;
apk_error("Unable to remount cache read-write");
r = EROFS;
goto ret_r;
}
}
if (!(dbopts->open_flags & APK_OPENF_NO_SYS_REPOS)) {
list_for_each_entry(repo, &dbopts->repository_list, list) {
r = apk_db_add_repository(db, APK_BLOB_STR(repo->url));

View File

@ -136,6 +136,7 @@ int apk_url_download(const char *url, int atfd, const char *file)
exit(0);
}
close(fd);
waitpid(pid, &status, 0);
status = translate_wget(status);
if (status != 0) {