[libvirt] question about virConnectGetAllDomainStats and virTypedParameter

Michal Privoznik mprivozn at redhat.com
Wed Jun 10 14:15:25 UTC 2015


On 10.06.2015 08:52, Vasiliy Tolstov wrote:
> I'm try to implement virConnectGetAllDomainStats for php binding api,
> but have one issue with VIR_TYPED_PARAM_STRING:
> 
> code part:
>         retval = virConnectGetAllDomainStats(conn->conn, stats,
> &retstats, flags);
>         for (i=0; i < retval; i++) {
>                 zval *arr2;
>                 ALLOC_INIT_ZVAL(arr2);
>                 array_init(arr2);
>                 for (j = 0; j < retstats[i]->nparams; j++) {
>                         params = retstats[i]->params[j];
>                         switch (params.type) {
>                         case VIR_TYPED_PARAM_INT:
>                                 add_assoc_long(arr2, params.field,
> params.value.i);
>                         case VIR_TYPED_PARAM_UINT:
>                                 add_assoc_long(arr2, params.field,
> params.value.ui);
>                         case VIR_TYPED_PARAM_LLONG:
>                                 add_assoc_long(arr2, params.field,
> params.value.l);
>                         case VIR_TYPED_PARAM_ULLONG:
>                                 add_assoc_long(arr2, params.field,
> params.value.ul);
>                         case VIR_TYPED_PARAM_DOUBLE:
>                                 add_assoc_double(arr2, params.field,
> params.value.d);
>                         case VIR_TYPED_PARAM_BOOLEAN:
>                                 add_assoc_bool(arr2, params.field,
> params.value.b);
>                         case VIR_TYPED_PARAM_STRING:
>                                 add_assoc_string_ex(arr2,
> params.field, strlen(params.field)+1, strdup(params.value.s),
> strlen(params.value.s)+1); // SEGFAULT HAPPENING
>                         }
>                 }
> 
> gdb shows:
>     return_value_used=<optimized out>) at libvirt-php.c:2505
>         arr2 = 0x7ffff7fd72b8
>         conn = <optimized out>
>         zconn = 0x7ffff7fd7140
>         retval = <optimized out>
>         flags = <optimized out>
>         stats = <optimized out>
>         name = <optimized out>
>         i = <optimized out>
>         j = <optimized out>
>         params = {field = "state.state", '\000' <repeats 68 times>,
> type = 1, value = {i = 5, ui = 5, l = 5, ul = 5, d =
> 2.4703282292062327e-323, b = 5 '\005',
>             s = 0x5 <Address 0x5 out of bounds>}}
>         retstats = 0x101d870
> 
> What i'm doing wrong?
> 

The switch() items needs to end with break; Otherwise add_assoc_*() will
be called that not correspond to the type. As in your example - the type
is INT, and you are seeing the error in strdup().

Unfortunately, my mind was too slow when reviewing your patch, so I've
pushed it without spotting it. I'm pushing the obvious fix right now.

Michal




More information about the libvir-list mailing list