GIOPRecvBuffer * giop_recv_buffer_use_encaps_buf (GIOPRecvBuffer *buf) { guchar *ptr; CORBA_unsigned_long len; buf->cur = ALIGN_ADDRESS (buf->cur, 4); if ((buf->cur + 4) > buf->end) return NULL; len = *(CORBA_unsigned_long *) buf->cur; if (giop_msg_conversion_needed (buf)) len = GUINT32_SWAP_LE_BE (len); buf->cur += 4; if ((buf->cur + len) > buf->end || (buf->cur + len) < buf->cur) return NULL; ptr = buf->cur; buf->cur += len; return giop_recv_buffer_use_encaps (ptr, len); }
CORBA_Object CORBA_ORB_string_to_object (CORBA_ORB orb, const CORBA_char *string, CORBA_Environment *ev) { CORBA_Object retval = CORBA_OBJECT_NIL; CORBA_unsigned_long len; GIOPRecvBuffer *buf; #if defined ENABLE_HTTP gchar *ior = NULL; #endif guchar *tmpbuf; int i; if (strncmp (string, "IOR:", strlen("IOR:")) && strncmp (string, "corbaloc:", strlen ("corbaloc:")) && strncmp (string, "iiop:", strlen ("iiop:")) && strncmp (string, "iiops:", strlen ("iiops:")) && strncmp (string, "ssliop:", strlen ("ssliop:")) && strncmp (string, "uiop:", strlen ("uiop:"))) { #if defined ENABLE_HTTP if (matecorba_use_http_iors && strstr (string, "://")) { /* FIXME: this code is a security hazard */ ior = orb_http_resolve (string); if (!ior) { /* FIXME, set error minor code * (vendor's error code) to tell user * initial location of error, ie my * local ORB, proxy's ORB, server's * ORB, etc. */ CORBA_exception_set_system ( ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return CORBA_OBJECT_NIL; } string = ior; } else #endif { CORBA_exception_set_system ( ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return CORBA_OBJECT_NIL; } } if (!strncmp (string, "IOR:", strlen ("IOR:"))) { string += 4; len = strlen (string); while (len > 0 && !g_ascii_isxdigit (string [len - 1])) len--; if (len % 2) { #if defined ENABLE_HTTP g_free (ior); #endif return CORBA_OBJECT_NIL; } tmpbuf = g_alloca (len / 2); for (i = 0; i < len; i += 2) tmpbuf [i/2] = (g_ascii_xdigit_value (string [i]) << 4) | g_ascii_xdigit_value (string [i + 1]); buf = giop_recv_buffer_use_encaps (tmpbuf, len / 2); if (MateCORBA_demarshal_object (&retval, buf, orb)) { CORBA_exception_set_system ( ev, ex_CORBA_MARSHAL, CORBA_COMPLETED_NO); retval = CORBA_OBJECT_NIL; } giop_recv_buffer_unuse (buf); #if defined ENABLE_HTTP g_free (ior); #endif return retval; } else { return MateCORBA_object_by_corbaloc (orb, string, ev); } }