on 3/5/01 4:17 AM, Dietmar Maurer at dietmar ximian com wrote:Sure, but the code sets this flag to TRUE.> The demarshalling code does not allocate memory for the name. Instead it
> uses a pointer into the receive buffer:
>
> set._buffer[_ORBIT_tmpvar_3].name = (void *) _ORBIT_curptr;
>
> and later the code calls:
>
> Bonobo_PropertySet__free(&set, NULL, CORBA_TRUE);
>
> Notice that release_strings is TRUE. So the memory is freed twice?Ownership of individual elements in a sequence is controlled by a separate
flag named _release. If that's false, the elements in _buffer are not freed.
I'm guessing (without looking at the code) that it's false in this case.
void
_ORBIT_skel_Bonobo_PropertyBag_setValues(POA_Bonobo_PropertyBag *
_ORBIT_servant,
GIOPRecvBuffer * _ORBIT_recv_buffer,
CORBA_Environment * ev,
void (*_impl_setValues)
(PortableServer_Servant _servant,
const Bonobo_PropertySet * set,
CORBA_Environment * ev))
{
Bonobo_PropertySet set = { 0, 0, NULL, CORBA_FALSE };
{ /* demarshalling */
guchar *_ORBIT_curptr;
register CORBA_unsigned_long _ORBIT_tmpvar_3;
register CORBA_unsigned_long _ORBIT_tmpvar_4;
CORBA_unsigned_long _ORBIT_tmpvar_5;
_ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
_ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
(*((guint32 *) & (set._length))) =
GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
_ORBIT_curptr += 4;
set._maximum = set._length;
set._buffer = CORBA_sequence_Bonobo_Pair_allocbuf(set._length);
set._release = CORBA_TRUE;
for (_ORBIT_tmpvar_3 = 0; _ORBIT_tmpvar_3 < set._length;
_ORBIT_tmpvar_3++) {
_ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
(*((guint32 *) & (_ORBIT_tmpvar_5))) =
GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
_ORBIT_curptr += 4;
set._buffer[_ORBIT_tmpvar_3].name = (void *) _ORBIT_curptr;
_ORBIT_curptr +=
sizeof(set._buffer[_ORBIT_tmpvar_3].name[_ORBIT_tmpvar_4]) *
_ORBIT_tmpvar_5;
GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
ORBit_demarshal_any(_ORBIT_recv_buffer,
&(set._buffer[_ORBIT_tmpvar_3].value),
CORBA_TRUE,
(((ORBit_ObjectKey
*) _ORBIT_servant->_private)->object->
orb));
_ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
}
} else {
_ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
set._length = *((CORBA_unsigned_long *) _ORBIT_curptr);
_ORBIT_curptr += 4;
set._maximum = set._length;
set._buffer = CORBA_sequence_Bonobo_Pair_allocbuf(set._length);
set._release = CORBA_TRUE;
for (_ORBIT_tmpvar_3 = 0; _ORBIT_tmpvar_3 < set._length;
_ORBIT_tmpvar_3++) {
_ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
_ORBIT_tmpvar_5 = *((CORBA_unsigned_long *) _ORBIT_curptr);
_ORBIT_curptr += 4;
set._buffer[_ORBIT_tmpvar_3].name = (void *) _ORBIT_curptr;
_ORBIT_curptr +=
sizeof(set._buffer[_ORBIT_tmpvar_3].name[_ORBIT_tmpvar_4]) *
_ORBIT_tmpvar_5;
GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
ORBit_demarshal_any(_ORBIT_recv_buffer,
&(set._buffer[_ORBIT_tmpvar_3].value),
CORBA_TRUE,
(((ORBit_ObjectKey
*) _ORBIT_servant->_private)->object->
orb));
_ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
}
}
}
_impl_setValues(_ORBIT_servant, &(set), ev);
{ /* marshalling */
register GIOPSendBuffer *_ORBIT_send_buffer;
_ORBIT_send_buffer =
giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
connection, NULL,
_ORBIT_recv_buffer->message.u.request.
request_id, ev->_major);
if (_ORBIT_send_buffer) {
if (ev->_major == CORBA_NO_EXCEPTION) {
} else if (ev->_major == CORBA_USER_EXCEPTION) {
static const ORBit_exception_marshal_info _ORBIT_user_exceptions[]
= { {(const CORBA_TypeCode)
&TC_Bonobo_Property_InvalidValue_struct,
(gpointer) _ORBIT_Bonobo_Property_InvalidValue_marshal},
{(const CORBA_TypeCode)
&TC_Bonobo_Property_ReadOnlyProperty_struct,
(gpointer) _ORBIT_Bonobo_Property_ReadOnlyProperty_marshal},
{CORBA_OBJECT_NIL, NULL} };
ORBit_send_user_exception(_ORBIT_send_buffer, ev,
_ORBIT_user_exceptions);
} else
ORBit_send_system_exception(_ORBIT_send_buffer, ev);
giop_send_buffer_write(_ORBIT_send_buffer);
giop_send_buffer_unuse(_ORBIT_send_buffer);
}
Bonobo_PropertySet__free(&set, NULL, CORBA_TRUE);
}
}