[pacman-dev] [PATCH] libalpm: Force update when database is marked as corrupted.
Allan McRae
allan at archlinux.org
Sun Jul 5 11:53:30 UTC 2015
On 05/07/15 02:39, Sebastian Lackner wrote:
> We are using a CDN to distribute our packages, and it happens from time to time
> that the *.db and *.db.sig files are out-of-sync. When the signature is updated
> before the database file, everything is fine. However, when the database is
> updated first, then libalpm will update the timestamp of the database, but leave
> it in a broken state (wrong PGP signature). A force-update is required to
> resolve this, which can be confusing for our users - this patch changes
> alpm_db_update to trigger an update automatically when the database is invalid.
>
> Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
I have never thought about this issue given I always assumed that a
database and signature update would be atomic.
I am OK with this workaround. I will commit with the commit message
changed to:
When a database and its signature is updated non-atomically on a server,
there is a window where a user may update the database but grab the old
signature. The database is marked as invalid by libalpm, which can be
fixed by forcing a refresh (assuming the server has caught up and the
user realizes what has happened) or with a future update of the repo.
Work around this by forcing a repository refresh whenever a database is
invalid.
> ---
> lib/libalpm/be_sync.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
> index ea979e6..68c5b43 100644
> --- a/lib/libalpm/be_sync.c
> +++ b/lib/libalpm/be_sync.c
> @@ -196,6 +196,10 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
> return -1;
> }
>
A comment needs added here.
> + if(db->status & DB_STATUS_INVALID) {
> + force = 1;
> + }
> +
> /* make sure we have a sane umask */
> oldmask = umask(0022);
>
>
More information about the pacman-dev
mailing list