summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/pacman/check.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/src/pacman/check.c b/src/pacman/check.c
index 0fe74e83..d282cc27 100644
--- a/src/pacman/check.c
+++ b/src/pacman/check.c
@@ -254,7 +254,6 @@ int check_pkg_full(alpm_pkg_t *pkg)
const char *root, *pkgname;
size_t errors = 0;
size_t rootlen;
- char filepath[PATH_MAX];
struct archive *mtree;
struct archive_entry *entry = NULL;
size_t file_count = 0;
@@ -267,7 +266,6 @@ int check_pkg_full(alpm_pkg_t *pkg)
pm_printf(ALPM_LOG_ERROR, _("path too long: %s%s\n"), root, "");
return 1;
}
- strcpy(filepath, root);
pkgname = alpm_pkg_get_name(pkg);
mtree = alpm_pkg_mtree_open(pkg);
@@ -282,6 +280,8 @@ int check_pkg_full(alpm_pkg_t *pkg)
while(alpm_pkg_mtree_next(pkg, mtree, &entry) == ARCHIVE_OK) {
struct stat st;
const char *path = archive_entry_pathname(entry);
+ char filepath[PATH_MAX];
+ int filepath_len;
mode_t type;
size_t file_errors = 0;
int backup = 0;
@@ -292,31 +292,37 @@ int check_pkg_full(alpm_pkg_t *pkg)
path += 2;
}
- if(strcmp(path, ".INSTALL") == 0) {
- char filename[PATH_MAX];
- snprintf(filename, PATH_MAX, "%slocal/%s-%s/install",
- alpm_option_get_dbpath(config->handle) + 1,
- pkgname, alpm_pkg_get_version(pkg));
- archive_entry_set_pathname(entry, filename);
- path = archive_entry_pathname(entry);
- } else if(strcmp(path, ".CHANGELOG") == 0) {
- char filename[PATH_MAX];
- snprintf(filename, PATH_MAX, "%slocal/%s-%s/changelog",
- alpm_option_get_dbpath(config->handle) + 1,
- pkgname, alpm_pkg_get_version(pkg));
- archive_entry_set_pathname(entry, filename);
- path = archive_entry_pathname(entry);
- } else if(*path == '.') {
- continue;
- }
+ if(*path == '.') {
+ const char *dbfile = NULL;
- file_count++;
+ if(strcmp(path, ".INSTALL") == 0) {
+ dbfile = "install";
+ } else if(strcmp(path, ".CHANGELOG") == 0) {
+ dbfile = "changelog";
+ } else {
+ continue;
+ }
- if(rootlen + 1 + strlen(path) > PATH_MAX) {
- pm_printf(ALPM_LOG_WARNING, _("path too long: %s%s\n"), root, path);
- continue;
+ /* Do not append root directory as alpm_option_get_dbpath is already
+ * an absoute path */
+ filepath_len = snprintf(filepath, PATH_MAX, "%slocal/%s-%s/%s",
+ alpm_option_get_dbpath(config->handle),
+ pkgname, alpm_pkg_get_version(pkg), dbfile);
+ if(filepath_len >= PATH_MAX) {
+ pm_printf(ALPM_LOG_WARNING, _("path too long: %slocal/%s-%s/%s\n"),
+ alpm_option_get_dbpath(config->handle),
+ pkgname, alpm_pkg_get_version(pkg), dbfile);
+ continue;
+ }
+ } else {
+ filepath_len = snprintf(filepath, PATH_MAX, "%s%s", root, path);
+ if(filepath_len >= PATH_MAX) {
+ pm_printf(ALPM_LOG_WARNING, _("path too long: %s%s\n"), root, path);
+ continue;
+ }
}
- strcpy(filepath + rootlen, path);
+
+ file_count++;
exists = check_file_exists(pkgname, filepath, rootlen, &st);
if(exists == 1) {