[libvirt] [PATCH v2] xen: Remove PATH_MAX sized stack allocation from block stats code
Matthias Bolte
matthias.bolte at googlemail.com
Sun Apr 10 11:40:15 UTC 2011
2011/4/10 Daniel Veillard <veillard at redhat.com>:
> 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
>
Thanks, pushed.
Matthias
More information about the libvir-list
mailing list