[libvirt] [PATCH v2] xen: Remove PATH_MAX sized stack allocation from block stats code

Daniel Veillard veillard at redhat.com
Sun Apr 10 05:03:30 UTC 2011


On Sat, Apr 09, 2011 at 12:05:17PM +0200, Matthias Bolte wrote:
> ---
>  src/xen/block_stats.c |   51 +++++++++++++++++++++++++------------------------
>  1 files changed, 26 insertions(+), 25 deletions(-)
> 
> diff --git a/src/xen/block_stats.c b/src/xen/block_stats.c
> index e7c80c9..1918257 100644
> --- a/src/xen/block_stats.c
> +++ b/src/xen/block_stats.c
> @@ -113,34 +113,35 @@ read_stat (const char *path)
>  }
>  
>  static int64_t
> -read_bd_stat (int device, int domid, const char *str)
> +read_bd_stat(int device, int domid, const char *str)
>  {
> -    char path[PATH_MAX];
> +    static const char *paths[] = {
> +        "/sys/bus/xen-backend/devices/vbd-%d-%d/statistics/%s",
> +        "/sys/bus/xen-backend/devices/tap-%d-%d/statistics/%s",
> +        "/sys/devices/xen-backend/vbd-%d-%d/statistics/%s",
> +        "/sys/devices/xen-backend/tap-%d-%d/statistics/%s"
> +    };
> +
> +    int i;
> +    char *path;
>      int64_t r;
>  
> -    snprintf (path, sizeof path,
> -              "/sys/bus/xen-backend/devices/vbd-%d-%d/statistics/%s",
> -              domid, device, str);
> -    r = read_stat (path);
> -    if (r >= 0) return r;
> -
> -    snprintf (path, sizeof path,
> -              "/sys/bus/xen-backend/devices/tap-%d-%d/statistics/%s",
> -              domid, device, str);
> -    r = read_stat (path);
> -    if (r >= 0) return r;
> -
> -    snprintf (path, sizeof path,
> -              "/sys/devices/xen-backend/vbd-%d-%d/statistics/%s",
> -              domid, device, str);
> -    r = read_stat (path);
> -    if (r >= 0) return r;
> -
> -    snprintf (path, sizeof path,
> -              "/sys/devices/xen-backend/tap-%d-%d/statistics/%s",
> -              domid, device, str);
> -    r = read_stat (path);
> -    return r;
> +    for (i = 0; i < ARRAY_CARDINALITY(paths); ++i) {
> +        if (virAsprintf(&path, paths[i], domid, device, str) < 0) {
> +            virReportOOMError();
> +            return -1;
> +        }
> +
> +        r = read_stat(path);
> +
> +        VIR_FREE(path);
> +
> +        if (r >= 0) {
> +            return r;
> +        }
> +    }
> +
> +    return -1;
>  }
>  
>  /* In Xenstore, /local/domain/0/backend/vbd/<domid>/<device>/state,

  ACK, thanks !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list