libmemcached crash after memcached_servers_reset() and subsequent memcached_server_add()
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
libmemcached |
New
|
Undecided
|
Unassigned |
Bug Description
libmemcached 1.0.18
When used with MEMCACHED_
The following code is a proof:
#include <libmemcached/
#include <stdio.h>
int main() {
const char *config_string= "--SERVER=
const char *key= "foo";
const char *value= "bar";
size_t retlen;
char *retvalue;
err= memcached_
if (err != MEMCACHED_SUCCESS) {
}
err= memcached_
if (err != MEMCACHED_SUCCESS) {
}
err= memcached_set(memc, key, strlen(key), value, strlen(value), 0, 0);
if (err != MEMCACHED_SUCCESS) {
}
retvalue= memcached_get(memc, key, strlen(key), &retlen, 0, &err);
if (retvalue) {
} else {
}
err= memcached_
if (err != MEMCACHED_SUCCESS) {
}
err= memcached_
if (err != MEMCACHED_SUCCESS) {
}
err= memcached_set(memc, key, strlen(key), value, strlen(value), 0, 0);
if (err != MEMCACHED_SUCCESS) {
}
retvalue= memcached_get(memc, key, strlen(key), &retlen, 0, &err);
if (retvalue) {
} else {
}
}
Actual behavior:
$ gcc memcached_bug.c -o memcached_bug -lmemcached -ggdb
$ ./memcached_bug
bar
Segmentation fault (core dumped)
Expected behavior:
$ gcc memcached_bug.c -o memcached_bug -lmemcached -ggdb
$ ./memcached_bug
bar
bar
gdb output:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bbef3d in update_continuum (ptr=0x614c20) at libmemcached/
316 ptr->ketama.
(gdb) bt
#0 0x00007ffff7bbef3d in update_continuum (ptr=0x614c20) at libmemcached/
#1 0x00007ffff7bbf8f6 in memcached_
#2 0x0000000000400c56 in main ()
(gdb) list
311 if (memcached_
312 {
313 for (uint32_t x = 0; x < pointer_per_hash; x++)
314 {
315 uint32_t value= ketama_
316 ptr->ketama.
317 ptr->ketama.
318 }
319 }
320 else
(gdb) print ptr->ketama.
$1 = (memcached_
(gdb) print ptr->ketama.
$2 = 11
(gdb) quit
Attached is a patch to fix that.
re-uploaded a better patch