Missing free on error in iptables 1.3.4
PATCH 1/1 Missing free on error in iptables 1.3.4
Hi,
the patch below fixes a missing free() statement in TC_COMMIT(), and moves the setting of errno to come right before the return.
//Marcus
libiptc/libiptc.c +2 -1
@@ -2081,9 +2081,10 @@ ret =iptcc_compile_table (*handle, repl);if (ret <0 ) { - errno = ret;free (repl->counters);free (repl); +free (newcounters); + errno = ret;return 0 ; }
Signed-off-by Marcus Sundberg <[email protected]>
Signature · 3 lines
---------------------------------------+-------------------------- Marcus Sundberg <[email protected]> | Firewalls with SIP & NAT Software Developer, Ingate Systems AB | http://www.ingate.com/
Quoted 4 lines · Marcus Sundberg
Hi,
the patch below fixes a missing
free()statement inTC_COMMIT(), and moves the setting of errno to come right before the return.
thanks, I'm fixing this in a more general cleanup of the function error path (see patch below)
libiptc.c +25 -23
@@ -2034,13 +2034,13 @@ new_number =iptcc_compile_table_prep (*handle, &new_size);if (new_number <0 ) { errno =ENOMEM ; -return 0 ; + goto out_zero; } repl =malloc (sizeof (*repl) + new_size);if (!repl) { errno =ENOMEM ; -return 0 ; + goto out_zero; }memset (repl,0 ,sizeof (*repl) + new_size);
@@ -2055,17 +2055,14 @@ repl->counters =malloc (sizeof (STRUCT_COUNTERS ) * (*handle)->info.num_entries);if (!repl->counters) { -free (repl); errno =ENOMEM ; -return 0 ; + goto out_free_repl; }/* These are the counters we're going to put back, later. */ newcounters =malloc (counterlen);if (!newcounters) { -free (repl->counters); -free (repl); errno =ENOMEM ; -return 0 ; + goto out_free_repl_counters; }memset (newcounters,0 , counterlen);
@@ -2082,9 +2079,7 @@ ret =iptcc_compile_table (*handle, repl);if (ret <0 ) { errno = ret; -free (repl->counters); -free (repl); -return 0 ; + goto out_free_newcounters; }
@@ -2099,12 +2094,11 @@ }#endif -if (setsockopt (sockfd,TC_IPPROTO ,SO_SET_REPLACE , repl, -sizeof (*repl) + repl->size) <0 ) { -free (repl->counters); -free (repl); -free (newcounters); -return 0 ; + ret =setsockopt (sockfd,TC_IPPROTO ,SO_SET_REPLACE , repl, +sizeof (*repl) + repl->size); +if (ret <0 ) { + errno = ret; + goto out_free_newcounters; }/* Put counters back. */
@@ -2194,21 +2188,29 @@ }#endif -if (setsockopt (sockfd,TC_IPPROTO ,SO_SET_ADD_COUNTERS , - newcounters, counterlen) <0 ) { -free (repl->counters); -free (repl); -free (newcounters); -return 0 ; + ret =setsockopt (sockfd,TC_IPPROTO ,SO_SET_ADD_COUNTERS , + newcounters, counterlen); +if (ret <0 ) { + errno = ret; + goto out_free_newcounters; }free (repl->counters);free (repl);free (newcounters); - finished: +finished:TC_FREE (handle);return 1 ; + +out_free_newcounters: +free (newcounters); +out_free_repl_counters: +free (repl->counters); +out_free_repl: +free (repl); +out_zero: +return 0 ; }/* Get raw socket. */
Signature · 5 lines
- Harald Welte <[email protected]> http://netfilter.org/ ============================================================================ "Fragmentation is like classful addressing -- an interesting early architectural error that shows how much experimentation was going on while IP was being designed." -- Paul Vixie