Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--lib/libalpm/signing.c49
-rw-r--r--scripts/makepkg.sh.in4
-rw-r--r--scripts/repo-add.sh.in16
-rw-r--r--src/pacman/util.c91
5 files changed, 97 insertions, 67 deletions
diff --git a/NEWS b/NEWS
index 14ba65de..25919bc7 100644
--- a/NEWS
+++ b/NEWS
@@ -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;
}