problem with libmemcache
Evan Martin
evan.martin at gmail.com
Fri Apr 1 20:37:53 PST 2005
It looks to me like you're inserting exactly 12 bytes of your
12-character string, which means you're not including the trailing
NULL. So there's no way upon retrieval to tell how long the string
was.
Solutions:
(1) Null-terminate your strings when you insert: effectively, just put
strlen(x)+1 bytes in.
(2) Get the number of bytes read back from libmemcache [is this
possible? I'm staring at the API and not seeing it] and use that to
stick a trailing NULL on. (Be sure your buffer is long enough.)
On Apr 1, 2005 7:32 PM, gavin hurley <gavin at jtllc.com> wrote:
> I have a problem with libmemcache and I don't know if it's a problem
> with my C skills (which are quite rusty; them newfangled garbage
> collected languages have made me soft) or libmemcache itself. So far,
> the evidence is in favor of a problem with libmemcache.
>
> I have a very simple test program that writes a key/value pair to the
> cache and then gets that value back. Most values work okay but when the
> payload is 12 characters long I have a problem with what's returned. I
> get back 15 characters instead of 12. The extras are non-printable and
> they seem somewhat random (suspiciously like uninitialized memory)
> except that they're always the same.
>
> If I change the payload to make it 11 or 13 charecters long, it works
> beautifully. Also, it doesn't seem to have anything to do with the
> length of the key. I've been debugging for hours but I can't quite
> figure out what's going on in libmemcache when it does the memory
> allocation for mc_aget.
>
> Anyway, here's the program. My environment is Linux. Basically, I'm
> looking for someone to either show that I'm an idiot or bring awareness
> to a bug in libmemcache. Many thanks.
>
> Oh, almost forgot. When I compile and run this on my Mac (FreeBSD core)
> I get the same problem when the payload is 2 characters (and other
> lengths as well). 12 characters seems to be okay.
>
> -gsh
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include "memcache.h"
>
> int main () {
> struct memcache *mc = NULL;
> mc = mc_new();
> if (mc == NULL) {
> printf("unable to allocate memcache instance. aborting\n");
> exit(1);
> }
> mc_server_add(mc, "127.0.0.1", "11211");
>
> char* key = "test_foo";
> char* payload = "123456789012"; /*payloads of length 12 won't work
> */
> void* result;
>
> printf("payload: %s \n", payload);
> mc_set(mc, key, strlen(key), payload, strlen(payload), 0, 0);
>
> result = mc_aget(mc, key, strlen(key));
> printf("returned from cache: %s length %d \n\n",
> (char *)result, strlen(result));
> free(result);
>
> mc_server_disconnect_all(mc);
> mc_free(mc);
> return 0;
> }
>
>
More information about the memcached
mailing list