diff options
Diffstat (limited to 'lib/libalpm/conflict.c')
-rw-r--r-- | lib/libalpm/conflict.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c index f686ca82..486f4bf3 100644 --- a/lib/libalpm/conflict.c +++ b/lib/libalpm/conflict.c @@ -473,16 +473,18 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle, continue; } + _alpm_log(handle, ALPM_LOG_DEBUG, "checking possible conflict: %s\n", path); + if(S_ISDIR(file->mode)) { struct stat sbuf; if(S_ISDIR(lsbuf.st_mode)) { - _alpm_log(handle, ALPM_LOG_DEBUG, "%s is a directory, not a conflict\n", path); + _alpm_log(handle, ALPM_LOG_DEBUG, "file is a directory, not a conflict\n"); continue; } stat(path, &sbuf); if(S_ISLNK(lsbuf.st_mode) && S_ISDIR(sbuf.st_mode)) { _alpm_log(handle, ALPM_LOG_DEBUG, - "%s is a symlink to a dir, hopefully not a conflict\n", path); + "file is a symlink to a dir, hopefully not a conflict\n"); continue; } /* if we made it to here, we want all subsequent path comparisons to @@ -491,7 +493,6 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle, path[strlen(path) - 1] = '\0'; } - _alpm_log(handle, ALPM_LOG_DEBUG, "checking possible conflict: %s\n", path); relative_path = path + strlen(handle->root); /* Check remove list (will we remove the conflicting local file?) */ @@ -500,7 +501,7 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle, if(rempkg && _alpm_filelist_contains(alpm_pkg_get_files(rempkg), relative_path)) { _alpm_log(handle, ALPM_LOG_DEBUG, - "local file will be removed, not a conflict: %s\n", path); + "local file will be removed, not a conflict\n"); resolved_conflict = 1; } } @@ -521,7 +522,7 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle, handle->trans->skip_remove = alpm_list_add(handle->trans->skip_remove, strdup(filestr)); _alpm_log(handle, ALPM_LOG_DEBUG, - "file changed packages, adding to remove skiplist: %s\n", path); + "file changed packages, adding to remove skiplist\n"); resolved_conflict = 1; } } @@ -539,16 +540,20 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle, free(dir); } - if(!resolved_conflict && dbpkg) { + /* check if a component of the filepath was a link. canonicalize the path + * and look for it in the old package. note that the actual file under + * consideration cannot itself be a link, as it might be unowned- path + * components can be safely checked as all directories are "unowned". */ + if(!resolved_conflict && dbpkg && !S_ISLNK(lsbuf.st_mode)) { char *rpath = calloc(PATH_MAX, sizeof(char)); const char *relative_rpath; - if(!realpath(path, rpath)) { - free(rpath); - continue; - } - relative_rpath = rpath + strlen(handle->root); - if(_alpm_filelist_contains(alpm_pkg_get_files(dbpkg), relative_rpath)) { - resolved_conflict = 1; + if(realpath(path, rpath)) { + relative_rpath = rpath + strlen(handle->root); + if(_alpm_filelist_contains(alpm_pkg_get_files(dbpkg), relative_rpath)) { + _alpm_log(handle, ALPM_LOG_DEBUG, + "package contained the resolved realpath\n"); + resolved_conflict = 1; + } } free(rpath); } @@ -564,7 +569,7 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle, } if(!found) { _alpm_log(handle, ALPM_LOG_DEBUG, - "file was unowned but in new backup list: %s\n", path); + "file was unowned but in new backup list\n"); resolved_conflict = 1; } } |