query_fileowner: resolve root early

Resolving root early prevents later calls to realpath from having to do the
work of actually resolving any symlinks in root.

Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Andrew Gregory 2012-07-26 01:01:50 -04:00 committed by Dan McGee
parent 9648887481
commit 140c76d328

View file

@ -94,7 +94,6 @@ static int query_fileowner(alpm_list_t *targets)
{ {
int ret = 0; int ret = 0;
char path[PATH_MAX]; char path[PATH_MAX];
const char *root;
size_t rootlen; size_t rootlen;
alpm_list_t *t; alpm_list_t *t;
alpm_db_t *db_local; alpm_db_t *db_local;
@ -108,14 +107,24 @@ static int query_fileowner(alpm_list_t *targets)
/* Set up our root path buffer. We only need to copy the location of root in /* Set up our root path buffer. We only need to copy the location of root in
* once, then we can just overwrite whatever file was there on the previous * once, then we can just overwrite whatever file was there on the previous
* iteration. */ * iteration. */
root = alpm_option_get_root(config->handle);
rootlen = strlen(root); /* resolve root now so any symlinks in it will only have to be resolved once */
if(rootlen + 1 > PATH_MAX) { if(!realpath(alpm_option_get_root(config->handle), path)) {
/* we are in trouble here */ pm_printf(ALPM_LOG_ERROR, _("cannot determine real path for '%s': %s\n"),
pm_printf(ALPM_LOG_ERROR, _("path too long: %s%s\n"), root, ""); path, strerror(errno));
return 1; return 1;
} }
strcpy(path, root);
/* make sure there's enough room to append the package file to path */
rootlen = strlen(path);
if(rootlen + 2 > PATH_MAX) {
pm_printf(ALPM_LOG_ERROR, _("path too long: %s%s\n"), path, "");
return 1;
}
/* append trailing '/' removed by realpath */
path[rootlen++] = '/';
path[rootlen] = '\0';
db_local = alpm_get_localdb(config->handle); db_local = alpm_get_localdb(config->handle);
@ -201,7 +210,7 @@ static int query_fileowner(alpm_list_t *targets)
} }
if(rootlen + 1 + strlen(pkgfile) > PATH_MAX) { if(rootlen + 1 + strlen(pkgfile) > PATH_MAX) {
pm_printf(ALPM_LOG_ERROR, _("path too long: %s%s\n"), root, pkgfile); pm_printf(ALPM_LOG_ERROR, _("path too long: %s%s\n"), path, pkgfile);
continue; continue;
} }
/* concatenate our file and the root path */ /* concatenate our file and the root path */
@ -210,8 +219,15 @@ static int query_fileowner(alpm_list_t *targets)
pdname = mdirname(path); pdname = mdirname(path);
ppath = realpath(pdname, NULL); ppath = realpath(pdname, NULL);
free(pdname); free(pdname);
path[rootlen] = '\0'; /* reset path for error messages */
if(ppath && strcmp(ppath, rpath) == 0) { if(!ppath) {
pm_printf(ALPM_LOG_ERROR, _("cannot determine real path for '%s': %s\n"),
pdname, strerror(errno));
continue;
}
if(strcmp(ppath, rpath) == 0) {
print_query_fileowner(filename, info); print_query_fileowner(filename, info);
found = 1; found = 1;
free(ppath); free(ppath);