diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2015-03-18 13:33:26 +0000 |
---|---|---|
committer | <> | 2015-07-08 14:41:01 +0000 |
commit | bb0ef45f7c46b0ae221b26265ef98a768c33f820 (patch) | |
tree | 98bae10dde41c746c51ae97ec4f879e330415aa7 /subversion/libsvn_subr/cache-memcache.c | |
parent | 239dfafe71711b2f4c43d7b90a1228d7bdc5195e (diff) | |
download | subversion-tarball-subversion-1.8.13.tar.gz |
Imported from /home/lorry/working-area/delta_subversion-tarball/subversion-1.8.13.tar.gz.subversion-1.8.13
Diffstat (limited to 'subversion/libsvn_subr/cache-memcache.c')
-rw-r--r-- | subversion/libsvn_subr/cache-memcache.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/subversion/libsvn_subr/cache-memcache.c b/subversion/libsvn_subr/cache-memcache.c index 6427c26..500426d 100644 --- a/subversion/libsvn_subr/cache-memcache.c +++ b/subversion/libsvn_subr/cache-memcache.c @@ -29,6 +29,7 @@ #include "svn_private_config.h" #include "private/svn_cache.h" +#include "private/svn_dep_compat.h" #include "cache.h" @@ -141,8 +142,15 @@ memcache_internal_get(char **data, memcache_t *cache = cache_void; apr_status_t apr_err; const char *mc_key; - apr_pool_t *subpool = svn_pool_create(pool); + apr_pool_t *subpool; + + if (key == NULL) + { + *found = FALSE; + return SVN_NO_ERROR; + } + subpool = svn_pool_create(pool); SVN_ERR(build_key(&mc_key, cache, key, subpool)); apr_err = apr_memcache_getp(cache->memcache, @@ -195,9 +203,10 @@ memcache_get(void **value_p, } else { - svn_string_t *value = apr_pcalloc(result_pool, sizeof(*value)); + svn_stringbuf_t *value = svn_stringbuf_create_empty(result_pool); value->data = data; - value->len = data_len; + value->blocksize = data_len; + value->len = data_len - 1; /* account for trailing NUL */ *value_p = value; } } @@ -240,10 +249,13 @@ memcache_set(void *cache_void, { memcache_t *cache = cache_void; apr_pool_t *subpool = svn_pool_create(scratch_pool); - char *data; + void *data; apr_size_t data_len; svn_error_t *err; + if (key == NULL) + return SVN_NO_ERROR; + if (cache->serialize_func) { SVN_ERR((cache->serialize_func)(&data, &data_len, value, subpool)); @@ -252,7 +264,7 @@ memcache_set(void *cache_void, { svn_stringbuf_t *value_str = value; data = value_str->data; - data_len = value_str->len; + data_len = value_str->len + 1; /* copy trailing NUL */ } err = memcache_internal_set(cache_void, key, data, data_len, subpool); @@ -297,12 +309,12 @@ memcache_set_partial(void *cache_void, { svn_error_t *err = SVN_NO_ERROR; - char *data; + void *data; apr_size_t size; svn_boolean_t found = FALSE; apr_pool_t *subpool = svn_pool_create(scratch_pool); - SVN_ERR(memcache_internal_get(&data, + SVN_ERR(memcache_internal_get((char **)&data, &size, &found, cache_void, @@ -459,7 +471,8 @@ add_memcache_server(const char *name, 0, /* min connections */ 5, /* soft max connections */ 10, /* hard max connections */ - 50, /* connection time to live (secs) */ + /* time to live (in microseconds) */ + apr_time_from_sec(50), &server); if (apr_err != APR_SUCCESS) { @@ -517,7 +530,7 @@ svn_cache__make_memcache_from_config(svn_memcache_t **memcache_p, svn_config_t *config, apr_pool_t *pool) { - apr_uint16_t server_count; + int server_count; apr_pool_t *subpool = svn_pool_create(pool); server_count = @@ -532,12 +545,15 @@ svn_cache__make_memcache_from_config(svn_memcache_t **memcache_p, return SVN_NO_ERROR; } + if (server_count > APR_INT16_MAX) + return svn_error_create(SVN_ERR_TOO_MANY_MEMCACHED_SERVERS, NULL, NULL); + #ifdef SVN_HAVE_MEMCACHE { struct ams_baton b; svn_memcache_t *memcache = apr_pcalloc(pool, sizeof(*memcache)); apr_status_t apr_err = apr_memcache_create(pool, - server_count, + (apr_uint16_t)server_count, 0, /* flags */ &(memcache->c)); if (apr_err != APR_SUCCESS) |