Skip to content

Commit

Permalink
memcached: handle error cases and alloc enough for null termination
Browse files Browse the repository at this point in the history
(cherry picked from commit 5f9eba3)
  • Loading branch information
miconda committed Aug 30, 2017
1 parent 59e263c commit 3981627
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/modules/memcached/mcd_var.c
Expand Up @@ -442,6 +442,7 @@ int pv_parse_mcd_name(pv_spec_p sp, str *in) {

if(pv_parse_format(in, &tmp) || tmp==NULL) {
LM_ERR("wrong format [%.*s]\n", in->len, in->s);
if(tmp) pkg_free(tmp);
return -1;
}

Expand Down
19 changes: 17 additions & 2 deletions src/modules/memcached/memcached.c
Expand Up @@ -233,6 +233,7 @@ static int mod_init(void) {
char *server, *port;
unsigned int len = 0;
memcached_return rc;
struct memcached_server_st *svt;

if ((port = strchr(mcd_srv_str, ':')) != NULL) {
port = port + 1;
Expand All @@ -243,7 +244,7 @@ static int mod_init(void) {
len = strlen(mcd_srv_str) ;
}

server = pkg_malloc(len);
server = pkg_malloc(len+1);
if (server == NULL) {
PKG_MEM_ERROR;
return -1;
Expand All @@ -255,6 +256,7 @@ static int mod_init(void) {
memcached_h = memcached_create(NULL);
if (memcached_h == NULL) {
LM_ERR("could not create memcached structure\n");
pkg_free(server);
return -1;
}
LM_DBG("allocated new server handle at %p", memcached_h);
Expand All @@ -276,23 +278,36 @@ static int mod_init(void) {
LM_DBG("memory manager callbacks set\n");
} else {
LM_ERR("memory manager callbacks not set, returned %s.\n", memcached_strerror(memcached_h, rc));
pkg_free(server);
return -1;
}
} else {
LM_INFO("Use system memory manager for memcached client library\n");
}

servers = memcached_server_list_append(servers, server, atoi(port), &rc);
svt = memcached_server_list_append(servers, server, atoi(port), &rc);
if(svt==NULL) {
LM_ERR("failed to append server\n");
if(servers) {
memcached_server_list_free(servers);
servers = NULL;
}
pkg_free(server);
return -1;
}

servers = svt;
if (memcached_behavior_set(memcached_h, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, mcd_timeout) != MEMCACHED_SUCCESS) {
LM_ERR("could not set server connection timeout\n");
pkg_free(server);
return -1;
}
rc = memcached_server_push(memcached_h, servers);
if (rc == MEMCACHED_SUCCESS) {
LM_DBG("added server list to structure\n");
} else {
LM_ERR("attempt to add server list to structure returned %s.\n", memcached_strerror(memcached_h, rc));
pkg_free(server);
return -1;
}

Expand Down

0 comments on commit 3981627

Please sign in to comment.