10 июня 2015 г. 17:15 пользователь "Michal Privoznik" <mprivozn@redhat.com> написал:
>
> 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

Thanks, after golang I'm forget about breaks in switches.