diff options
author | Russell Bryant <russell@russellbryant.com> | 2011-07-29 19:34:36 +0000 |
---|---|---|
committer | Russell Bryant <russell@russellbryant.com> | 2011-07-29 19:34:36 +0000 |
commit | 6a15e95a324bfd4ab6824f4cf9e047d7db684c52 (patch) | |
tree | ca7f78316d950a6b7a8d5f75e46581ef828e111e /channels | |
parent | d2ed4ed5f70b7d670623ad1d7dee8e9268ff175a (diff) |
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
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_iax2.c | 57 |
1 files changed, 20 insertions, 37 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index dff1bfda2..71844d68f 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -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; } |