@@ -1315,15 +1315,25 @@ ngx_http_purge_file_cache_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path) {
13151315}
13161316
13171317
1318+ typedef struct {
1319+ u_char * key_partial ;
1320+ u_char * key_in_file ;
1321+ ngx_uint_t key_len ;
1322+ } ngx_http_cache_purge_partial_ctx_t ;
1323+
13181324static ngx_int_t
13191325ngx_http_purge_file_cache_delete_partial_file (ngx_tree_ctx_t * ctx , ngx_str_t * path ) {
1326+ ngx_http_cache_purge_partial_ctx_t * data ;
13201327 u_char * key_partial ;
13211328 u_char * key_in_file ;
13221329 ngx_uint_t len ;
13231330 ngx_flag_t remove_file = 0 ;
13241331
1325- key_partial = ctx -> data ;
1326- len = ngx_strlen (key_partial );
1332+ data = ctx -> data ;
1333+
1334+ key_partial = data -> key_partial ;
1335+ key_in_file = data -> key_in_file ;
1336+ len = data -> key_len ;
13271337
13281338 /* if key_partial is empty always match, because is a '*' */
13291339 if (len == 0 ) {
@@ -1342,9 +1352,7 @@ ngx_http_purge_file_cache_delete_partial_file(ngx_tree_ctx_t *ctx, ngx_str_t *pa
13421352 }
13431353 file .log = ctx -> log ;
13441354
1345- /* I don't know if it's a good idea to use the ngx_cycle pool for this,
1346- but the request is not available here */
1347- key_in_file = ngx_pcalloc (ngx_cycle -> pool , sizeof (u_char ) * (len + 1 ));
1355+ ngx_memzero (key_in_file , sizeof (u_char ) * len );
13481356
13491357 /* KEY: /proxy/passwd */
13501358 /* since we don't need the "KEY: " ignore 5 + 1 extra u_char from last
@@ -1807,18 +1815,21 @@ ngx_http_cache_purge_partial(ngx_http_request_t *r, ngx_http_file_cache_t *cache
18071815 "purge_partial http in %s" ,
18081816 cache -> path -> name .data );
18091817
1810- u_char * key_partial ;
1811- ngx_str_t * key ;
1812- ngx_http_cache_t * c ;
1813- ngx_uint_t len ;
1818+ ngx_str_t * keys ;
1819+ ngx_str_t key ;
18141820
1815- c = r -> cache ;
1816- key = c -> keys .elts ;
1817- len = key [0 ].len ;
1821+ /* Only check the first key, and discard '*' at the end */
1822+ keys = r -> cache -> keys .elts ;
1823+ key = keys [0 ];
1824+ key .len -- ;
18181825
1819- /* Only check the first key */
1820- key_partial = ngx_pcalloc (r -> pool , sizeof (u_char ) * len );
1821- ngx_memcpy (key_partial , key [0 ].data , sizeof (u_char ) * (len - 1 ));
1826+ ngx_http_cache_purge_partial_ctx_t * ctx ;
1827+ ctx = ngx_palloc (r -> pool , sizeof (ngx_http_cache_purge_partial_ctx_t ));
1828+ ctx -> key_len = key .len ;
1829+ if (key .len > 0 ) {
1830+ ctx -> key_partial = key .data ;
1831+ ctx -> key_in_file = ngx_pnalloc (r -> pool , sizeof (u_char ) * key .len );
1832+ }
18221833
18231834 /* Walk the tree and remove all the files matching key_partial */
18241835 ngx_tree_ctx_t tree ;
@@ -1827,7 +1838,7 @@ ngx_http_cache_purge_partial(ngx_http_request_t *r, ngx_http_file_cache_t *cache
18271838 tree .pre_tree_handler = ngx_http_purge_file_cache_noop ;
18281839 tree .post_tree_handler = ngx_http_purge_file_cache_noop ;
18291840 tree .spec_handler = ngx_http_purge_file_cache_noop ;
1830- tree .data = key_partial ;
1841+ tree .data = ctx ;
18311842 tree .alloc = 0 ;
18321843 tree .log = ngx_cycle -> log ;
18331844
0 commit comments