diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | lib/libalpm/signing.c | 49 | ||||
-rw-r--r-- | scripts/makepkg.sh.in | 4 | ||||
-rw-r--r-- | scripts/repo-add.sh.in | 16 | ||||
-rw-r--r-- | src/pacman/util.c | 91 |
5 files changed, 97 insertions, 67 deletions
@@ -1,5 +1,8 @@ VERSION DESCRIPTION ----------------------------------------------------------------------------- +4.0.1 - ensure VerbosePkgList table display supports multibyte chars + - add guidance message for users when public keyring not found + - repo-add: fix race condition around lock file removal 4.0.0 - well-integrated and powerful signed packages and databases support in pacman, the library, and scripts (FS#5331) - over 800 commits to pacman.git since 3.5.4 release @@ -44,6 +47,7 @@ VERSION DESCRIPTION - makepkg: - allow signing packages after creation - allow verifying source file signatures (FS#20448) + - add auto-versioned libdepends/libprovides support - support UPX compression of executables (FS#17213) - allow usage of an alternate build directory (FS#22308) - cleancache option has been removed; use shell instead diff --git a/lib/libalpm/signing.c b/lib/libalpm/signing.c index c30cda09..bdaa83ad 100644 --- a/lib/libalpm/signing.c +++ b/lib/libalpm/signing.c @@ -140,6 +140,9 @@ static int init_gpgme(alpm_handle_t *handle) || _alpm_access(handle, sigdir, "trustdb.gpg", R_OK)) { handle->pm_errno = ALPM_ERR_NOT_A_FILE; _alpm_log(handle, ALPM_LOG_DEBUG, "Signature verification will fail!\n"); + _alpm_log(handle, ALPM_LOG_WARNING, + _("Public keyring not found; have you run '%s'?\n"), + "pacman-key --init"); } /* calling gpgme_check_version() returns the current version and runs @@ -370,7 +373,7 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path, const char *base64_sig, alpm_siglist_t *siglist) { int ret = -1, sigcount; - gpgme_error_t err; + gpgme_error_t err = 0; gpgme_ctx_t ctx; gpgme_data_t filedata, sigdata; gpgme_verify_result_t verify_result; @@ -394,9 +397,27 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path, _alpm_access(handle, NULL, sigpath, R_OK); } + /* does the file we are verifying exist? */ + file = fopen(path, "rb"); + if(file == NULL) { + handle->pm_errno = ALPM_ERR_NOT_A_FILE; + goto error; + } + + /* does the sig file exist (if we didn't get the data directly)? */ + if(!base64_sig) { + sigfile = fopen(sigpath, "rb"); + if(sigfile == NULL) { + _alpm_log(handle, ALPM_LOG_DEBUG, "sig path %s could not be opened\n", + sigpath); + handle->pm_errno = ALPM_ERR_SIG_MISSING; + goto error; + } + } + if(init_gpgme(handle)) { /* pm_errno was set in gpgme_init() */ - return -1; + goto error; } _alpm_log(handle, ALPM_LOG_DEBUG, "checking signature for %s\n", path); @@ -409,11 +430,6 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path, CHECK_ERR(); /* create our necessary data objects to verify the signature */ - file = fopen(path, "rb"); - if(file == NULL) { - handle->pm_errno = ALPM_ERR_NOT_A_FILE; - goto error; - } err = gpgme_data_new_from_stream(&filedata, file); CHECK_ERR(); @@ -425,19 +441,12 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path, &decoded_sigdata, &data_len); if(decode_ret) { handle->pm_errno = ALPM_ERR_SIG_INVALID; - goto error; + goto gpg_error; } err = gpgme_data_new_from_mem(&sigdata, (char *)decoded_sigdata, data_len, 0); } else { /* file-based, it is on disk */ - sigfile = fopen(sigpath, "rb"); - if(sigfile == NULL) { - _alpm_log(handle, ALPM_LOG_DEBUG, "sig path %s could not be opened\n", - sigpath); - handle->pm_errno = ALPM_ERR_SIG_MISSING; - goto error; - } err = gpgme_data_new_from_stream(&sigdata, sigfile); } CHECK_ERR(); @@ -450,14 +459,14 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path, if(!verify_result || !verify_result->signatures) { _alpm_log(handle, ALPM_LOG_DEBUG, "no signatures returned\n"); handle->pm_errno = ALPM_ERR_SIG_MISSING; - goto error; + goto gpg_error; } for(gpgsig = verify_result->signatures, sigcount = 0; gpgsig; gpgsig = gpgsig->next, sigcount++); _alpm_log(handle, ALPM_LOG_DEBUG, "%d signatures returned\n", sigcount); CALLOC(siglist->results, sigcount, sizeof(alpm_sigresult_t), - handle->pm_errno = ALPM_ERR_MEMORY; goto error); + handle->pm_errno = ALPM_ERR_MEMORY; goto gpg_error); siglist->count = sigcount; for(gpgsig = verify_result->signatures, sigcount = 0; gpgsig; @@ -488,7 +497,7 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path, err = GPG_ERR_NO_ERROR; /* we dupe the fpr in this case since we have no key to point at */ STRDUP(result->key.fingerprint, gpgsig->fpr, - handle->pm_errno = ALPM_ERR_MEMORY; goto error); + handle->pm_errno = ALPM_ERR_MEMORY; goto gpg_error); } else { CHECK_ERR(); if(key->uids) { @@ -555,10 +564,12 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path, ret = 0; -error: +gpg_error: gpgme_data_release(sigdata); gpgme_data_release(filedata); gpgme_release(ctx); + +error: if(sigfile) { fclose(sigfile); } diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 50cf2725..09c1e963 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -179,7 +179,9 @@ clean_up() { ## set -E trap 'clean_up' 0 -trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT +for signal in TERM HUP QUIT; do + trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal" +done trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index ff3511c1..fc008fc4 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -520,13 +520,19 @@ remove() { } trap_exit() { + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR + echo error "$@" - exit 1 + clean_up 1 } clean_up() { - local exit_code=$? + local exit_code=${1:-$?} + + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR [[ -d $tmpdir ]] && rm -rf "$tmpdir" (( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE" @@ -566,9 +572,11 @@ tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\ mkdir $tmpdir/tree trap 'clean_up' EXIT -trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT +for signal in TERM HUP QUIT; do + trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal" +done trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT -trap 'trap_exit "$(gettext "An unknown error has occured. Exiting...")"' ERR +trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR declare -a args success=0 diff --git a/src/pacman/util.c b/src/pacman/util.c index 808867a2..278b65c1 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -488,34 +488,47 @@ void string_display(const char *title, const char *string) } static void table_print_line(const alpm_list_t *line, - const alpm_list_t *formats) + size_t colcount, size_t *widths) { - const alpm_list_t *curformat = formats; - const alpm_list_t *curcell = line; - - while(curcell && curformat) { - printf(curformat->data, curcell->data); - curcell = alpm_list_next(curcell); - curformat = alpm_list_next(curformat); + size_t i; + const alpm_list_t *curcell; + + for(i = 0, curcell = line; curcell && i < colcount; + i++, curcell = alpm_list_next(curcell)) { + const char *value = curcell->data; + size_t len = string_length(value); + /* silly printf requires padding size to be an int */ + int padding = (int)widths[i] - (int)len; + if(padding < 0) { + padding = 0; + } + /* left-align all but the last column */ + if(i + 1 < colcount) { + printf("%s%*s", value, padding, ""); + } else { + printf("%*s%s", padding, "", value); + } } printf("\n"); } -/* creates format strings by checking max cell lengths in cols */ -static alpm_list_t *table_create_format(const alpm_list_t *header, - const alpm_list_t *rows) +/* find the max string width of each column */ +static size_t table_calc_widths(const alpm_list_t *header, + const alpm_list_t *rows, size_t totalcols, size_t **widths) { - alpm_list_t *formats = NULL; const alpm_list_t *i; const unsigned short padding = 2; - size_t curcol, totalcols, totalwidth = 0; + size_t curcol, totalwidth = 0; size_t *colwidths; - totalcols = alpm_list_count(header); + if(totalcols <= 0) { + return 0; + } + colwidths = malloc(totalcols * sizeof(size_t)); if(!colwidths) { - return NULL; + return 0; } /* header determines column count and initial values of longest_strs */ for(i = header, curcol = 0; i; i = alpm_list_next(i), curcol++) { @@ -536,30 +549,16 @@ static alpm_list_t *table_create_format(const alpm_list_t *header, } } - /* now use the column width info to generate format strings */ - for(curcol = 0; curcol < totalcols; curcol++) { - const char *display; - char *formatstr; - size_t colwidth = colwidths[curcol] + padding; - totalwidth += colwidth; - - /* right align the last column for a cleaner table display */ - display = (curcol + 1 < totalcols) ? "%%-%ds" : "%%%ds"; - pm_asprintf(&formatstr, display, colwidth); - - formats = alpm_list_add(formats, formatstr); - } - - free(colwidths); - - /* return NULL if terminal is not wide enough */ - if(totalwidth > getcols()) { - fprintf(stderr, _("insufficient columns available for table display\n")); - FREELIST(formats); - return NULL; + for(i = header, curcol = 0; i; i = alpm_list_next(i), curcol++) { + /* pad everything but the last column */ + if(curcol + 1 < totalcols) { + colwidths[curcol] += padding; + } + totalwidth += colwidths[curcol]; } - return formats; + *widths = colwidths; + return totalwidth; } /** Displays the list in table format @@ -576,14 +575,20 @@ int table_display(const char *title, const alpm_list_t *header, const alpm_list_t *rows) { const alpm_list_t *i; - alpm_list_t *formats; + size_t *widths = NULL, totalcols, totalwidth; if(rows == NULL || header == NULL) { return 0; } - formats = table_create_format(header, rows); - if(formats == NULL) { + totalcols = alpm_list_count(header); + totalwidth = table_calc_widths(header, rows, totalcols, &widths); + /* return -1 if terminal is not wide enough */ + if(totalwidth > getcols()) { + fprintf(stderr, _("insufficient columns available for table display\n")); + return -1; + } + if(!totalwidth || !widths) { return -1; } @@ -591,14 +596,14 @@ int table_display(const char *title, const alpm_list_t *header, printf("%s\n\n", title); } - table_print_line(header, formats); + table_print_line(header, totalcols, widths); printf("\n"); for(i = rows; i; i = alpm_list_next(i)) { - table_print_line(i->data, formats); + table_print_line(i->data, totalcols, widths); } - FREELIST(formats); + free(widths); return 0; } |