[pacman-dev] [PATCH 1/2] Remove most usages of strncmp()
Sebastian Nowicki
sebnow at gmail.com
Sun Jul 17 09:21:45 EDT 2011
On Wed, Jul 6, 2011 at 3:20 AM, Dan McGee <dan at archlinux.org> wrote:
> The supposed safety blanket of this function is better handled by
> explicit length checking and usages of strlen() on known NULL-terminated
> strings rather than hoping things fit in a buffer. We also have no need
> to fully fill a PATH_MAX length variable with NULLs every time as long
> as a single terminating byte is there. Remove usages of it by using
> strcpy() or memcpy() as appropriate, after doing length checks via
> strlen().
>
> Signed-off-by: Dan McGee <dan at archlinux.org>
> ---
> lib/libalpm/handle.c | 2 +-
> src/pacman/query.c | 17 ++++++++++-------
> src/pacman/util.c | 11 ++++-------
> src/util/vercmp.c | 2 +-
> 4 files changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
> index 22f3fc8..b48d5b6 100644
> --- a/lib/libalpm/handle.c
> +++ b/lib/libalpm/handle.c
> @@ -125,9 +124,13 @@ static int query_fileowner(alpm_list_t *targets)
> * once, then we can just overwrite whatever file was there on the previous
> * iteration. */
> root = alpm_option_get_root(config->handle);
> - strncpy(path, root, PATH_MAX - 1);
> - append = path + strlen(path);
> - max_length = PATH_MAX - (append - path) - 1;
> + rootlen = strlen(root);
> + if(rootlen + 1 > PATH_MAX) {
> + /* we are in trouble here */
> + pm_fprintf(stderr, ALPM_LOG_ERROR, _("path too long: %s%s\n"), root, "");
> + return 1;
> + }
> + strcpy(path, root);
>
Might be a bit late to the party, but there's potential for a bug to
creep in here. If anything is done with "path" before hand, the check
becomes incorrect. It should check strlen(path) + rootlen, and is done
later on:
> @@ -208,11 +211,11 @@ static int query_fileowner(alpm_list_t *targets)
> continue;
> }
>
> - if(strlen(pkgfile) > max_length) {
> + if(rootlen + 1 + strlen(pkgfile) > PATH_MAX) {
> pm_fprintf(stderr, ALPM_LOG_ERROR, _("path too long: %s%s\n"), root, pkgfile);
> }
> /* concatenate our file and the root path */
> - strcpy(append, pkgfile);
> + strcpy(path + rootlen, pkgfile);
>
> pdname = mdirname(path);
> ppath = resolve_path(pdname);
More information about the pacman-dev
mailing list