summaryrefslogtreecommitdiff
path: root/libmemcached/response.cc
diff options
context:
space:
mode:
authorBrian Aker <brian@tangent.org>2011-07-29 15:00:34 -0700
committerBrian Aker <brian@tangent.org>2011-07-29 15:00:34 -0700
commit647f5b82467172c55e456b6833d4c2f0bdc0bc5a (patch)
treece7387116140168ce3c9d384263f0042706f48e5 /libmemcached/response.cc
parent2adc448985b71cb2f5eff52b691cd3307860a144 (diff)
downloadlibmemcached-647f5b82467172c55e456b6833d4c2f0bdc0bc5a.tar.gz
Merge in simple extrace for strings, style issues in io
Diffstat (limited to 'libmemcached/response.cc')
-rw-r--r--libmemcached/response.cc24
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));