pacman/callback.c: handle empty pkgname
In pacman's progress callback, pkgname being null may result in a segfault, due to undefined printf behaviour. libalpm always passes at least an empty string for pkgname, so this situation is largely avoided. However, the callback mostly checked for pkgname's being non-null and not empty. This means a additional space was being added to the output messages (although with zero actual effect on the output). Be a bit more robust here by treating null and empty pkgname the same and fixing the invisible output issue... Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
b30dac6a5b
commit
74deada511
1 changed files with 12 additions and 5 deletions
|
@ -569,6 +569,7 @@ void cb_progress(void *ctx, alpm_progress_t event, const char *pkgname,
|
||||||
/* used for wide character width determination and printing */
|
/* used for wide character width determination and printing */
|
||||||
int len, wclen, wcwid, padwid;
|
int len, wclen, wcwid, padwid;
|
||||||
wchar_t *wcstr;
|
wchar_t *wcstr;
|
||||||
|
int has_pkgname = (pkgname && pkgname[0] != '\0' ? 1 : 0);
|
||||||
|
|
||||||
const unsigned short cols = getcols();
|
const unsigned short cols = getcols();
|
||||||
|
|
||||||
|
@ -589,7 +590,7 @@ void cb_progress(void *ctx, alpm_progress_t event, const char *pkgname,
|
||||||
} else {
|
} else {
|
||||||
if(current != prevcurrent) {
|
if(current != prevcurrent) {
|
||||||
/* update always */
|
/* update always */
|
||||||
} else if(!pkgname || percent == prevpercent ||
|
} else if(has_pkgname || percent == prevpercent ||
|
||||||
get_update_timediff(0) < UPDATE_SPEED_MS) {
|
get_update_timediff(0) < UPDATE_SPEED_MS) {
|
||||||
/* only update the progress bar when we have a package name, the
|
/* only update the progress bar when we have a package name, the
|
||||||
* percentage has changed, and it has been long enough. */
|
* percentage has changed, and it has been long enough. */
|
||||||
|
@ -653,19 +654,25 @@ void cb_progress(void *ctx, alpm_progress_t event, const char *pkgname,
|
||||||
* by the output, and then pad it accordingly so we fill the terminal.
|
* by the output, and then pad it accordingly so we fill the terminal.
|
||||||
*/
|
*/
|
||||||
/* len = opr len + pkgname len (if available) + space + null */
|
/* len = opr len + pkgname len (if available) + space + null */
|
||||||
len = strlen(opr) + ((pkgname) ? strlen(pkgname) : 0) + 2;
|
len = strlen(opr) + (has_pkgname ? strlen(pkgname) + 1 : 0) + 1;
|
||||||
wcstr = calloc(len, sizeof(wchar_t));
|
wcstr = calloc(len, sizeof(wchar_t));
|
||||||
/* print our strings to the alloc'ed memory */
|
/* print our strings to the alloc'ed memory */
|
||||||
#if defined(HAVE_SWPRINTF)
|
#if defined(HAVE_SWPRINTF)
|
||||||
|
if(has_pkgname) {
|
||||||
wclen = swprintf(wcstr, len, L"%s %s", opr, pkgname);
|
wclen = swprintf(wcstr, len, L"%s %s", opr, pkgname);
|
||||||
|
} else {
|
||||||
|
wclen = swprintf(wcstr, len, L"%s", opr);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* because the format string was simple, we can easily do this without
|
/* because the format string was simple, we can easily do this without
|
||||||
* using swprintf, although it is probably not as safe/fast. The max
|
* using swprintf, although it is probably not as safe/fast. The max
|
||||||
* chars we can copy is decremented each time by subtracting the length
|
* chars we can copy is decremented each time by subtracting the length
|
||||||
* of the already printed/copied wide char string. */
|
* of the already printed/copied wide char string. */
|
||||||
wclen = mbstowcs(wcstr, opr, len);
|
wclen = mbstowcs(wcstr, opr, len);
|
||||||
|
if(has_pkgname) {
|
||||||
wclen += mbstowcs(wcstr + wclen, " ", len - wclen);
|
wclen += mbstowcs(wcstr + wclen, " ", len - wclen);
|
||||||
wclen += mbstowcs(wcstr + wclen, pkgname, len - wclen);
|
wclen += mbstowcs(wcstr + wclen, pkgname, len - wclen);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
wcwid = wcswidth(wcstr, wclen);
|
wcwid = wcswidth(wcstr, wclen);
|
||||||
padwid = textlen - wcwid;
|
padwid = textlen - wcwid;
|
||||||
|
|
Loading…
Add table
Reference in a new issue