[ace-users] ACE_Service_Config: ACE_Stream_Type ignores gobblers for dynamic streams.
Johnny Willemsen
jwillemsen at remedy.nl
Fri Feb 15 05:36:52 CST 2019
Hi,
Thanks for using the PRF form. You can submit issues and preferable also
a pull request with code fixes and test extensions through the main
github repository at https://github.com/DOCGroup/ACE_TAO
Best regards,
Johnny Willemsen
Remedy IT
http://www.remedy.nl
On 2/14/19 3:03 PM, manjak4s at ukr.net wrote:
> ACE VERSION: 6.5.3
> HOST MACHINE and OPERATING SYSTEM:
>
> Windows 10 Enterprise N Edition (v10.0 Build 10240). Winsock 2
>
> COMPILER NAME AND VERSION (AND PATCHLEVEL):
> MS VS 2015 version 14.0.25431.01 Update 3
>
> $ACE_ROOT/ace/config.h:
> config-win32.h"
>
> AREA/CLASS/EXAMPLE AFFECTED:
> ACE_Service_Config framework.
>
> DOES THE PROBLEM AFFECT:
> EXECUTION
>
> Affects both sides.
>
> SYNOPSIS:
>
> ACE_Stream_Type class ignores a gobbler function pointer returned by the stream factory.
>
>
> DESCRIPTION:
>
> I'm loading a conf file with a single dynamic stream created by a factory method from my dll:
>
> stream dynamic Test STREAM * shared:make_stream() active
> {
> }
>
> 1) While tracing the code, I've noticed that ACE_Stream_Type constructor ignores the gobbler
> function. This leads to two problems:
> - the stream object destructor will not be called at shutdown;
> - the memory itself is released as a raw buffer via operator delete from ACE.dll, though
> it was allocated by a different module. It does not crash until CRT is shared...
>
> 2) I've tried the same with XML config, but stumbled upon this line:
> $ACE_ROOT/ACEXML/apps/svcconf/Svcconf_Handler.cpp:84
>
> long temp_ptr =
> reinterpret_cast<uintptr_t> (svc_dll.symbol (active_info->init_func ()));
> func = reinterpret_cast<void *(*)(ACE_Service_Object_Exterminator *)> (temp_ptr);
>
> It maims the factory pointer and crashes at the call.
>
> My questions are:
> 1) was it intentional or lost in config format evolution?
> 2) should I post it as a bug too or the project is dead?
>
> REPEAT BY:
>
> export a simple factory:
> ACE_Stream<ACE_SYNCH> * make_stream ( ACE_Service_Object_Exterminator * gobbler )
> {
> *gobbler = &delete_stream;
> return new ACE_Stream<ACE_SYNCH>;
> }
>
> void delete_stream ( void * stream )
> {
> delete static_cast<ACE_Stream<ACE_SYNCH> *>(stream);
> }
>
> Open and close the svc.conf mentioned above:
>
> int ACE_TMAIN ( int argc, ACE_TCHAR *argv[] )
> {
> if (ACE_Service_Config::open(argc, argv, nullptr, false) == -1)
> {
> return -1;
> }
>
> ACE_Service_Config::close();
> return 0;
> }
>
> SAMPLE FIX/WORKAROUND:
>
> 1) Add gobbler parameter to the ACE_Stream_Type constructor.
> 2) Use uintptr_t.
>
>
> _______________________________________________
> ace-users mailing list
> ace-users at list.isis.vanderbilt.edu
> http://list.isis.vanderbilt.edu/cgi-bin/mailman/listinfo/ace-users
More information about the ace-users
mailing list