From a1ff7d8c72a1a659a4624d768930ad803c83aac5 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Tue, 20 May 2025 13:20:45 +0100 Subject: [PATCH] libalpm: set errno and log when setting up temp download dir Before: % pacman -Syy :: Synchronising package databases... error: failed to synchronize all databases (unexpected error) After: % pacman -Syy :: Synchronising package databases... error: failed to create temporary download directory /var/lib/pacman/sync/download-P77oXs: Permission denied error: failed to synchronize all databases (failed to retrieve some files) --- lib/libalpm/util.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 8577eb42..058bb77f 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -23,6 +23,7 @@ */ #include +#include #include #include #include @@ -959,24 +960,43 @@ char *_alpm_temporary_download_dir_setup(alpm_handle_t *handle, const char *dir) uid_t myuid = getuid(); struct passwd const *pw = NULL; - ASSERT(dir != NULL, return NULL); + ASSERT(dir != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL)); if(myuid == 0 && user != NULL) { - ASSERT((pw = getpwnam(user)) != NULL, return NULL); + errno = 0; + pw = getpwnam(user); + + if(pw == NULL) { + if(errno == 0) { + _alpm_log(handle, ALPM_LOG_ERROR, + _("download user '%s' does not exist\n"), user); + } else { + _alpm_log(handle, ALPM_LOG_ERROR, + _("failed to get download user '%s': %s\n"), + user, strerror(errno)); + } + RET_ERR(handle, ALPM_ERR_RETRIEVE, NULL); + } } const char template[] = "download-XXXXXX"; size_t newdirlen = strlen(dir) + sizeof(template) + 1; char *newdir = NULL; - MALLOC(newdir, newdirlen, return NULL); + MALLOC(newdir, newdirlen, RET_ERR(handle, ALPM_ERR_MEMORY, NULL)); snprintf(newdir, newdirlen - 1, "%s%s", dir, template); if(mkdtemp(newdir) == NULL) { + _alpm_log(handle, ALPM_LOG_ERROR, + _("failed to create temporary download directory %s: %s\n"), + newdir, strerror(errno)); free(newdir); - return NULL; + RET_ERR(handle, ALPM_ERR_RETRIEVE, NULL); } if(pw != NULL) { if(chown(newdir, pw->pw_uid, pw->pw_gid) == -1) { + _alpm_log(handle, ALPM_LOG_ERROR, + _("failed to chown temporary download directory %s: %s\n"), + newdir, strerror(errno)); free(newdir); - return NULL; + RET_ERR(handle, ALPM_ERR_RETRIEVE, NULL); } } newdir[newdirlen-2] = '/';