mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
astobj2: Avoid using temporary objects + ao2_find() with OBJ_POINTER.
There is a fairly common pattern making its way through the code base where we put a temporary object on the stack so we can call ao2_find() with OBJ_POINTER. The purpose is so that it can be passed into the object hash function. However, this really seems like a hack and potentially error prone. This patch is a first stab at approach to avoid having to do that. It adds a new flag, OBJ_KEY, which can be used instead of OBJ_POINTER in these situations. Then, the hash function can know whether it was given an object or some custom data to hash. The patch also changes some uses of ao2_find() for iax2_user and iax2_peer objects to reflect how OBJ_KEY would be used. So long, and thanks for all the fish. Review: https://reviewboard.asterisk.org/r/1184/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@330273 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -1726,8 +1726,9 @@ static int iax2_data_add_codecs(struct ast_data *root, const char *node_name, ia
|
||||
static int peer_hash_cb(const void *obj, const int flags)
|
||||
{
|
||||
const struct iax2_peer *peer = obj;
|
||||
const char *name = obj;
|
||||
|
||||
return ast_str_hash(peer->name);
|
||||
return ast_str_hash(flags & OBJ_KEY ? name : peer->name);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1736,8 +1737,10 @@ static int peer_hash_cb(const void *obj, const int flags)
|
||||
static int peer_cmp_cb(void *obj, void *arg, int flags)
|
||||
{
|
||||
struct iax2_peer *peer = obj, *peer2 = arg;
|
||||
const char *name = arg;
|
||||
|
||||
return !strcmp(peer->name, peer2->name) ? CMP_MATCH | CMP_STOP : 0;
|
||||
return !strcmp(peer->name, flags & OBJ_KEY ? name : peer2->name) ?
|
||||
CMP_MATCH | CMP_STOP : 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1746,8 +1749,9 @@ static int peer_cmp_cb(void *obj, void *arg, int flags)
|
||||
static int user_hash_cb(const void *obj, const int flags)
|
||||
{
|
||||
const struct iax2_user *user = obj;
|
||||
const char *name = obj;
|
||||
|
||||
return ast_str_hash(user->name);
|
||||
return ast_str_hash(flags & OBJ_KEY ? name : user->name);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1756,8 +1760,10 @@ static int user_hash_cb(const void *obj, const int flags)
|
||||
static int user_cmp_cb(void *obj, void *arg, int flags)
|
||||
{
|
||||
struct iax2_user *user = obj, *user2 = arg;
|
||||
const char *name = arg;
|
||||
|
||||
return !strcmp(user->name, user2->name) ? CMP_MATCH | CMP_STOP : 0;
|
||||
return !strcmp(user->name, flags & OBJ_KEY ? name : user2->name) ?
|
||||
CMP_MATCH | CMP_STOP : 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1767,11 +1773,8 @@ static int user_cmp_cb(void *obj, void *arg, int flags)
|
||||
static struct iax2_peer *find_peer(const char *name, int realtime)
|
||||
{
|
||||
struct iax2_peer *peer = NULL;
|
||||
struct iax2_peer tmp_peer = {
|
||||
.name = name,
|
||||
};
|
||||
|
||||
peer = ao2_find(peers, &tmp_peer, OBJ_POINTER);
|
||||
peer = ao2_find(peers, name, OBJ_KEY);
|
||||
|
||||
/* Now go for realtime if applicable */
|
||||
if(!peer && realtime)
|
||||
@@ -1794,11 +1797,7 @@ static inline struct iax2_peer *peer_unref(struct iax2_peer *peer)
|
||||
|
||||
static struct iax2_user *find_user(const char *name)
|
||||
{
|
||||
struct iax2_user tmp_user = {
|
||||
.name = name,
|
||||
};
|
||||
|
||||
return ao2_find(users, &tmp_user, OBJ_POINTER);
|
||||
return ao2_find(users, name, OBJ_KEY);
|
||||
}
|
||||
static inline struct iax2_user *user_ref(struct iax2_user *user)
|
||||
{
|
||||
@@ -1854,11 +1853,8 @@ static void iax2_destroy_helper(struct chan_iax2_pvt *pvt)
|
||||
/* Decrement AUTHREQ count if needed */
|
||||
if (ast_test_flag64(pvt, IAX_MAXAUTHREQ)) {
|
||||
struct iax2_user *user;
|
||||
struct iax2_user tmp_user = {
|
||||
.name = pvt->username,
|
||||
};
|
||||
|
||||
user = ao2_find(users, &tmp_user, OBJ_POINTER);
|
||||
user = ao2_find(users, pvt->username, OBJ_KEY);
|
||||
if (user) {
|
||||
ast_atomic_fetchadd_int(&user->curauthreq, -1);
|
||||
user_unref(user);
|
||||
@@ -6943,12 +6939,9 @@ static char *handle_cli_iax2_unregister(struct ast_cli_entry *e, int cmd, struct
|
||||
p = find_peer(a->argv[2], 1);
|
||||
if (p) {
|
||||
if (p->expire > 0) {
|
||||
struct iax2_peer tmp_peer = {
|
||||
.name = a->argv[2],
|
||||
};
|
||||
struct iax2_peer *peer;
|
||||
|
||||
peer = ao2_find(peers, &tmp_peer, OBJ_POINTER);
|
||||
peer = ao2_find(peers, a->argv[2], OBJ_KEY);
|
||||
if (peer) {
|
||||
expire_registry(peer_ref(peer)); /* will release its own reference when done */
|
||||
peer_unref(peer); /* ref from ao2_find() */
|
||||
@@ -7887,11 +7880,9 @@ static int authenticate_request(int call_num)
|
||||
|
||||
/* If an AUTHREQ restriction is in place, make sure we can send an AUTHREQ back */
|
||||
if (ast_test_flag64(p, IAX_MAXAUTHREQ)) {
|
||||
struct iax2_user *user, tmp_user = {
|
||||
.name = p->username,
|
||||
};
|
||||
struct iax2_user *user;
|
||||
|
||||
user = ao2_find(users, &tmp_user, OBJ_POINTER);
|
||||
user = ao2_find(users, p->username, OBJ_KEY);
|
||||
if (user) {
|
||||
if (user->curauthreq == user->maxauthreq)
|
||||
authreq_restrict = 1;
|
||||
@@ -7937,14 +7928,12 @@ static int authenticate_verify(struct chan_iax2_pvt *p, struct iax_ies *ies)
|
||||
char rsasecret[256] = "";
|
||||
int res = -1;
|
||||
int x;
|
||||
struct iax2_user *user, tmp_user = {
|
||||
.name = p->username,
|
||||
};
|
||||
struct iax2_user *user;
|
||||
|
||||
if (p->authrej) {
|
||||
return res;
|
||||
}
|
||||
user = ao2_find(users, &tmp_user, OBJ_POINTER);
|
||||
user = ao2_find(users, p->username, OBJ_KEY);
|
||||
if (user) {
|
||||
if (ast_test_flag64(p, IAX_MAXAUTHREQ)) {
|
||||
ast_atomic_fetchadd_int(&user->curauthreq, -1);
|
||||
@@ -12400,12 +12389,9 @@ static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, st
|
||||
int maskfound = 0;
|
||||
int found = 0;
|
||||
int firstpass = 1;
|
||||
struct iax2_peer tmp_peer = {
|
||||
.name = name,
|
||||
};
|
||||
|
||||
if (!temponly) {
|
||||
peer = ao2_find(peers, &tmp_peer, OBJ_POINTER);
|
||||
peer = ao2_find(peers, name, OBJ_KEY);
|
||||
if (peer && !ast_test_flag64(peer, IAX_DELME))
|
||||
firstpass = 0;
|
||||
}
|
||||
@@ -12697,12 +12683,9 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, st
|
||||
int oldcurauthreq = 0;
|
||||
char *varname = NULL, *varval = NULL;
|
||||
struct ast_variable *tmpvar = NULL;
|
||||
struct iax2_user tmp_user = {
|
||||
.name = name,
|
||||
};
|
||||
|
||||
if (!temponly) {
|
||||
user = ao2_find(users, &tmp_user, OBJ_POINTER);
|
||||
user = ao2_find(users, name, OBJ_KEY);
|
||||
if (user && !ast_test_flag64(user, IAX_DELME))
|
||||
firstpass = 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user