projects
/
awesomized
/
libmemcached
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
libmemcached: fix #50 with supplied patch
[awesomized/libmemcached]
/
libmemcached
/
sasl.cc
diff --git
a/libmemcached/sasl.cc
b/libmemcached/sasl.cc
index 32906cc8a8858e82056d8b87c822afd53147be0f..5ec8bee2fd454cd09184c2aabcba920a5c6bf94c 100644
(file)
--- a/
libmemcached/sasl.cc
+++ b/
libmemcached/sasl.cc
@@
-2,7
+2,7
@@
*
* Libmemcached library
*
*
* Libmemcached library
*
- * Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ * Copyright (C) 2011
-2012
Data Differential, http://datadifferential.com/
* Copyright (C) 2006-2009 Brian Aker All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* Copyright (C) 2006-2009 Brian Aker All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@
-35,24
+35,39
@@
*
*/
*
*/
-#include
<libmemcached/common.h>
+#include
"libmemcached/common.h"
#include <cassert>
#if defined(LIBMEMCACHED_WITH_SASL_SUPPORT) && LIBMEMCACHED_WITH_SASL_SUPPORT
#include <cassert>
#if defined(LIBMEMCACHED_WITH_SASL_SUPPORT) && LIBMEMCACHED_WITH_SASL_SUPPORT
+#if defined(HAVE_LIBSASL) && HAVE_LIBSASL
#include <sasl/sasl.h>
#include <sasl/sasl.h>
+#endif
+
+#define CAST_SASL_CB(cb) reinterpret_cast<int(*)()>(reinterpret_cast<intptr_t>(cb))
+
#include <pthread.h>
#include <pthread.h>
-void memcached_set_sasl_callbacks(memcached_st *
ptr
,
+void memcached_set_sasl_callbacks(memcached_st *
shell
,
const sasl_callback_t *callbacks)
{
const sasl_callback_t *callbacks)
{
- ptr->sasl.callbacks= const_cast<sasl_callback_t *>(callbacks);
- ptr->sasl.is_allocated= false;
+ Memcached* self= memcached2Memcached(shell);
+ if (self)
+ {
+ self->sasl.callbacks= const_cast<sasl_callback_t *>(callbacks);
+ self->sasl.is_allocated= false;
+ }
}
}
-sasl_callback_t *memcached_get_sasl_callbacks(memcached_st *
ptr
)
+sasl_callback_t *memcached_get_sasl_callbacks(memcached_st *
shell
)
{
{
- return ptr->sasl.callbacks;
+ Memcached* self= memcached2Memcached(shell);
+ if (self)
+ {
+ return self->sasl.callbacks;
+ }
+
+ return NULL;
}
/**
}
/**
@@
-62,21
+77,21
@@
sasl_callback_t *memcached_get_sasl_callbacks(memcached_st *ptr)
* @param raddr remote address (out)
* @return true on success false otherwise (errno contains more info)
*/
* @param raddr remote address (out)
* @return true on success false otherwise (errno contains more info)
*/
-static memcached_return_t resolve_names(memcached_
server
_st& server, char *laddr, size_t laddr_length, char *raddr, size_t raddr_length)
+static memcached_return_t resolve_names(memcached_
instance
_st& server, char *laddr, size_t laddr_length, char *raddr, size_t raddr_length)
{
{
- char host[NI_MAXHOST];
- char port[NI_MAXSERV];
+ char host[
MEMCACHED_
NI_MAXHOST];
+ char port[
MEMCACHED_
NI_MAXSERV];
struct sockaddr_storage saddr;
socklen_t salen= sizeof(saddr);
if (getsockname(server.fd, (struct sockaddr *)&saddr, &salen) < 0)
{
struct sockaddr_storage saddr;
socklen_t salen= sizeof(saddr);
if (getsockname(server.fd, (struct sockaddr *)&saddr, &salen) < 0)
{
- return memcached_set_err
no(server, MEMCACHED_ERRNO
, MEMCACHED_AT);
+ return memcached_set_err
or(server, MEMCACHED_HOST_LOOKUP_FAILURE
, MEMCACHED_AT);
}
if (getnameinfo((struct sockaddr *)&saddr, salen, host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV) < 0)
{
}
if (getnameinfo((struct sockaddr *)&saddr, salen, host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV) < 0)
{
- return
MEMCACHED_HOST_LOOKUP_FAILURE
;
+ return
memcached_set_error(server, MEMCACHED_HOST_LOOKUP_FAILURE, MEMCACHED_AT)
;
}
(void)snprintf(laddr, laddr_length, "%s;%s", host, port);
}
(void)snprintf(laddr, laddr_length, "%s;%s", host, port);
@@
-84,7
+99,7
@@
static memcached_return_t resolve_names(memcached_server_st& server, char *laddr
if (getpeername(server.fd, (struct sockaddr *)&saddr, &salen) < 0)
{
if (getpeername(server.fd, (struct sockaddr *)&saddr, &salen) < 0)
{
- return memcached_set_err
no(server, MEMCACHED_ERRNO
, MEMCACHED_AT);
+ return memcached_set_err
or(server, MEMCACHED_HOST_LOOKUP_FAILURE
, MEMCACHED_AT);
}
if (getnameinfo((struct sockaddr *)&saddr, salen, host, sizeof(host),
}
if (getnameinfo((struct sockaddr *)&saddr, salen, host, sizeof(host),
@@
-120,7
+135,7
@@
static void sasl_startup_function(void)
} // extern "C"
} // extern "C"
-memcached_return_t memcached_sasl_authenticate_connection(memcached_
server_st *
server)
+memcached_return_t memcached_sasl_authenticate_connection(memcached_
instance_st*
server)
{
if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0)
{
{
if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0)
{
@@
-133,9
+148,10
@@
memcached_return_t memcached_sasl_authenticate_connection(memcached_server_st *s
}
/* SANITY CHECK: SASL can only be used with the binary protocol */
}
/* SANITY CHECK: SASL can only be used with the binary protocol */
- if (
server->root->flags.binary_protocol
== false)
+ if (
memcached_is_binary(server->root)
== false)
{
{
- return MEMCACHED_PROTOCOL_ERROR;
+ return memcached_set_error(*server, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+ memcached_literal_param("memcached_sasl_authenticate_connection() is not supported via the ASCII protocol"));
}
/* Try to get the supported mech from the server. Servers without SASL
}
/* Try to get the supported mech from the server. Servers without SASL
@@
-143,14
+159,16
@@
memcached_return_t memcached_sasl_authenticate_connection(memcached_server_st *s
* as authenticated
*/
protocol_binary_request_no_extras request= { };
* as authenticated
*/
protocol_binary_request_no_extras request= { };
- request.message.header.request.magic= PROTOCOL_BINARY_REQ;
+
+ initialize_binary_request(server, request.message.header);
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_SASL_LIST_MECHS;
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_SASL_LIST_MECHS;
- if (memcached_io_write(server, request.bytes,
- sizeof(request.bytes), 1) != sizeof(request.bytes))
+ if (memcached_io_write(server, request.bytes, sizeof(request.bytes), true) != sizeof(request.bytes))
{
return MEMCACHED_WRITE_FAILURE;
}
{
return MEMCACHED_WRITE_FAILURE;
}
+ assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket");
memcached_server_response_increment(server);
memcached_server_response_increment(server);
@@
-171,10
+189,11
@@
memcached_return_t memcached_sasl_authenticate_connection(memcached_server_st *s
return rc;
}
return rc;
}
+ assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket");
/* set ip addresses */
/* set ip addresses */
- char laddr[
NI_MAXHOST +
NI_MAXSERV];
- char raddr[
NI_MAXHOST +
NI_MAXSERV];
+ char laddr[
MEMCACHED_NI_MAXHOST + MEMCACHED_
NI_MAXSERV];
+ char raddr[
MEMCACHED_NI_MAXHOST + MEMCACHED_
NI_MAXSERV];
if (memcached_failed(rc= resolve_names(*server, laddr, sizeof(laddr), raddr, sizeof(raddr))))
{
if (memcached_failed(rc= resolve_names(*server, laddr, sizeof(laddr), raddr, sizeof(raddr))))
{
@@
-198,7
+217,7
@@
memcached_return_t memcached_sasl_authenticate_connection(memcached_server_st *s
sasl_conn_t *conn;
int ret;
sasl_conn_t *conn;
int ret;
- if ((ret= sasl_client_new("memcached", server->hostname, laddr, raddr, server->root->sasl.callbacks, 0, &conn) ) != SASL_OK)
+ if ((ret= sasl_client_new("memcached", server->
_
hostname, laddr, raddr, server->root->sasl.callbacks, 0, &conn) ) != SASL_OK)
{
const char *sasl_error_msg= sasl_errstring(ret, NULL, NULL);
{
const char *sasl_error_msg= sasl_errstring(ret, NULL, NULL);
@@
-229,26
+248,30
@@
memcached_return_t memcached_sasl_authenticate_connection(memcached_server_st *s
do {
/* send the packet */
do {
/* send the packet */
-
struct
libmemcached_io_vector_st vector[]=
+ libmemcached_io_vector_st vector[]=
{
{ request.bytes, sizeof(request.bytes) },
{ chosenmech, keylen },
{ data, len }
};
{
{ request.bytes, sizeof(request.bytes) },
{ chosenmech, keylen },
{ data, len }
};
- if (memcached_io_writev(server, vector, 3, true) == -1)
+ assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket");
+ if (memcached_io_writev(server, vector, 3, true) == false)
{
rc= MEMCACHED_WRITE_FAILURE;
break;
}
{
rc= MEMCACHED_WRITE_FAILURE;
break;
}
+ assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket");
memcached_server_response_increment(server);
/* read the response */
memcached_server_response_increment(server);
/* read the response */
+ assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket");
rc= memcached_response(server, NULL, 0, NULL);
if (rc != MEMCACHED_AUTH_CONTINUE)
{
break;
}
rc= memcached_response(server, NULL, 0, NULL);
if (rc != MEMCACHED_AUTH_CONTINUE)
{
break;
}
+ assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket");
ret= sasl_client_step(conn, memcached_result_value(&server->root->result),
(unsigned int)memcached_result_length(&server->root->result),
ret= sasl_client_step(conn, memcached_result_value(&server->root->result),
(unsigned int)memcached_result_length(&server->root->result),
@@
-299,10
+322,11
@@
static int get_password(sasl_conn_t *conn, void *context, int id,
return SASL_OK;
}
return SASL_OK;
}
-memcached_return_t memcached_set_sasl_auth_data(memcached_st *
ptr
,
+memcached_return_t memcached_set_sasl_auth_data(memcached_st *
shell
,
const char *username,
const char *password)
{
const char *username,
const char *password)
{
+ Memcached* ptr= memcached2Memcached(shell);
if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0)
{
return MEMCACHED_NOT_SUPPORTED;
if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0)
{
return MEMCACHED_NOT_SUPPORTED;
@@
-321,7
+345,7
@@
memcached_return_t memcached_set_sasl_auth_data(memcached_st *ptr,
memcached_destroy_sasl_auth_data(ptr);
memcached_destroy_sasl_auth_data(ptr);
- sasl_callback_t *callbacks=
(sasl_callback_t*)libmemcached_calloc(ptr, 4, sizeof(sasl_callback_t)
);
+ sasl_callback_t *callbacks=
libmemcached_xcalloc(ptr, 4, sasl_callback_t
);
size_t password_length= strlen(password);
size_t username_length= strlen(username);
char *name= (char *)libmemcached_malloc(ptr, username_length +1);
size_t password_length= strlen(password);
size_t username_length= strlen(username);
char *name= (char *)libmemcached_malloc(ptr, username_length +1);
@@
-340,13
+364,13
@@
memcached_return_t memcached_set_sasl_auth_data(memcached_st *ptr,
secret->data[password_length]= 0;
callbacks[0].id= SASL_CB_USER;
secret->data[password_length]= 0;
callbacks[0].id= SASL_CB_USER;
- callbacks[0].proc=
(int (*)())get_username
;
+ callbacks[0].proc=
CAST_SASL_CB(get_username)
;
callbacks[0].context= strncpy(name, username, username_length +1);
callbacks[1].id= SASL_CB_AUTHNAME;
callbacks[0].context= strncpy(name, username, username_length +1);
callbacks[1].id= SASL_CB_AUTHNAME;
- callbacks[1].proc=
(int (*)())get_username
;
+ callbacks[1].proc=
CAST_SASL_CB(get_username)
;
callbacks[1].context= name;
callbacks[2].id= SASL_CB_PASS;
callbacks[1].context= name;
callbacks[2].id= SASL_CB_PASS;
- callbacks[2].proc=
(int (*)())get_password
;
+ callbacks[2].proc=
CAST_SASL_CB(get_password)
;
callbacks[2].context= secret;
callbacks[3].id= SASL_CB_LIST_END;
callbacks[2].context= secret;
callbacks[3].id= SASL_CB_LIST_END;
@@
-356,13
+380,14
@@
memcached_return_t memcached_set_sasl_auth_data(memcached_st *ptr,
return MEMCACHED_SUCCESS;
}
return MEMCACHED_SUCCESS;
}
-memcached_return_t memcached_destroy_sasl_auth_data(memcached_st *
ptr
)
+memcached_return_t memcached_destroy_sasl_auth_data(memcached_st *
shell
)
{
if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0)
{
return MEMCACHED_NOT_SUPPORTED;
}
{
if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0)
{
return MEMCACHED_NOT_SUPPORTED;
}
+ Memcached* ptr= memcached2Memcached(shell);
if (ptr == NULL)
{
return MEMCACHED_INVALID_ARGUMENTS;
if (ptr == NULL)
{
return MEMCACHED_INVALID_ARGUMENTS;
@@
-405,11
+430,11
@@
memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st
/* Hopefully we are using our own callback mechanisms.. */
if (source->sasl.callbacks[0].id == SASL_CB_USER &&
/* Hopefully we are using our own callback mechanisms.. */
if (source->sasl.callbacks[0].id == SASL_CB_USER &&
- source->sasl.callbacks[0].proc ==
(int (*)())get_username
&&
+ source->sasl.callbacks[0].proc ==
CAST_SASL_CB(get_username)
&&
source->sasl.callbacks[1].id == SASL_CB_AUTHNAME &&
source->sasl.callbacks[1].id == SASL_CB_AUTHNAME &&
- source->sasl.callbacks[1].proc ==
(int (*)())get_username
&&
+ source->sasl.callbacks[1].proc ==
CAST_SASL_CB(get_username)
&&
source->sasl.callbacks[2].id == SASL_CB_PASS &&
source->sasl.callbacks[2].id == SASL_CB_PASS &&
- source->sasl.callbacks[2].proc ==
(int (*)())get_password
&&
+ source->sasl.callbacks[2].proc ==
CAST_SASL_CB(get_password)
&&
source->sasl.callbacks[3].id == SASL_CB_LIST_END)
{
sasl_secret_t *secret= (sasl_secret_t *)source->sasl.callbacks[2].context;
source->sasl.callbacks[3].id == SASL_CB_LIST_END)
{
sasl_secret_t *secret= (sasl_secret_t *)source->sasl.callbacks[2].context;
@@
-423,7
+448,7
@@
memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st
* into the list, but if we don't know the ID we don't know how to handle
* the context...
*/
* into the list, but if we don't know the ID we don't know how to handle
* the context...
*/
-
size
_t total= 0;
+
ptrdiff
_t total= 0;
while (source->sasl.callbacks[total].id != SASL_CB_LIST_END)
{
while (source->sasl.callbacks[total].id != SASL_CB_LIST_END)
{
@@
-441,7
+466,7
@@
memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st
++total;
}
++total;
}
- sasl_callback_t *callbacks=
(sasl_callback_t*)libmemcached_calloc(clone, total +1, sizeof(sasl_callback_t)
);
+ sasl_callback_t *callbacks=
libmemcached_xcalloc(clone, total +1, sasl_callback_t
);
if (callbacks == NULL)
{
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
if (callbacks == NULL)
{
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
@@
-449,7
+474,7
@@
memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st
memcpy(callbacks, source->sasl.callbacks, (total + 1) * sizeof(sasl_callback_t));
/* Now update the context... */
memcpy(callbacks, source->sasl.callbacks, (total + 1) * sizeof(sasl_callback_t));
/* Now update the context... */
- for (
size
_t x= 0; x < total; ++x)
+ for (
ptrdiff
_t x= 0; x < total; ++x)
{
if (callbacks[x].id == SASL_CB_USER || callbacks[x].id == SASL_CB_AUTHNAME)
{
{
if (callbacks[x].id == SASL_CB_USER || callbacks[x].id == SASL_CB_AUTHNAME)
{
@@
-458,7
+483,7
@@
memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st
if (callbacks[x].context == NULL)
{
/* Failed to allocate memory, clean up previously allocated memory */
if (callbacks[x].context == NULL)
{
/* Failed to allocate memory, clean up previously allocated memory */
- for (
size
_t y= 0; y < x; ++y)
+ for (
ptrdiff
_t y= 0; y < x; ++y)
{
libmemcached_free(clone, clone->sasl.callbacks[y].context);
}
{
libmemcached_free(clone, clone->sasl.callbacks[y].context);
}
@@
-475,7
+500,7
@@
memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st
if (n == NULL)
{
/* Failed to allocate memory, clean up previously allocated memory */
if (n == NULL)
{
/* Failed to allocate memory, clean up previously allocated memory */
- for (
size
_t y= 0; y < x; ++y)
+ for (
ptrdiff
_t y= 0; y < x; ++y)
{
libmemcached_free(clone, clone->sasl.callbacks[y].context);
}
{
libmemcached_free(clone, clone->sasl.callbacks[y].context);
}