mod_proxy_ftp: NULL pointer dereference on error paths.
[Stefan Fritsch <sf fritsch.de>, Joe Orton]
+ *) mod_ldap: If LDAPSharedCacheSize is too small, try harder to purge
+ some cache entries and log a warning. Also increase the default
+ LDAPSharedCacheSize to 500000. This is a more realistic size suitable
+ for the default values of 1024 for LdapCacheEntries/LdapOpCacheEntries.
+ PR 46749. [Stefan Fritsch]
+
*) mod_rewrite: Make sure that a hostname:port isn't fully qualified if
the request is a CONNECT request. [Bill Zajac <billz consultla.com>]
# be loaded. Change the "yourdomain.example.com" to<br />
# match your domain.<br />
<br />
- LDAPSharedCacheSize 200000<br />
+ LDAPSharedCacheSize 500000<br />
LDAPCacheEntries 1024<br />
LDAPCacheTTL 600<br />
LDAPOpCacheEntries 1024<br />
<name>LDAPSharedCacheSize</name>
<description>Size in bytes of the shared-memory cache</description>
<syntax>LDAPSharedCacheSize <var>bytes</var></syntax>
-<default>LDAPSharedCacheSize 102400</default>
+<default>LDAPSharedCacheSize 500000</default>
<contextlist><context>server config</context></contextlist>
<usage>
<p>Specifies the number of bytes to allocate for the shared
- memory cache. The default is 100kb. If set to 0, shared memory
+ memory cache. The default is 500kb. If set to 0, shared memory
caching will not be used.</p>
</usage>
</directivesynopsis>
void *util_ald_cache_insert(util_ald_cache_t *cache, void *payload)
{
unsigned long hashval;
+ void *tmp_payload;
util_cache_node_t *node;
/* sanity check */
util_ald_cache_purge(cache);
if (cache->numentries >= cache->maxentries) {
/* if the purge was not effective, we leave now to avoid an overflow */
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
+ "Purge of LDAP cache failed");
return NULL;
}
}
- /* should be safe to add an entry */
- if ((node = (util_cache_node_t *)util_ald_alloc(cache, sizeof(util_cache_node_t))) == NULL) {
- return NULL;
+ node = (util_cache_node_t *)util_ald_alloc(cache,
+ sizeof(util_cache_node_t));
+ if (node == NULL) {
+ /*
+ * XXX: The cache management should be rewritten to work
+ * properly when LDAPSharedCacheSize is too small.
+ */
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL,
+ "LDAPSharedCacheSize is too small. Increase it or "
+ "reduce LDAPCacheEntries/LDAPOpCacheEntries!");
+ if (cache->numentries < cache->fullmark) {
+ /*
+ * We have not even reached fullmark, trigger a complete purge.
+ * This is still better than not being able to add new entries
+ * at all.
+ */
+ cache->marktime = apr_time_now();
+ }
+ util_ald_cache_purge(cache);
+ node = (util_cache_node_t *)util_ald_alloc(cache,
+ sizeof(util_cache_node_t));
+ if (node == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
+ "Could not allocate memory for LDAP cache entry");
+ return NULL;
+ }
}
/* Take a copy of the payload before proceeeding. */
- payload = (*cache->copy)(cache, payload);
- if (!payload) {
- util_ald_free(cache, node);
- return NULL;
+ tmp_payload = (*cache->copy)(cache, payload);
+ if (tmp_payload == NULL) {
+ /*
+ * XXX: The cache management should be rewritten to work
+ * properly when LDAPSharedCacheSize is too small.
+ */
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL,
+ "LDAPSharedCacheSize is too small. Increase it or "
+ "reduce LDAPCacheEntries/LDAPOpCacheEntries!");
+ if (cache->numentries < cache->fullmark) {
+ /*
+ * We have not even reached fullmark, trigger a complete purge.
+ * This is still better than not being able to add new entries
+ * at all.
+ */
+ cache->marktime = apr_time_now();
+ }
+ util_ald_cache_purge(cache);
+ tmp_payload = (*cache->copy)(cache, payload);
+ if (tmp_payload == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
+ "Could not allocate memory for LDAP cache value");
+ util_ald_free(cache, node);
+ return NULL;
+ }
}
+ payload = tmp_payload;
/* populate the entry */
cache->inserts++;