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