This patch fixes several places where an unavailable (NULL) backup hash may be
passed to a printf() call, which segfaults on some libcs.  This includes
local database writes where unavailable hashes are represented by the file
name only.  This condition may occur when an updated package changes the
contents of its backup=() list.

Signed-off-by: Will Miles <wmi...@sgl.com>
---
 lib/libalpm/add.c      | 6 +++---
 lib/libalpm/be_local.c | 6 +++++-
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index f5c9a95..629e2a5 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -339,9 +339,9 @@ static int extract_single_file(alpm_handle_t *handle, 
struct archive *archive,
                hash_pkg = backup ? backup->hash : 
alpm_compute_md5sum(filename);
 
                _alpm_log(handle, ALPM_LOG_DEBUG, "checking hashes for %s\n", 
origfile);
-               _alpm_log(handle, ALPM_LOG_DEBUG, "current:  %s\n", hash_local);
-               _alpm_log(handle, ALPM_LOG_DEBUG, "new:      %s\n", hash_pkg);
-               _alpm_log(handle, ALPM_LOG_DEBUG, "original: %s\n", hash_orig);
+               _alpm_log(handle, ALPM_LOG_DEBUG, "current:  %s\n", (hash_local 
? hash_local : "NULL") );
+               _alpm_log(handle, ALPM_LOG_DEBUG, "new:      %s\n", (hash_pkg ? 
hash_pkg : "NULL") );
+               _alpm_log(handle, ALPM_LOG_DEBUG, "original: %s\n", (hash_orig 
? hash_orig : "NULL") );
 
                if(hash_local && hash_pkg && strcmp(hash_local, hash_pkg) == 0) 
{
                        /* local and new files are the same, updating anyway to 
get
diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
index f817822..21166cb 100644
--- a/lib/libalpm/be_local.c
+++ b/lib/libalpm/be_local.c
@@ -1037,7 +1037,11 @@ int _alpm_local_db_write(alpm_db_t *db, alpm_pkg_t 
*info, alpm_dbinfrq_t inforeq
                        fputs("%BACKUP%\n", fp);
                        for(lp = info->backup; lp; lp = lp->next) {
                                const alpm_backup_t *backup = lp->data;
-                               fprintf(fp, "%s\t%s\n", backup->name, 
backup->hash);
+                               if (backup->hash) {
+                                       fprintf(fp, "%s\t%s\n", backup->name, 
backup->hash);
+                               } else {
+                                       fprintf(fp, "%s\n", backup->name);
+                               }
                        }
                        fputc('\n', fp);
                }
-- 
2.6.3

Reply via email to