<p dir="ltr"><br>
10 июня 2015 г. 17:15 пользователь "Michal Privoznik" <<a href="mailto:mprivozn@redhat.com">mprivozn@redhat.com</a>> написал:<br>
><br>
> On 10.06.2015 08:52, Vasiliy Tolstov wrote:<br>
> > I'm try to implement virConnectGetAllDomainStats for php binding api,<br>
> > but have one issue with VIR_TYPED_PARAM_STRING:<br>
> ><br>
> > code part:<br>
> >         retval = virConnectGetAllDomainStats(conn->conn, stats,<br>
> > &retstats, flags);<br>
> >         for (i=0; i < retval; i++) {<br>
> >                 zval *arr2;<br>
> >                 ALLOC_INIT_ZVAL(arr2);<br>
> >                 array_init(arr2);<br>
> >                 for (j = 0; j < retstats[i]->nparams; j++) {<br>
> >                         params = retstats[i]->params[j];<br>
> >                         switch (params.type) {<br>
> >                         case VIR_TYPED_PARAM_INT:<br>
> >                                 add_assoc_long(arr2, params.field,<br>
> > params.value.i);<br>
> >                         case VIR_TYPED_PARAM_UINT:<br>
> >                                 add_assoc_long(arr2, params.field,<br>
> > params.value.ui);<br>
> >                         case VIR_TYPED_PARAM_LLONG:<br>
> >                                 add_assoc_long(arr2, params.field,<br>
> > params.value.l);<br>
> >                         case VIR_TYPED_PARAM_ULLONG:<br>
> >                                 add_assoc_long(arr2, params.field,<br>
> > params.value.ul);<br>
> >                         case VIR_TYPED_PARAM_DOUBLE:<br>
> >                                 add_assoc_double(arr2, params.field,<br>
> > params.value.d);<br>
> >                         case VIR_TYPED_PARAM_BOOLEAN:<br>
> >                                 add_assoc_bool(arr2, params.field,<br>
> > params.value.b);<br>
> >                         case VIR_TYPED_PARAM_STRING:<br>
> >                                 add_assoc_string_ex(arr2,<br>
> > params.field, strlen(params.field)+1, strdup(params.value.s),<br>
> > strlen(params.value.s)+1); // SEGFAULT HAPPENING<br>
> >                         }<br>
> >                 }<br>
> ><br>
> > gdb shows:<br>
> >     return_value_used=<optimized out>) at libvirt-php.c:2505<br>
> >         arr2 = 0x7ffff7fd72b8<br>
> >         conn = <optimized out><br>
> >         zconn = 0x7ffff7fd7140<br>
> >         retval = <optimized out><br>
> >         flags = <optimized out><br>
> >         stats = <optimized out><br>
> >         name = <optimized out><br>
> >         i = <optimized out><br>
> >         j = <optimized out><br>
> >         params = {field = "state.state", '\000' <repeats 68 times>,<br>
> > type = 1, value = {i = 5, ui = 5, l = 5, ul = 5, d =<br>
> > 2.4703282292062327e-323, b = 5 '\005',<br>
> >             s = 0x5 <Address 0x5 out of bounds>}}<br>
> >         retstats = 0x101d870<br>
> ><br>
> > What i'm doing wrong?<br>
> ><br>
><br>
> The switch() items needs to end with break; Otherwise add_assoc_*() will<br>
> be called that not correspond to the type. As in your example - the type<br>
> is INT, and you are seeing the error in strdup().<br>
><br>
> Unfortunately, my mind was too slow when reviewing your patch, so I've<br>
> pushed it without spotting it. I'm pushing the obvious fix right now.<br>
><br>
> Michal</p>
<p dir="ltr">Thanks, after golang I'm forget about breaks in switches.<br>
</p>