[vlc-devel] [vlc-commits] Remove libvlc_free

Steve Lhomme robux4 at ycbcr.xyz
Fri May 24 10:51:39 CEST 2019


On 2019-05-24 10:35, Steve Lhomme wrote:
> On 2019-05-24 10:04, Rémi Denis-Courmont wrote:
>> If you don't have the right free inside the EXE, you cannot call LibVLC 
> 
> I said you do the free *inside the DLL* in order to make it work.

I attached the corresponding trivial example updated to free the memory 
in the DLL instead of the EXE. And as expected it works just fine.

>> directly as already explained several times. So it's moot whether you 
>> have libvlc_free() or not.
>>
>> Le 24 mai 2019 10:44:11 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a 
>> écrit :
>>
>>     On 2019-05-24 9:36, Rémi Denis-Courmont wrote:
>>
>>         I don't know what point you are trying to make here. Nobody
>>         questioned
>>         that mismatched heap allocators would crash. Of course they 
>> would.
>>
>>         The problem is that if you can't get the right free() function,
>>         then you
>>         can't call libvlc_free().
>>
>>
>>     Yes, you can get the right free(), if the free() call is done 
>> inside the
>>     DLL and not the EXE. It was possible before you removed 
>> libvlc_free().
>>     It was even documented as such.
>>
>>     Now this trivial use case is not even possible with current state of
>>     libvlc. The host cannot reliably release the memory it is given.
>>
>>        At that point, the code is probably already UB
>>
>>         even before freeing the allocation either way.
>>
>>         Le 24 mai 2019 09:37:20 GMT+03:00, Steve Lhomme
>>         <robux4 at ycbcr.xyz> a écrit :
>>
>>         On 2019-05-24 7:44, Steve Lhomme wrote:
>>
>>         On 2019-05-24 7:25, Steve Lhomme wrote:
>>
>>         On 2019-05-23 17:11, Rémi Denis-Courmont wrote:
>>
>>         Le torstaina 23. toukokuuta 2019, 13.57.32 EEST Steve
>>         Lhomme a écrit :
>>
>>         Here's another one: we could decide to rewrite
>>         libvlc in C++ and keep
>>         the same ABI. Does that mean we would have to forced
>>         libvlc hosts to
>>         call "delete psz-str" because we don't feel like
>>         keeping
>>         libvlc_free() ?
>>
>>
>>         You would have to keep using malloc() otherwise you
>>         would break the
>>         existing
>>         ABI 3.0 or 4.0 anyway that says you can use free().
>>
>>
>>         That's indeed a problem. I think the free() option should
>>         not have
>>         been there in the first place. I would rather vote to remove
>>         this option.
>>
>>         For example we could decide that for performance reasons we
>>         allocate
>>         using aligned_alloc(). On some system that requires an
>>         aligned_free().
>>         We cannot do that if we allow free() of a particular runtime.
>>
>>
>>         Another use case: building libvlc/vlc with allocation tooling,
>>         redirecting malloc/free to debug leaks. Calling free() outside
>>         of libvlc
>>         with memory allocated this will likely crash or report errors
>>         when a
>>         legitimate free() is done. We should not tie our hands by 
>> allowing
>>         free() at all.
>>
>>
>>         Attached is a quick example of a library done incorrectly:
>>
>>         The EXE links with the *debug* DLL C runtime, as most people
>>         would use
>>         while debugging their code.
>>
>>         The DLL links with the *standard* DLL C runtime, as a
>>         distributed DLL
>>         would use.
>>
>>         Calling free() on the memory returned by the DLL crashes with 
>> a heap
>>         allocation error. That doesn't happen is the free() is done in
>>         the DLL.
>>
>>
>>         --         Envoyé de mon appareil Android avec Courriel K-9 
>> Mail. Veuillez
>>         excuser
>>         ma brièveté.
>>         
>> ------------------------------------------------------------------------
>>         vlc-devel mailing list
>>         To unsubscribe or modify your subscription options:
>>         https://mailman.videolan.org/listinfo/vlc-devel
>>
>>     
>> ------------------------------------------------------------------------
>>     vlc-devel mailing list
>>     To unsubscribe or modify your subscription options:
>>     https://mailman.videolan.org/listinfo/vlc-devel
>>
>>
>> -- 
>> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez 
>> excuser ma brièveté.
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
#include <windows.h>
#include <stdio.h>

__declspec(dllexport) void * CallInDll(void)
{
    printf("the DLL call\n"); 
    return malloc(100);
}

__declspec(dllexport) void ReleaseMemory(void *my_memory)
{
    free(my_memory);
}
-------------- next part --------------
#include <windows.h>
#include <stdio.h>

int main(void) {
    printf("the EXE call\n");
    HMODULE dll = LoadLibrary("dll_crt.dll");
    if (dll == 0) {
      printf("DLL not found\n");
      return 1;
    }
    void* (*pfCallInDll)() = GetProcAddress(dll, "CallInDll");
    void (*pfReleaseMemory)(void*) = GetProcAddress(dll, "ReleaseMemory");
    if (pfCallInDll == NULL || pfReleaseMemory == NULL) {
      printf("CallInDll not found\n");
      FreeLibrary(dll);
      return 1;
    }
    void *allocated = pfCallInDll();
    printf("the DLL was called\n");
    pfReleaseMemory(allocated);
    printf("the memory was released\n");
    FreeLibrary(dll);
    return 0;
}


More information about the vlc-devel mailing list