diff options
author | Brian Aker <brian@tangent.org> | 2011-07-29 15:00:34 -0700 |
---|---|---|
committer | Brian Aker <brian@tangent.org> | 2011-07-29 15:00:34 -0700 |
commit | 647f5b82467172c55e456b6833d4c2f0bdc0bc5a (patch) | |
tree | ce7387116140168ce3c9d384263f0042706f48e5 /libmemcached/response.cc | |
parent | 2adc448985b71cb2f5eff52b691cd3307860a144 (diff) | |
download | libmemcached-647f5b82467172c55e456b6833d4c2f0bdc0bc5a.tar.gz |
Merge in simple extrace for strings, style issues in io
Diffstat (limited to 'libmemcached/response.cc')
-rw-r--r-- | libmemcached/response.cc | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/libmemcached/response.cc b/libmemcached/response.cc index 1548b4ed..dddcb349 100644 --- a/libmemcached/response.cc +++ b/libmemcached/response.cc @@ -36,6 +36,7 @@ */ #include <libmemcached/common.h> +#include <libmemcached/string.hpp> static memcached_return_t textual_read_one_response(memcached_server_write_instance_st ptr, char *buffer, size_t buffer_length, @@ -252,7 +253,9 @@ static memcached_return_t textual_read_one_response(memcached_server_write_insta char *buffer, size_t buffer_length, memcached_result_st *result) { - memcached_return_t rc= memcached_io_readline(ptr, buffer, buffer_length); + size_t total_read; + memcached_return_t rc= memcached_io_readline(ptr, buffer, buffer_length, total_read); + if (memcached_failed(rc)) { return rc; @@ -287,8 +290,25 @@ static memcached_return_t textual_read_one_response(memcached_server_write_insta } else if (buffer[1] == 'E') /* SERVER_ERROR */ { - char *startptr= buffer + 13, *endptr= startptr; + if (total_read == memcached_literal_param_size("SERVER_ERROR")) + { + return MEMCACHED_SERVER_ERROR; + } + + if (total_read > memcached_literal_param_size("SERVER_ERROR object too large for cache") and + (memcmp(buffer, memcached_literal_param("SERVER_ERROR object too large for cache")) == 0)) + { + return MEMCACHED_E2BIG; + } + + // Move past the basic error message and whitespace + char *startptr= buffer + memcached_literal_param_size("SERVER_ERROR"); + if (startptr[0] == ' ') + { + startptr++; + } + char *endptr= startptr; while (*endptr != '\r' && *endptr != '\n') endptr++; return memcached_set_error(*ptr, MEMCACHED_SERVER_ERROR, MEMCACHED_AT, startptr, size_t(endptr - startptr)); |