Re: [PATCH] Leaks and segfaults in smsbox
Alexander Malysh <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi Peter, Peter Christensen schrieb: > Hi, > > No opinions or comments at all on this?! Or am I just posting too many > patches to the mailing list? If so, I apologize. I just feel that it is > my duty as user of kannel, to share the bugs I find, and their > corresponding patches - and memory leaks and segmentation faults are > particular of my concern, as they lower the stability of kannel as a > whole. I have fought quite a few fights with kannel where servers went > totally unreachable due to out-of-memory conditions or extreme CPU > loads, and although the leaks addressed by this patch are minor, it is > unfortunate when smsbox crashes, no matter how odd the conditions > required for the crash might be. no problem, thank for patches! Just too much workload last time :( Just read you patch and I ask me why soo many error labels? It should be possible to just initialize e.g. List to NULL and then try to destroy it every time (gwlist_destroy accepts NULL). It just a bit strange to follow all those labels and return paths. What do you think about it? Thanks, Alex > > Med venlig hilsen / Best regards > > Peter Christensen > > Developer > ------------------ > Cool Systems ApS > > Tel: +45 2888 1600 > @ : [email protected] > www: www.coolsystems.dk > > > Peter Christensen wrote: >> Hi, >> >> In relation to the thread "Memory leak in smsbox", here's a patch >> which corrects some of the errors. >> >> The patch reorganizes the error goto-fields so they are as followed: >> >> fielderror1: >> At this point, only receiver have been allocated >> >> fielderror2: >> receiver, allowed, and denied have been allocated (allowed and denied >> may contain elements from receiver) >> >> fielderror3: >> receiver, allowed, denied, newfrom, and msg have been allocated >> (allowed and denied contains elements from receiver) >> >> error: >> receiver, allowed, denied, newfrom, and failed_id have been allocated >> (allowed is empty, and denied and failed_id may contain elements from >> receiver) >> >> Besides, the "Number(s) has/have been denied by white- and/or >> black-lists." error have been moved to before SMS transmission is >> attempted, and the logic is now gwlist_len(allowed) == 0 (No recipient >> have been allowed) >> >> This patch overrules my original patch for the memory leak. >> >> For the record; While monitoring its memory consumption, I've flooded >> smsbox with messages for each possible error condition (except >> conditions where recipients are added to the failed_id list. Don't >> know how to provoke that condition), and there seems to be no memory >> leaks, double frees, or segmentation faults. >> >> >> ------------------------------------------------------------------------ >> >> diff -Nru gateway/gw/smsbox.c gateway.smsbox/gw/smsbox.c >> --- gateway/gw/smsbox.c 2005-12-09 03:14:31.000000000 +0100 >> +++ gateway.smsbox/gw/smsbox.c 2006-01-23 17:51:55.000000000 +0100 >> @@ -1990,11 +1990,11 @@ >> */ >> if (udh != NULL && (octstr_len(udh) != octstr_get_char(udh, 0) + >> 1)) { >> returnerror = octstr_create("UDH field misformed, rejected"); >> - goto fielderror2; >> + goto fielderror1; >> } >> if (udh != NULL && octstr_len(udh) > MAX_SMS_OCTETS) { >> returnerror = octstr_create("UDH field is too long, rejected"); >> - goto fielderror2; >> + goto fielderror1; >> } >> >> /* >> @@ -2108,6 +2108,12 @@ >> del = gwlist_delete_matching(allowed, receiv, >> octstr_item_match); >> } >> >> + /* have all receivers been denied by list rules?! */ >> + if (gwlist_len(allowed) == 0) { >> + returnerror = octstr_create("Number(s) has/have been denied >> by white- and/or black-lists."); >> + goto fielderror2; >> + } >> + >> if (urltrans_faked_sender(t) != NULL) { >> /* discard previous from */ >> newfrom = octstr_duplicate(urltrans_faked_sender(t)); >> @@ -2144,7 +2150,7 @@ >> msg->sms.account = account ? octstr_duplicate(account) : NULL; >> } else { >> returnerror = octstr_create("Account field misformed, >> rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> } >> msg->sms.msgdata = text ? octstr_duplicate(text) : >> octstr_create(""); >> @@ -2156,7 +2162,7 @@ >> if(octstr_len(dlr_url)) { >> if(octstr_len(dlr_url) < 8) { /* http(s):// */ >> returnerror = octstr_create("DLR-URL field misformed, >> rejected"); >> - goto fielderror; >> + goto fielderror3; >> } else { >> Octstr *tmp; >> tmp = octstr_copy(dlr_url, 0, 7); >> @@ -2168,7 +2174,7 @@ >> if(octstr_case_compare(tmp, octstr_imm("https://")) != 0) { >> returnerror = octstr_create("DLR-URL field misformed, >> rejected"); >> O_DESTROY(tmp); >> - goto fielderror; >> + goto fielderror3; >> } >> #ifdef HAVE_LIBSSL >> msg->sms.dlr_url = octstr_duplicate(dlr_url); >> @@ -2187,49 +2193,49 @@ >> >> if ( dlr_mask < -1 || dlr_mask > 31 ) { /* 00011111 */ >> returnerror = octstr_create("DLR-Mask field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.dlr_mask = dlr_mask; >> if ( mclass < -1 || mclass > 3 ) { >> returnerror = octstr_create("MClass field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.mclass = mclass; >> if ( pid < -1 || pid > 255 ) { >> returnerror = octstr_create("PID field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.pid = pid; >> >> if ( rpi < -1 || rpi > 2) { >> returnerror = octstr_create("RPI field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.rpi = rpi; >> if ( alt_dcs < -1 || alt_dcs > 1 ) { >> returnerror = octstr_create("Alt-DCS field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.alt_dcs = alt_dcs; >> if ( mwi < -1 || mwi > 7 ) { >> returnerror = octstr_create("MWI field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.mwi = mwi; >> >> if ( coding < -1 || coding > 2 ) { >> returnerror = octstr_create("Coding field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.coding = coding; >> >> if ( compress < -1 || compress > 1 ) { >> returnerror = octstr_create("Compress field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.compress = compress; >> >> @@ -2244,19 +2250,19 @@ >> >> if ( validity < -1 ) { >> returnerror = octstr_create("Validity field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.validity = validity; >> >> if ( deferred < -1 ) { >> returnerror = octstr_create("Deferred field misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.deferred = deferred; >> if (priority != SMS_PARAM_UNDEFINED && (priority < 0 || >> priority > 3)) { >> returnerror = octstr_create("Priority field misformed, >> rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> msg->sms.priority = priority; >> >> @@ -2279,7 +2285,7 @@ >> >> if (charset_processing(charset, msg->sms.msgdata, >> msg->sms.coding) == -1) { >> returnerror = octstr_create("Charset or body misformed, rejected"); >> - goto fielderror; >> + goto fielderror3; >> } >> >> msg->sms.receiver = NULL; >> @@ -2322,19 +2328,12 @@ >> >> >> msg_destroy(msg); >> - gwlist_destroy(receiver, octstr_destroy_item); >> - gwlist_destroy(allowed, octstr_destroy_item); >> - >> - /* have all receivers been denied by list rules?! */ >> - if (no_recv == gwlist_len(denied)) { >> - returnerror = octstr_create("Number(s) has/have been denied >> by white- and/or black-lists."); >> - goto fielderror2; >> - } >> >> if (gwlist_len(failed_id) > 0) >> goto error; >> - gwlist_destroy(failed_id, octstr_destroy_item); >> + gwlist_destroy(failed_id, NULL); >> + gwlist_destroy(allowed, NULL); >> octstr_destroy(newfrom); >> *status = HTTP_ACCEPTED; >> returnerror = octstr_create("Sent."); >> @@ -2348,8 +2347,9 @@ >> while ((receiv = gwlist_extract_first(denied)) != NULL) { >> octstr_format_append(returnerror, " %s", >> octstr_get_cstr(receiv)); >> } >> - } - gwlist_destroy(denied, >> octstr_destroy_item); + } >> + gwlist_destroy(denied, NULL); >> + gwlist_destroy(receiver, octstr_destroy_item); >> >> /* >> * Append number of splits to returned body. @@ -2361,11 +2361,17 @@ >> return returnerror; >> >> -fielderror: >> - octstr_destroy(newfrom); >> +fielderror3: >> msg_destroy(msg); >> - >> + octstr_destroy(newfrom); >> + fielderror2: >> + gwlist_destroy(allowed, NULL); >> + gwlist_destroy(denied, NULL); >> + >> +fielderror1: >> + gwlist_destroy(receiver, octstr_destroy_item); >> + alog("send-SMS request failed - %s", >> octstr_get_cstr(returnerror)); >> >> @@ -2374,7 +2380,6 @@ >> >> error: >> error(0, "sendsms_request: failed"); >> - octstr_destroy(from); >> *status = HTTP_INTERNAL_SERVER_ERROR; >> returnerror = octstr_create("Sending failed."); >> >> @@ -2389,9 +2394,11 @@ >> } >> } >> >> - octstr_destroy(receiv); - gwlist_destroy(failed_id, >> octstr_destroy_item); >> - gwlist_destroy(denied, octstr_destroy_item); >> + gwlist_destroy(failed_id, NULL); >> + gwlist_destroy(allowed, NULL); >> + gwlist_destroy(denied, NULL); >> + gwlist_destroy(receiver, octstr_destroy_item); >> + octstr_destroy(newfrom); >> return returnerror; >> } >> > >