From d48e5dd128c51da41ccdf71a14ce7f8f083e1fdb Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Mon, 16 Apr 2018 13:08:00 -0400 Subject: [PATCH] Make better use of talloc for TR_MSG handling --- common/tr_msg.c | 119 +++++++++++++++++++++---------------------------------- include/tr_msg.h | 2 +- 2 files changed, 47 insertions(+), 74 deletions(-) diff --git a/common/tr_msg.c b/common/tr_msg.c index 8d792cb..4cbadd9 100644 --- a/common/tr_msg.c +++ b/common/tr_msg.c @@ -273,7 +273,7 @@ static json_t * tr_msg_encode_tidreq(TID_REQ *req) return jreq; } -static TID_REQ *tr_msg_decode_tidreq(json_t *jreq) +static TID_REQ *tr_msg_decode_tidreq(TALLOC_CTX *mem_ctx, json_t *jreq) { TID_REQ *treq = NULL; json_t *jrp_realm = NULL; @@ -288,7 +288,8 @@ static TID_REQ *tr_msg_decode_tidreq(json_t *jreq) tr_crit("tr_msg_decode_tidreq(): Error allocating TID_REQ structure."); return NULL; } - + talloc_steal(mem_ctx, treq); + /* store required fields from request */ if ((NULL == (jrp_realm = json_object_get(jreq, "rp_realm"))) || (NULL == (jrealm = json_object_get(jreq, "target_realm"))) || @@ -510,7 +511,7 @@ static json_t * tr_msg_encode_tidresp(TID_RESP *resp) return jresp; } -static TID_RESP *tr_msg_decode_tidresp(json_t *jresp) +static TID_RESP *tr_msg_decode_tidresp(TALLOC_CTX *mem_ctx, json_t *jresp) { TID_RESP *tresp = NULL; json_t *jresult = NULL; @@ -521,11 +522,10 @@ static TID_RESP *tr_msg_decode_tidresp(json_t *jresp) json_t *jservers = NULL; json_t *jerr_msg = NULL; - if (!(tresp=tid_resp_new(NULL))) { + if (!(tresp=tid_resp_new(mem_ctx))) { tr_crit("tr_msg_decode_tidresp(): Error allocating TID_RESP structure."); return NULL; } - /* store required fields from response */ if ((NULL == (jresult = json_object_get(jresp, "result"))) || @@ -1187,8 +1187,7 @@ char *tr_msg_encode(TALLOC_CTX *mem_ctx, TR_MSG *msg) /* TBD -- add error handling */ jmsg = json_object(); - switch (msg->msg_type) - { + switch (msg->msg_type) { case TID_REQUEST: jmsg_type = json_string("tid_request"); json_object_set_new(jmsg, "msg_type", jmsg_type); @@ -1203,38 +1202,38 @@ char *tr_msg_encode(TALLOC_CTX *mem_ctx, TR_MSG *msg) json_object_set_new(jmsg, "msg_body", tr_msg_encode_tidresp(tidresp)); break; - case TRP_UPDATE: - jmsg_type = json_string("trp_update"); - json_object_set_new(jmsg, "msg_type", jmsg_type); - trpupd=tr_msg_get_trp_upd(msg); - json_object_set_new(jmsg, "msg_body", tr_msg_encode_trp_upd(trpupd)); - break; - - case TRP_REQUEST: - jmsg_type = json_string("trp_request"); - json_object_set_new(jmsg, "msg_type", jmsg_type); - trpreq=tr_msg_get_trp_req(msg); - json_object_set_new(jmsg, "msg_body", tr_msg_encode_trp_req(trpreq)); - break; - - case MON_REQUEST: - jmsg_type = json_string("mon_request"); - json_object_set_new(jmsg, "msg_type", jmsg_type); - monreq=tr_msg_get_mon_req(msg); - json_object_set_new(jmsg, "msg_body", mon_req_encode(monreq)); - break; - - case MON_RESPONSE: - jmsg_type = json_string("mon_response"); - json_object_set_new(jmsg, "msg_type", jmsg_type); - monresp=tr_msg_get_mon_resp(msg); - json_object_set_new(jmsg, "msg_body", mon_resp_encode(monresp)); - break; - - default: + case TRP_UPDATE: + jmsg_type = json_string("trp_update"); + json_object_set_new(jmsg, "msg_type", jmsg_type); + trpupd=tr_msg_get_trp_upd(msg); + json_object_set_new(jmsg, "msg_body", tr_msg_encode_trp_upd(trpupd)); + break; + + case TRP_REQUEST: + jmsg_type = json_string("trp_request"); + json_object_set_new(jmsg, "msg_type", jmsg_type); + trpreq=tr_msg_get_trp_req(msg); + json_object_set_new(jmsg, "msg_body", tr_msg_encode_trp_req(trpreq)); + break; + + case MON_REQUEST: + jmsg_type = json_string("mon_request"); + json_object_set_new(jmsg, "msg_type", jmsg_type); + monreq=tr_msg_get_mon_req(msg); + json_object_set_new(jmsg, "msg_body", mon_req_encode(monreq)); + break; + + case MON_RESPONSE: + jmsg_type = json_string("mon_response"); + json_object_set_new(jmsg, "msg_type", jmsg_type); + monresp=tr_msg_get_mon_resp(msg); + json_object_set_new(jmsg, "msg_body", mon_resp_encode(monresp)); + break; + + default: json_decref(jmsg); return NULL; - } + } /* We should perhaps use json_set_alloc_funcs to automatically use talloc, but for * now, we'll encode to a malloc'ed buffer, then copy that to a talloc'ed buffer. */ @@ -1247,7 +1246,7 @@ char *tr_msg_encode(TALLOC_CTX *mem_ctx, TR_MSG *msg) return encoded; } -TR_MSG *tr_msg_decode(const char *jbuf, size_t buflen) +TR_MSG *tr_msg_decode(TALLOC_CTX *mem_ctx, const char *jbuf, size_t buflen) { TR_MSG *msg=NULL; json_t *jmsg = NULL; @@ -1261,14 +1260,12 @@ TR_MSG *tr_msg_decode(const char *jbuf, size_t buflen) return NULL; } - if (!(msg = malloc(sizeof(TR_MSG)))) { + if (!(msg = talloc_zero(mem_ctx, TR_MSG))) { tr_debug("tr_msg_decode(): Error allocating TR_MSG structure."); json_decref(jmsg); return NULL; } - memset(msg, 0, sizeof(TR_MSG)); - if ((NULL == (jtype = json_object_get(jmsg, "msg_type"))) || (NULL == (jbody = json_object_get(jmsg, "msg_body")))) { tr_debug("tr_msg_decode(): Error parsing message header."); @@ -1281,23 +1278,23 @@ TR_MSG *tr_msg_decode(const char *jbuf, size_t buflen) if (0 == strcmp(mtype, "tid_request")) { msg->msg_type = TID_REQUEST; - tr_msg_set_req(msg, tr_msg_decode_tidreq(jbody)); + tr_msg_set_req(msg, tr_msg_decode_tidreq(msg, jbody)); } else if (0 == strcmp(mtype, "tid_response")) { msg->msg_type = TID_RESPONSE; - tr_msg_set_resp(msg, tr_msg_decode_tidresp(jbody)); + tr_msg_set_resp(msg, tr_msg_decode_tidresp(msg, jbody)); } else if (0 == strcmp(mtype, "trp_update")) { msg->msg_type = TRP_UPDATE; - tr_msg_set_trp_upd(msg, tr_msg_decode_trp_upd(NULL, jbody)); /* null talloc context for now */ + tr_msg_set_trp_upd(msg, tr_msg_decode_trp_upd(msg, jbody)); /* null talloc context for now */ } else if (0 == strcmp(mtype, "trp_request")) { msg->msg_type = TRP_UPDATE; - tr_msg_set_trp_req(msg, tr_msg_decode_trp_req(NULL, jbody)); /* null talloc context for now */ + tr_msg_set_trp_req(msg, tr_msg_decode_trp_req(msg, jbody)); /* null talloc context for now */ } else if (0 == strcmp(mtype, "mon_request")) { msg->msg_type = MON_REQUEST; - tr_msg_set_mon_req(msg, mon_req_decode(NULL, jbody)); + tr_msg_set_mon_req(msg, mon_req_decode(msg, jbody)); } /* We do not currently handle monitoring responses */ // else if (0 == strcmp(mtype, "mon_response")) { @@ -1317,35 +1314,11 @@ TR_MSG *tr_msg_decode(const char *jbuf, size_t buflen) void tr_msg_free_encoded(char *jmsg) { if (jmsg) - free (jmsg); + talloc_free(jmsg); } void tr_msg_free_decoded(TR_MSG *msg) { - if (msg) { - if (msg->msg_rep!=NULL) { - switch (msg->msg_type) { - case TID_REQUEST: - tid_req_free(tr_msg_get_req(msg)); - break; - case TID_RESPONSE: - tid_resp_free(tr_msg_get_resp(msg)); - break; - case TRP_UPDATE: - trp_upd_free(tr_msg_get_trp_upd(msg)); - break; - case TRP_REQUEST: - trp_req_free(tr_msg_get_trp_req(msg)); - default: - break; - case MON_REQUEST: - mon_req_free(tr_msg_get_mon_req(msg)); - break; - case MON_RESPONSE: - mon_resp_free(tr_msg_get_mon_resp(msg)); - break; - } - } - free (msg); - } + if (msg) + talloc_free(msg); } diff --git a/include/tr_msg.h b/include/tr_msg.h index 17979c1..46332ed 100644 --- a/include/tr_msg.h +++ b/include/tr_msg.h @@ -77,7 +77,7 @@ void tr_msg_set_mon_resp(TR_MSG *msg, MON_RESP *resp); /* Encoders/Decoders */ char *tr_msg_encode(TALLOC_CTX *mem_ctx, TR_MSG *msg); -TR_MSG *tr_msg_decode(const char *jmsg, size_t len); +TR_MSG *tr_msg_decode(TALLOC_CTX *mem_ctx, const char *jmsg, size_t len); void tr_msg_free_encoded(char *jmsg); void tr_msg_free_decoded(TR_MSG *msg); -- 2.1.4