diff options
author | Timo Teräs <timo.teras@iki.fi> | 2011-05-27 16:49:25 +0300 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2011-05-27 16:49:25 +0300 |
commit | 95555ede4d732878d576415e5d338b0104b78ad6 (patch) | |
tree | 46c3d178e32f75480f834be897ce2b03f1a3bbd2 /src | |
parent | 38e54240a38266c0c1864e51e4ca7468a429646e (diff) | |
download | apk-tools-95555ede4d732878d576415e5d338b0104b78ad6.tar.gz apk-tools-95555ede4d732878d576415e5d338b0104b78ad6.tar.bz2 apk-tools-95555ede4d732878d576415e5d338b0104b78ad6.tar.xz apk-tools-95555ede4d732878d576415e5d338b0104b78ad6.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/apk_database.h | 1 | ||||
-rw-r--r-- | src/database.c | 31 | ||||
-rw-r--r-- | src/url.c | 1 |
3 files changed, 15 insertions, 18 deletions
diff --git a/src/apk_database.h b/src/apk_database.h index 9b032e7..b28a77b 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -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; diff --git a/src/database.c b/src/database.c index 0fc59df..9617b4e 100644 --- a/src/database.c +++ b/src/database.c @@ -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)); @@ -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) { |