<div dir="ltr"><div dir="ltr"><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Maxim,</span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Thanks for responding to my query. I am passing the original context pointer to the clean up handler. When my cleanup handler is called I am retrieving the context pointer to clean up external resources. Based on your response, the pointer saved in the cleanup handler should still be valid and should be still safe to use and no memory/resources will be leaked if I use that pointer to cleanup old allocations. This seems to be in agreement with what I observed in my debugging. </span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br></span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">A follow up question.<span class="gmail-Apple-converted-space"> </span>After the redirect call, I am recreating the context and restoring some of the data. However, like you mentioned I cannot restore all the data. Currently, I am not accessing inaccessible data, it seems to be working fine. However, in case I need to access the lost data, is there another area in the request that is not disturbed by the redirect call where I can save the context data?<br></span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br></span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Regards,</span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Dk.</span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br></span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">---------------------------------------------------------------------------------------------</span></div><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">By saying "all request contexts are erased" the development guide</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">means that module contexts will no longer be available via the</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">ngx_http_get_module_ctx() macro. The ngx_http_internal_redirect()</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">clears the r->ctx[] array of pointers:</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">/* clear the modules contexts */</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">That is, the actual memory you've used for your module context</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">will be intact, but the pointer you've saved into request with</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">ngx_http_set_module_ctx() macro will no longer be returned by</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">the ngx_http_get_module_ctx() macro.</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Usually, modules will simply re-allocate context as needed if it's</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">not present. As long as context memory is allocated from the</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">request pool, this won't cause a memory leak: all memory allocated</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">from the request pool is automatically released when the request</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">pool is destroyed.</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">If you are allocating some external resources, such as open file</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">descriptors or memory allocated directly from OS, you'll have to</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">use cleanup handler free these resources. In this case, you have</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">to make sure that the cleanup handler you've installed will free</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">all the external resources you've allocated. Usually this means</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">that you'll have to add a cleanup handler per resource: for</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">example, nginx adds a cleanup handler for each file it opens, see</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">ngx_open_cached_file(). Or, if you are keeping pointers to the</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">allocated resources in your module context, a cleanup handler per</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">each allocated context might be a good option.</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Note well that in some cases it might not possible to re-create</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">module context, for example, if some information is no longer</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">available. In this case it is possible to preserve the module</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">context by saving the pointer elsewhere, and restoring it if</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">possible instead of re-allocating if ngx_http_get_module_ctx()</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">returns NULL. For example, the realip module uses request pool</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">cleanup handlers to save and restore its context when needed, see</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">ngx_http_realip_get_module_ctx().</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Hope this helps.</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">--</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">Maxim Dounin</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><a href="http://mdounin.ru/">http://mdounin.ru/</a></span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">_______________________________________________</span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">nginx-devel mailing list -- <a href="mailto:nginx-devel@nginx.org">nginx-devel@nginx.org</a></span><br style="clear:both;color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal"><span style="color:rgb(0,0,0);font-family:Arial;font-size:medium;font-variant-ligatures:normal">To unsubscribe send an email to <a href="mailto:nginx-devel-leave@nginx.org">nginx-devel-leave@nginx.org</a></span><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jan 21, 2022 at 4:07 PM Dk Jack <<a href="mailto:dnj0496@gmail.com">dnj0496@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi,<div>I have a question related to internal redirect, I am hoping someone from this forum can clarify. The email is a bit long since I wanted to provide enough background for my situation. <br><br>In my module, I am creating my module context and saving some state. Some of this state is allocated using ngx_palloc. I am releasing this memory by adding a pool clean up handler.</div><div><br></div><div>In my module, for certain requests I am doing an internal redirect. My code for redirect looks something like this:</div><div><br></div><div><font face="monospace">    ngx_http_internal_redirect(r, &new_uri, &r->args);<br>    ngx_http_finalize_request(r, NGX_DONE);<br></font></div><div><br></div><div>According to the documentation<br><a href="http://nginx.org/en/docs/dev/development_guide.html#http_request_redirection" target="_blank">http://nginx.org/en/docs/dev/development_guide.html#http_request_redirection</a></div><div><br></div><div>it says, on calling internal_redirect, the module context will be erased to avoid inconsistencies. It also says, the processing returns to the <span style="color:rgb(0,0,0);font-family:monospace;font-size:medium;text-align:justify">NGX_HTTP_SERVER_REWRITE_PHASE</span>. To understand the behavior better, I attached a debugger and added a breakpoint after the above two lines. When the debugger stopped at my breakpoint, my module context still seems to be valid. I added a second breakpoint in my rewrite-handler and allowed the debugger to continue. Now when the debugger stopped at the second breakpoint, my module context was erased which seems consistent with the documentation.</div><div><br></div><div>So my question is, if my context is erased, what happens to the memory I allocated before my module invoked the internal redirect call? I put a log statement in my cleanup function and I observed that it is getting invoked only once at the end of the request processing. It is not getting called when my context is erased after an internal redirect. Since I need my context data after redirection, do I reallocate and recreate it? Since my clean up code is getting called only once. Would this lead to a memory leak if I reallocated after the internal redirect call because I'd be allocated once before redirect and once after redirect. Any help or clarification in this regard is greatly appreciated. <br><br>Dk. </div><div><br></div></div>
</blockquote></div></div>