[pacman-dev] [PATCH 2/2] Set pm_errno on libarchive errors while reading

Dan McGee dpmcgee at gmail.com
Mon Sep 27 11:54:07 EDT 2010


On Sun, Sep 12, 2010 at 9:01 AM, Sebastian Nowicki <sebnow at gmail.com> wrote:
> Signed-off-by: Sebastian Nowicki <sebnow at gmail.com>

Looks good, thanks!
> ---
>  lib/libalpm/package.c |   16 +++++++++++++---
>  1 files changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
> index 0060300..717d32c 100644
> --- a/lib/libalpm/package.c
> +++ b/lib/libalpm/package.c
> @@ -488,12 +488,15 @@ void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg)
>
>  /**
>  * Read data from an open changelog 'file stream'. Similar to fread in
> - * functionality, this function takes a buffer and amount of data to read.
> + * functionality, this function takes a buffer and amount of data to read. If an
> + * error occurs pm_errno will be set.
> + *
>  * @param ptr a buffer to fill with raw changelog data
>  * @param size the size of the buffer
>  * @param pkg the package that the changelog is being read from
>  * @param fp a 'file stream' to the package changelog
> - * @return the number of characters read, or 0 if there is no more data
> + * @return the number of characters read, or 0 if there is no more data or an
> + * error occurred.
>  */
>  size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
>                const pmpkg_t *pkg, const void *fp)
> @@ -502,7 +505,14 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
>        if(pkg->origin == PKG_FROM_CACHE) {
>                ret = fread(ptr, 1, size, (FILE*)fp);
>        } else if(pkg->origin == PKG_FROM_FILE) {
> -               ret = archive_read_data((struct archive*)fp, ptr, size);
> +               ssize_t sret = archive_read_data((struct archive*)fp, ptr, size);
> +               /* Report error (negative values) */
> +               if(sret < 0) {
> +                       pm_errno = PM_ERR_LIBARCHIVE;
> +                       ret = 0;
> +               } else {
> +                       ret = (size_t)sret;
> +               }
>        }
>        return(ret);
>  }
> --
> 1.7.2.2
>
>
>


More information about the pacman-dev mailing list