> Hi Dan et al., > > So I just wanted to let you know that I have looked somewhat at one (the only > as far as I saw) of the valgrind results related to HttpProtocol in urlmon, > and basically it involves passing a pointer to a PROTOCOLDATA from a local > variable inside a function to the ProtocolSink call which ends up > sending a message with this pointer. When this pointer is processed later, > since it is a pointer to a local variable which (presumably) exists only on > the stack, it is not really valid. > > Now this is quite easy to "fix" with a five-line patch that HeapAlloc's the > proper structures. However, I was trying to figure out how native does this > to copy it, and kind of ran into a dilemma. Namely, doing a simple patch like > shown below (this probably won't really be a diff as I copy/pasted it > into WebMail which will probably mess it up, but it should give a general > idea) and then doing a WINEDLLOVERRIDES with native urlmon and wininet and > +relay WINEDEBUG I can see that the the PROTOCOLDATA pointers are pointing to > stuff like 0x7d7ad790 and 0x7d7ad820. Now, much to my suprise, these > addresses, nor addresses in the proximate range (approximate) to that address > don't seem to be part of any other relay calls, including any calls to any > sort of allocation functions. Now this leaves me a little stumped ,as I can > only see a few ways to properly implement these PROTOCOLDATA pointers > (without a memory leak): > > 1. A static PROTOCOLDATA variable (local or global). In this case, the > address I see for native should never change I believe, but also this would > not be correct as potentially you could have more than one HttpProtocol using > the same structure. > > 2. Dynamic allocation of the PROTOCOLDATA structure. This seems like the best > option to me, but native either does not seem to be using it or allocates it > in some way in which the address or even partial versions of the address does > not appear in any allocation functions (or really anywhere) in the > +relay log. Any ideas on what allocation functions I could be missing here? > > 3. Have one PROTOCOLDATA structure per IInternetProtocol implementation of > http. This seems reasonable too, except I am also printing out the address of > the IInternetProtocol structure and clearly PROTOCOLDATA is not in an address > range anywhere near this structure, and it is never allocated so it > can't be a pointer within that structure. > > So anyhow I am a little stuck on the "proper" fix for this. Any suggestiosn > would be appreciated. > > Thanks, > > Misha
Hmm... so it looks like upon investigation the address ranges for PROTOCOLDATA with antive dlls are actually suspiciously similar to those I see in the current local variable implementation... which makes me think that the implementation is dissimilar (and thus leaky) in the downstream ProtocolSink implementation in binding.c, which will be a little harder to test... Misha