Navigation


Changeset 1298:0f215b0dda5e in freeDiameter for libfdproto


Ignore:
Timestamp:
Jun 23, 2015, 1:12:10 PM (9 years ago)
Author:
Sebastien Decugis <sdecugis@freediameter.net>
Branch:
default
Phase:
public
Message:

Fix some possible memory leaks in fd_msg_new

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdproto/messages.c

    r1248 r1298  
    232232                struct dict_avp_data dictdata;
    233233               
    234                 CHECK_FCT(  fd_dict_getval(model, &dictdata)  );
     234                CHECK_FCT_DO(  fd_dict_getval(model, &dictdata), { free(new); return __ret__; }  );
    235235       
    236236                new->avp_model = model;
     
    248248                new->avp_rawlen = (*avp)->avp_public.avp_len - GETAVPHDRSZ( (*avp)->avp_public.avp_flags );
    249249                if (new->avp_rawlen) {
    250                         CHECK_MALLOC(  new->avp_rawdata = malloc(new->avp_rawlen)  );
     250                        CHECK_MALLOC_DO(  new->avp_rawdata = malloc(new->avp_rawlen), { free(new); return __ret__; }  );
    251251                        memset(new->avp_rawdata, 0x00, new->avp_rawlen);
    252252                }
     
    286286                struct dict_object      *dictappl;
    287287               
    288                 CHECK_FCT( fd_dict_getdict(model, &dict) );
    289                 CHECK_FCT( fd_dict_getval(model, &dictdata)  );
     288                CHECK_FCT_DO( fd_dict_getdict(model, &dict), { free(new); return __ret__; } );
     289                CHECK_FCT_DO( fd_dict_getval(model, &dictdata), { free(new); return __ret__; }  );
    290290               
    291291                new->msg_model = model;
     
    294294
    295295                /* Initialize application from the parent, if any */
    296                 CHECK_FCT(  fd_dict_search( dict, DICT_APPLICATION, APPLICATION_OF_COMMAND, model, &dictappl, 0)  );
     296                CHECK_FCT_DO(  fd_dict_search( dict, DICT_APPLICATION, APPLICATION_OF_COMMAND, model, &dictappl, 0), { free(new); return __ret__; }  );
    297297                if (dictappl != NULL) {
    298298                        struct dict_application_data appdata;
    299                         CHECK_FCT(  fd_dict_getval(dictappl, &appdata)  );
     299                        CHECK_FCT_DO(  fd_dict_getval(dictappl, &appdata), { free(new); return __ret__; }  );
    300300                        new->msg_public.msg_appl = appdata.application_id;
    301301                }
     
    365365               
    366366                if (!sess_id_avp) {
    367                         CHECK_FCT( fd_dict_search( dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &sess_id_avp, ENOENT) );
    368                 }
    369                 CHECK_FCT( fd_sess_getsid ( sess, &sid, &sidlen ) );
    370                 CHECK_FCT( fd_msg_avp_new ( sess_id_avp, 0, &avp ) );
     367                        CHECK_FCT_DO( fd_dict_search( dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &sess_id_avp, ENOENT), { free(ans); return __ret__; } );
     368                }
     369                CHECK_FCT_DO( fd_sess_getsid ( sess, &sid, &sidlen ), { free(ans); return __ret__; } );
     370                CHECK_FCT_DO( fd_msg_avp_new ( sess_id_avp, 0, &avp ), { free(ans); return __ret__; } );
    371371                val.os.data = sid;
    372372                val.os.len  = sidlen;
    373                 CHECK_FCT( fd_msg_avp_setvalue( avp, &val ) );
    374                 CHECK_FCT( fd_msg_avp_add( ans, MSG_BRW_FIRST_CHILD, avp ) );
     373                CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), { free(avp); free(ans); return __ret__; } );
     374                CHECK_FCT_DO( fd_msg_avp_add( ans, MSG_BRW_FIRST_CHILD, avp ), { free(avp); free(ans); return __ret__; } );
    375375                ans->msg_sess = sess;
    376                 CHECK_FCT( fd_sess_ref_msg(sess) );
     376                CHECK_FCT_DO( fd_sess_ref_msg(sess), { free(ans); return __ret__; } );
    377377        }
    378378       
     
    383383                struct fd_list avpcpylist = FD_LIST_INITIALIZER(avpcpylist);
    384384               
    385                 CHECK_FCT(  fd_msg_browse(qry, MSG_BRW_FIRST_CHILD, &avp, NULL) );
     385                CHECK_FCT_DO(  fd_msg_browse(qry, MSG_BRW_FIRST_CHILD, &avp, NULL) , { free(ans); return __ret__; } );
    386386                while (avp) {
    387387                        if ( (avp->avp_public.avp_code   == AC_PROXY_INFO)
     
    394394
    395395                                /* Create a buffer with the content of the AVP. This is easier than going through the list */
    396                                 CHECK_FCT(  fd_msg_update_length(avp)  );
    397                                 CHECK_MALLOC(  buf = malloc(avp->avp_public.avp_len)  );
    398                                 CHECK_FCT( bufferize_avp(buf, avp->avp_public.avp_len, &offset, avp)  );
     396                                CHECK_FCT_DO(  fd_msg_update_length(avp), { free(ans); return __ret__; }  );
     397                                CHECK_MALLOC_DO(  buf = malloc(avp->avp_public.avp_len), { free(ans); return __ret__; }  );
     398                                CHECK_FCT_DO( bufferize_avp(buf, avp->avp_public.avp_len, &offset, avp), { free(buf); free(ans); return __ret__; }  );
    399399
    400400                                /* Now we parse this buffer to create a copy AVP */
    401                                 CHECK_FCT( parsebuf_list(buf, avp->avp_public.avp_len, &avpcpylist) );
     401                                CHECK_FCT_DO( parsebuf_list(buf, avp->avp_public.avp_len, &avpcpylist), { free(buf); free(ans); return __ret__; } );
    402402                               
    403403                                /* Parse dictionary objects now to remove the dependency on the buffer */
    404                                 CHECK_FCT( parsedict_do_chain(dict, &avpcpylist, 0, &pei) );
     404                                CHECK_FCT_DO( parsedict_do_chain(dict, &avpcpylist, 0, &pei), { /* leaking the avpcpylist -- this should never happen anyway */ free(buf); free(ans); return __ret__; } );
    405405
    406406                                /* Done for this AVP */
     
    411411                        }
    412412                        /* move to next AVP in the message, we can have several Proxy-Info instances */
    413                         CHECK_FCT( fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL) );
     413                        CHECK_FCT_DO( fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL), { free(ans); return __ret__; } );
    414414                }
    415415        }
Note: See TracChangeset for help on using the changeset viewer.