[pacman-dev] [PATCH 1/1] fix db filename handling
Christian Hesse
list at eworm.de
Wed Sep 4 11:35:51 EDT 2013
From: Christian Hesse <mail at eworm.de>
If the server redirects from ${repo}.db to ${repo}.db.tar.gz pacman gets
this wrong: It saves to new filename and fails when accessing
${repo}.db.
This introduces a new field 'deny_rename' to payload. If set pacman
downloads to the filename specified in payload.remote_name.
---
lib/libalpm/be_sync.c | 2 ++
lib/libalpm/dload.c | 36 ++++++++++++++++++++----------------
lib/libalpm/dload.h | 1 +
3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 123d953..622153d 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -223,6 +223,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
payload.handle = handle;
payload.force = force;
payload.unlink_on_fail = 1;
+ payload.deny_rename = 1;
ret = _alpm_download(&payload, syncpath, NULL, NULL);
_alpm_dload_payload_reset(&payload);
@@ -245,6 +246,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
snprintf(payload.fileurl, len, "%s/%s.db.sig", server, db->treename);
payload.handle = handle;
payload.force = 1;
+ payload.deny_rename = 1;
payload.errors_ok = (level & ALPM_SIG_DATABASE_OPTIONAL);
/* set hard upper limit of 16KiB */
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 8537b3d..381e548 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -547,23 +547,27 @@ static int curl_download_internal(struct dload_payload *payload,
goto cleanup;
}
- if(payload->content_disp_name) {
- /* content-disposition header has a better name for our file */
- free(payload->destfile_name);
- payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, "");
+ if(payload->deny_rename) {
+ payload->destfile_name = get_fullpath(localpath, payload->remote_name, "");
} else {
- const char *effective_filename = strrchr(effective_url, '/');
- if(effective_filename && strlen(effective_filename) > 2) {
- effective_filename++;
-
- /* if destfile was never set, we wrote to a tempfile. even if destfile is
- * set, we may have followed some redirects and the effective url may
- * have a better suggestion as to what to name our file. in either case,
- * refactor destfile to this newly derived name. */
- if(!payload->destfile_name || strcmp(effective_filename,
- strrchr(payload->destfile_name, '/') + 1) != 0) {
- free(payload->destfile_name);
- payload->destfile_name = get_fullpath(localpath, effective_filename, "");
+ if(payload->content_disp_name) {
+ /* content-disposition header has a better name for our file */
+ free(payload->destfile_name);
+ payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, "");
+ } else {
+ const char *effective_filename = strrchr(effective_url, '/');
+ if(effective_filename && strlen(effective_filename) > 2) {
+ effective_filename++;
+
+ /* if destfile was never set, we wrote to a tempfile. even if destfile is
+ * set, we may have followed some redirects and the effective url may
+ * have a better suggestion as to what to name our file. in either case,
+ * refactor destfile to this newly derived name. */
+ if(!payload->destfile_name || strcmp(effective_filename,
+ strrchr(payload->destfile_name, '/') + 1) != 0) {
+ free(payload->destfile_name);
+ payload->destfile_name = get_fullpath(localpath, effective_filename, "");
+ }
}
}
}
diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h
index 95bb91a..bd01d8b 100644
--- a/lib/libalpm/dload.h
+++ b/lib/libalpm/dload.h
@@ -38,6 +38,7 @@ struct dload_payload {
int allow_resume;
int errors_ok;
int unlink_on_fail;
+ int deny_rename;
alpm_list_t *servers;
#ifdef HAVE_LIBCURL
CURLcode curlerr; /* last error produced by curl */
--
1.8.4
More information about the pacman-dev
mailing list