* libiptc memory leak - PATCH
@ 2003-04-21 22:25 Tomáš Lejdar
2003-04-27 12:51 ` Harald Welte
2003-04-27 12:53 ` Harald Welte
0 siblings, 2 replies; 11+ messages in thread
From: Tomáš Lejdar @ 2003-04-21 22:25 UTC (permalink / raw)
To: netfilter-devel
Hi,
I've used libiptc for some utils and found a little
problem with memory allocation, discused in January and
may be earlier. Here is a small patch (r.1.2.8):
*** libiptc/libiptc.c.orig Mon Apr 21 23:54:48 2003
--- libiptc/libiptc.c Mon Apr 21 23:59:30 2003
***************
*** 504,511 ****
(*handle)->cache_chain_iteration++;
if ((*handle)->cache_chain_iteration - (*handle)->cache_chain_heads
! == (*handle)->cache_num_chains)
return NULL;
return (*handle)->cache_chain_iteration->name;
}
--- 504,513 ----
(*handle)->cache_chain_iteration++;
if ((*handle)->cache_chain_iteration - (*handle)->cache_chain_heads
! == (*handle)->cache_num_chains){
! free((*handle)->cache_chain_heads);
return NULL;
+ }
return (*handle)->cache_chain_iteration->name;
}
T.v.L
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: libiptc memory leak - PATCH 2003-04-21 22:25 libiptc memory leak - PATCH Tomáš Lejdar @ 2003-04-27 12:51 ` Harald Welte 2003-04-27 12:53 ` Harald Welte 1 sibling, 0 replies; 11+ messages in thread From: Harald Welte @ 2003-04-27 12:51 UTC (permalink / raw) To: Tomá? Lejdar; +Cc: netfilter-devel [-- Attachment #1: Type: text/plain, Size: 674 bytes --] On Tue, Apr 22, 2003 at 12:25:34AM +0200, Tomá? Lejdar wrote: > Hi, > I've used libiptc for some utils and found a little > problem with memory allocation, discused in January and > may be earlier. Here is a small patch (r.1.2.8): thanks! please send unified diffs (diff -u) in the future. -- - Harald Welte <laforge@netfilter.org> http://www.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 [-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-04-21 22:25 libiptc memory leak - PATCH Tomáš Lejdar 2003-04-27 12:51 ` Harald Welte @ 2003-04-27 12:53 ` Harald Welte 2003-04-28 7:14 ` Tomáš Lejdar 1 sibling, 1 reply; 11+ messages in thread From: Harald Welte @ 2003-04-27 12:53 UTC (permalink / raw) To: Tomá? Lejdar; +Cc: netfilter-devel [-- Attachment #1: Type: text/plain, Size: 1046 bytes --] On Tue, Apr 22, 2003 at 12:25:34AM +0200, Tomá? Lejdar wrote: > (*handle)->cache_chain_iteration++; > > if ((*handle)->cache_chain_iteration - (*handle)->cache_chain_heads > ! == (*handle)->cache_num_chains){ > ! free((*handle)->cache_chain_heads); > return NULL; > + } > > return (*handle)->cache_chain_iteration->name; > } I cannot accept this patch It would basically mean that something like: first_chain() next_chain() first_chain() would no longer work. we need an explicit free_handle that cleans up all allocated regions instead. Patches are welcome. > T.v.L -- - Harald Welte <laforge@netfilter.org> http://www.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 [-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-04-27 12:53 ` Harald Welte @ 2003-04-28 7:14 ` Tomáš Lejdar 2003-04-30 15:47 ` Harald Welte 0 siblings, 1 reply; 11+ messages in thread From: Tomáš Lejdar @ 2003-04-28 7:14 UTC (permalink / raw) To: Harald Welte, netfilter-devel Hi, I thing there is no problem, the memory is freed only when the function next_chain returns NULL and run through the chains is on the end. In the next call of first_chain() is memory alocated again in populate_cache(). Is there something wrong in my idea ? T.v.L Harald Welte wrote: I cannot accept this patch It would basically mean that something like: >first_chain() >next_chain() >first_chain() > >would no longer work. > >we need an explicit free_handle that cleans up all allocated regions >instead. Patches are welcome. > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-04-28 7:14 ` Tomáš Lejdar @ 2003-04-30 15:47 ` Harald Welte 2003-05-02 12:47 ` Martin Josefsson 0 siblings, 1 reply; 11+ messages in thread From: Harald Welte @ 2003-04-30 15:47 UTC (permalink / raw) To: Tomá? Lejdar; +Cc: netfilter-devel [-- Attachment #1: Type: text/plain, Size: 779 bytes --] On Mon, Apr 28, 2003 at 09:14:25AM +0200, Tomá? Lejdar wrote: > Hi, > I thing there is no problem, the memory is freed only when the > function next_chain returns NULL and run through the chains is on the end. > In the next call of first_chain() is memory alocated again in > populate_cache(). no, it's fine. It was a misunderstanding. I'll apply your patch now. Sorry for the fuzz. > T.v.L -- - Harald Welte <laforge@netfilter.org> http://www.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 [-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-04-30 15:47 ` Harald Welte @ 2003-05-02 12:47 ` Martin Josefsson 2003-05-02 13:47 ` Martin Josefsson 2003-05-02 15:14 ` Harald Welte 0 siblings, 2 replies; 11+ messages in thread From: Martin Josefsson @ 2003-05-02 12:47 UTC (permalink / raw) To: Harald Welte; +Cc: Tomá? Lejdar, Netfilter-devel [-- Attachment #1: Type: text/plain, Size: 1102 bytes --] On Wed, 2003-04-30 at 17:47, Harald Welte wrote: > On Mon, Apr 28, 2003 at 09:14:25AM +0200, Tomá? Lejdar wrote: > > Hi, > > I thing there is no problem, the memory is freed only when the > > function next_chain returns NULL and run through the chains is on the end. > > In the next call of first_chain() is memory alocated again in > > populate_cache(). > > no, it's fine. It was a misunderstanding. I'll apply your patch now. > Sorry for the fuzz. This patch breaks {ip,ip6}tables-{save,restore} and it runs free() on the wrong memoryaddress (I think free() does the right thing anyway but the patch still breaks stuff). -{save,restore} segfaulted with the patch. I've attached a patch that reverts this patch and adds iptc_exit(iptc_handle_t h) that takes care of the freeing. It also contains some small cleanups. The patch also fixes iptables, ip6tables and their -{save,restore} cousins to not leak memory. I've tested iptables and iptables-{save,restore} and they appear to work just fine. Please apply or at least revert the previous patch. -- /Martin [-- Attachment #2: libiptc-diff --] [-- Type: text/x-patch, Size: 7268 bytes --] diff -x '*.d' -urN userspace.orig/include/libiptc/libiptc.h userspace/include/libiptc/libiptc.h --- userspace.orig/include/libiptc/libiptc.h 2001-04-19 18:35:39.000000000 +0200 +++ userspace/include/libiptc/libiptc.h 2003-05-02 13:48:01.000000000 +0200 @@ -34,6 +34,9 @@ /* Take a snapshot of the rules. Returns NULL on error. */ iptc_handle_t iptc_init(const char *tablename); +/* Cleanup after iptc_init(). */ +void iptc_exit(iptc_handle_t h); + /* Iterator functions to run through the chains. Returns NULL at end. */ const char *iptc_first_chain(iptc_handle_t *handle); const char *iptc_next_chain(iptc_handle_t *handle); diff -x '*.d' -urN userspace.orig/ip6tables-restore.c userspace/ip6tables-restore.c --- userspace.orig/ip6tables-restore.c 2003-03-06 13:01:32.000000000 +0100 +++ userspace/ip6tables-restore.c 2003-05-02 13:58:33.000000000 +0200 @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) { - ip6tc_handle_t handle; + ip6tc_handle_t handle = NULL; char buffer[10240]; int c; char curtable[IP6T_TABLE_MAXNAMELEN + 1]; @@ -183,6 +183,9 @@ } strncpy(curtable, table, IP6T_TABLE_MAXNAMELEN); + if (handle) + ip6tc_exit(handle); + handle = create_handle(table, modprobe); if (noflush == 0) { DEBUGP("Cleaning all chains of table '%s'\n", diff -x '*.d' -urN userspace.orig/ip6tables-save.c userspace/ip6tables-save.c --- userspace.orig/ip6tables-save.c 2002-08-14 13:40:41.000000000 +0200 +++ userspace/ip6tables-save.c 2003-05-02 13:50:01.000000000 +0200 @@ -305,6 +305,8 @@ exit_error(OTHER_PROBLEM, "Binary NYI\n"); } + ip6tc_exit(h); + return 1; } diff -x '*.d' -urN userspace.orig/ip6tables.c userspace/ip6tables.c --- userspace.orig/ip6tables.c 2003-03-06 13:01:32.000000000 +0100 +++ userspace/ip6tables.c 2003-05-02 14:34:23.000000000 +0200 @@ -1670,6 +1670,7 @@ const char *modprobe = NULL; int proto_used = 0; char icmp6p[] = "icmpv6"; + int no_handle = 0; memset(&fw, 0, sizeof(fw)); @@ -2147,8 +2148,10 @@ chain, IP6T_FUNCTION_MAXNAMELEN); /* only allocate handle if we weren't called with a handle */ - if (!*handle) + if (!*handle) { *handle = ip6tc_init(*table); + no_handle = 1; + } if (!*handle) { /* try to insmod the module if iptc_init failed */ @@ -2293,5 +2296,10 @@ if (verbose > 1) dump_entries6(*handle); + if (no_handle) { + ip6tc_exit(*handle); + *handle = NULL; + } + return ret; } diff -x '*.d' -urN userspace.orig/iptables-restore.c userspace/iptables-restore.c --- userspace.orig/iptables-restore.c 2003-03-06 13:01:32.000000000 +0100 +++ userspace/iptables-restore.c 2003-05-02 14:13:15.000000000 +0200 @@ -99,7 +99,7 @@ int main(int argc, char *argv[]) { - iptc_handle_t handle; + iptc_handle_t handle = NULL; char buffer[10240]; int c; char curtable[IPT_TABLE_MAXNAMELEN + 1]; @@ -180,6 +180,9 @@ } strncpy(curtable, table, IPT_TABLE_MAXNAMELEN); + if (handle) + iptc_exit(handle); + handle = create_handle(table, modprobe); if (noflush == 0) { DEBUGP("Cleaning all chains of table '%s'\n", diff -x '*.d' -urN userspace.orig/iptables-save.c userspace/iptables-save.c --- userspace.orig/iptables-save.c 2002-08-07 11:07:41.000000000 +0200 +++ userspace/iptables-save.c 2003-05-02 13:49:37.000000000 +0200 @@ -304,6 +304,8 @@ exit_error(OTHER_PROBLEM, "Binary NYI\n"); } + iptc_exit(h); + return 1; } diff -x '*.d' -urN userspace.orig/iptables.c userspace/iptables.c --- userspace.orig/iptables.c 2003-03-31 14:33:55.000000000 +0200 +++ userspace/iptables.c 2003-05-02 14:20:59.000000000 +0200 @@ -1668,6 +1668,7 @@ char *protocol = NULL; const char *modprobe = NULL; int proto_used = 0; + int no_handle = 0; memset(&fw, 0, sizeof(fw)); @@ -2148,8 +2149,10 @@ chain, IPT_FUNCTION_MAXNAMELEN); /* only allocate handle if we weren't called with a handle */ - if (!*handle) + if (!*handle) { *handle = iptc_init(*table); + no_handle = 1; + } if (!*handle) { /* try to insmod the module if iptc_init failed */ @@ -2294,5 +2297,10 @@ if (verbose > 1) dump_entries(*handle); + if (no_handle) { + iptc_exit(*handle); + *handle = NULL; + } + return ret; } diff -x '*.d' -urN userspace.orig/libiptc/libip4tc.c userspace/libiptc/libip4tc.c --- userspace.orig/libiptc/libip4tc.c 2002-06-12 21:22:29.000000000 +0200 +++ userspace/libiptc/libip4tc.c 2003-05-02 13:48:30.000000000 +0200 @@ -91,6 +91,7 @@ #define TC_SET_POLICY iptc_set_policy #define TC_GET_RAW_SOCKET iptc_get_raw_socket #define TC_INIT iptc_init +#define TC_EXIT iptc_exit #define TC_COMMIT iptc_commit #define TC_STRERROR iptc_strerror diff -x '*.d' -urN userspace.orig/libiptc/libip6tc.c userspace/libiptc/libip6tc.c --- userspace.orig/libiptc/libip6tc.c 2002-02-14 00:13:23.000000000 +0100 +++ userspace/libiptc/libip6tc.c 2003-05-02 13:48:48.000000000 +0200 @@ -86,6 +86,7 @@ #define TC_SET_POLICY ip6tc_set_policy #define TC_GET_RAW_SOCKET ip6tc_get_raw_socket #define TC_INIT ip6tc_init +#define TC_EXIT ip6tc_exit #define TC_COMMIT ip6tc_commit #define TC_STRERROR ip6tc_strerror diff -x '*.d' -urN userspace.orig/libiptc/libiptc.c userspace/libiptc/libiptc.c --- userspace.orig/libiptc/libiptc.c 2003-04-30 18:56:19.000000000 +0200 +++ userspace/libiptc/libiptc.c 2003-05-02 14:22:40.000000000 +0200 @@ -237,22 +237,26 @@ if (sockfd != -1) close(sockfd); + if (strlen(tablename) >= TABLE_MAXNAMELEN) { + errno = EINVAL; + return NULL; + } + sockfd = socket(TC_AF, SOCK_RAW, IPPROTO_RAW); if (sockfd < 0) return NULL; s = sizeof(info); - if (strlen(tablename) >= TABLE_MAXNAMELEN) { - errno = EINVAL; - return NULL; - } + strcpy(info.name, tablename); if (getsockopt(sockfd, TC_IPPROTO, SO_GET_INFO, &info, &s) < 0) return NULL; if ((h = alloc_handle(info.name, info.size, info.num_entries)) - == NULL) + == NULL) { + close(sockfd); return NULL; + } /* Too hard --RR */ #if 0 @@ -284,6 +288,7 @@ if (getsockopt(sockfd, TC_IPPROTO, SO_GET_ENTRIES, &h->entries, &tmp) < 0) { + close(sockfd); free(h); return NULL; } @@ -292,6 +297,13 @@ return h; } +void +TC_EXIT(TC_HANDLE_T h) +{ + close(sockfd); + free(h); +} + static inline int print_match(const STRUCT_ENTRY_MATCH *m) { @@ -504,10 +516,8 @@ (*handle)->cache_chain_iteration++; if ((*handle)->cache_chain_iteration - (*handle)->cache_chain_heads - == (*handle)->cache_num_chains) { - free((*handle)->cache_chain_heads); + == (*handle)->cache_num_chains) return NULL; - } return (*handle)->cache_chain_iteration->name; } @@ -1584,11 +1594,13 @@ STRUCT_REPLACE *repl; STRUCT_COUNTERS_INFO *newcounters; unsigned int i; - size_t counterlen - = sizeof(STRUCT_COUNTERS_INFO) - + sizeof(STRUCT_COUNTERS) * (*handle)->new_number; + size_t counterlen; CHECK(*handle); + + counterlen = sizeof(STRUCT_COUNTERS_INFO) + + sizeof(STRUCT_COUNTERS) * (*handle)->new_number; + #if 0 TC_DUMP_ENTRIES(*handle); #endif ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-05-02 12:47 ` Martin Josefsson @ 2003-05-02 13:47 ` Martin Josefsson 2003-05-02 14:14 ` Martin Josefsson 2003-05-02 15:14 ` Harald Welte 1 sibling, 1 reply; 11+ messages in thread From: Martin Josefsson @ 2003-05-02 13:47 UTC (permalink / raw) To: Harald Welte; +Cc: Tomá? Lejdar, Netfilter-devel On Fri, 2003-05-02 at 14:47, Martin Josefsson wrote: > This patch breaks {ip,ip6}tables-{save,restore} and it runs free() on > the wrong memoryaddress (I think free() does the right thing anyway but > the patch still breaks stuff). Ok, I was wrong, it did free on a correct memoryaddress, I'll fix up my patch and resend, sorry about that. -- /Martin ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-05-02 13:47 ` Martin Josefsson @ 2003-05-02 14:14 ` Martin Josefsson 2003-05-02 15:21 ` Harald Welte 0 siblings, 1 reply; 11+ messages in thread From: Martin Josefsson @ 2003-05-02 14:14 UTC (permalink / raw) To: Harald Welte; +Cc: Tomá? Lejdar, Netfilter-devel [-- Attachment #1: Type: text/plain, Size: 669 bytes --] On Fri, 2003-05-02 at 15:47, Martin Josefsson wrote: > On Fri, 2003-05-02 at 14:47, Martin Josefsson wrote: > > > This patch breaks {ip,ip6}tables-{save,restore} and it runs free() on > > the wrong memoryaddress (I think free() does the right thing anyway but > > the patch still breaks stuff). > > Ok, I was wrong, it did free on a correct memoryaddress, I'll fix up my > patch and resend, sorry about that. Here's an updated patch that fixes the memory-leak in the previous one. I've renamed {ip,ip6}tc_exit(iptc_handle_t h) into {ip,ip6}tc_free(iptc_handle_t *h) This should fix it correctly (I hope), iptables, iptables-{save,restore} works fine. -- /Martin [-- Attachment #2: libiptc-diff2 --] [-- Type: text/x-patch, Size: 7514 bytes --] diff -x '*.d' -urN userspace.orig/include/libiptc/libiptc.h userspace/include/libiptc/libiptc.h --- userspace.orig/include/libiptc/libiptc.h 2001-04-19 18:35:39.000000000 +0200 +++ userspace/include/libiptc/libiptc.h 2003-05-02 16:00:06.000000000 +0200 @@ -34,6 +34,9 @@ /* Take a snapshot of the rules. Returns NULL on error. */ iptc_handle_t iptc_init(const char *tablename); +/* Cleanup after iptc_init(). */ +void iptc_free(iptc_handle_t *h); + /* Iterator functions to run through the chains. Returns NULL at end. */ const char *iptc_first_chain(iptc_handle_t *handle); const char *iptc_next_chain(iptc_handle_t *handle); diff -x '*.d' -urN userspace.orig/ip6tables-restore.c userspace/ip6tables-restore.c --- userspace.orig/ip6tables-restore.c 2003-03-06 13:01:32.000000000 +0100 +++ userspace/ip6tables-restore.c 2003-05-02 16:01:08.000000000 +0200 @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) { - ip6tc_handle_t handle; + ip6tc_handle_t handle = NULL; char buffer[10240]; int c; char curtable[IP6T_TABLE_MAXNAMELEN + 1]; @@ -183,6 +183,9 @@ } strncpy(curtable, table, IP6T_TABLE_MAXNAMELEN); + if (handle) + ip6tc_free(&handle); + handle = create_handle(table, modprobe); if (noflush == 0) { DEBUGP("Cleaning all chains of table '%s'\n", diff -x '*.d' -urN userspace.orig/ip6tables-save.c userspace/ip6tables-save.c --- userspace.orig/ip6tables-save.c 2002-08-14 13:40:41.000000000 +0200 +++ userspace/ip6tables-save.c 2003-05-02 16:01:17.000000000 +0200 @@ -305,6 +305,8 @@ exit_error(OTHER_PROBLEM, "Binary NYI\n"); } + ip6tc_free(&h); + return 1; } diff -x '*.d' -urN userspace.orig/ip6tables.c userspace/ip6tables.c --- userspace.orig/ip6tables.c 2003-03-06 13:01:32.000000000 +0100 +++ userspace/ip6tables.c 2003-05-02 16:00:58.000000000 +0200 @@ -1670,6 +1670,7 @@ const char *modprobe = NULL; int proto_used = 0; char icmp6p[] = "icmpv6"; + int no_handle = 0; memset(&fw, 0, sizeof(fw)); @@ -2147,8 +2148,10 @@ chain, IP6T_FUNCTION_MAXNAMELEN); /* only allocate handle if we weren't called with a handle */ - if (!*handle) + if (!*handle) { *handle = ip6tc_init(*table); + no_handle = 1; + } if (!*handle) { /* try to insmod the module if iptc_init failed */ @@ -2293,5 +2296,8 @@ if (verbose > 1) dump_entries6(*handle); + if (no_handle) + ip6tc_free(handle); + return ret; } diff -x '*.d' -urN userspace.orig/iptables-restore.c userspace/iptables-restore.c --- userspace.orig/iptables-restore.c 2003-03-06 13:01:32.000000000 +0100 +++ userspace/iptables-restore.c 2003-05-02 16:00:34.000000000 +0200 @@ -99,7 +99,7 @@ int main(int argc, char *argv[]) { - iptc_handle_t handle; + iptc_handle_t handle = NULL; char buffer[10240]; int c; char curtable[IPT_TABLE_MAXNAMELEN + 1]; @@ -180,6 +180,9 @@ } strncpy(curtable, table, IPT_TABLE_MAXNAMELEN); + if (handle) + iptc_free(&handle); + handle = create_handle(table, modprobe); if (noflush == 0) { DEBUGP("Cleaning all chains of table '%s'\n", diff -x '*.d' -urN userspace.orig/iptables-save.c userspace/iptables-save.c --- userspace.orig/iptables-save.c 2002-08-07 11:07:41.000000000 +0200 +++ userspace/iptables-save.c 2003-05-02 16:00:23.000000000 +0200 @@ -304,6 +304,8 @@ exit_error(OTHER_PROBLEM, "Binary NYI\n"); } + iptc_free(&h); + return 1; } diff -x '*.d' -urN userspace.orig/iptables.c userspace/iptables.c --- userspace.orig/iptables.c 2003-03-31 14:33:55.000000000 +0200 +++ userspace/iptables.c 2003-05-02 16:00:46.000000000 +0200 @@ -1668,6 +1668,7 @@ char *protocol = NULL; const char *modprobe = NULL; int proto_used = 0; + int no_handle = 0; memset(&fw, 0, sizeof(fw)); @@ -2148,8 +2149,10 @@ chain, IPT_FUNCTION_MAXNAMELEN); /* only allocate handle if we weren't called with a handle */ - if (!*handle) + if (!*handle) { *handle = iptc_init(*table); + no_handle = 1; + } if (!*handle) { /* try to insmod the module if iptc_init failed */ @@ -2294,5 +2297,8 @@ if (verbose > 1) dump_entries(*handle); + if (no_handle) + iptc_free(handle); + return ret; } diff -x '*.d' -urN userspace.orig/libiptc/libip4tc.c userspace/libiptc/libip4tc.c --- userspace.orig/libiptc/libip4tc.c 2002-06-12 21:22:29.000000000 +0200 +++ userspace/libiptc/libip4tc.c 2003-05-02 15:59:39.000000000 +0200 @@ -91,6 +91,7 @@ #define TC_SET_POLICY iptc_set_policy #define TC_GET_RAW_SOCKET iptc_get_raw_socket #define TC_INIT iptc_init +#define TC_FREE iptc_free #define TC_COMMIT iptc_commit #define TC_STRERROR iptc_strerror diff -x '*.d' -urN userspace.orig/libiptc/libip6tc.c userspace/libiptc/libip6tc.c --- userspace.orig/libiptc/libip6tc.c 2002-02-14 00:13:23.000000000 +0100 +++ userspace/libiptc/libip6tc.c 2003-05-02 15:59:49.000000000 +0200 @@ -86,6 +86,7 @@ #define TC_SET_POLICY ip6tc_set_policy #define TC_GET_RAW_SOCKET ip6tc_get_raw_socket #define TC_INIT ip6tc_init +#define TC_FREE ip6tc_free #define TC_COMMIT ip6tc_commit #define TC_STRERROR ip6tc_strerror diff -x '*.d' -urN userspace.orig/libiptc/libiptc.c userspace/libiptc/libiptc.c --- userspace.orig/libiptc/libiptc.c 2003-04-30 18:56:19.000000000 +0200 +++ userspace/libiptc/libiptc.c 2003-05-02 16:03:47.000000000 +0200 @@ -237,22 +237,26 @@ if (sockfd != -1) close(sockfd); + if (strlen(tablename) >= TABLE_MAXNAMELEN) { + errno = EINVAL; + return NULL; + } + sockfd = socket(TC_AF, SOCK_RAW, IPPROTO_RAW); if (sockfd < 0) return NULL; s = sizeof(info); - if (strlen(tablename) >= TABLE_MAXNAMELEN) { - errno = EINVAL; - return NULL; - } + strcpy(info.name, tablename); if (getsockopt(sockfd, TC_IPPROTO, SO_GET_INFO, &info, &s) < 0) return NULL; if ((h = alloc_handle(info.name, info.size, info.num_entries)) - == NULL) + == NULL) { + close(sockfd); return NULL; + } /* Too hard --RR */ #if 0 @@ -284,6 +288,7 @@ if (getsockopt(sockfd, TC_IPPROTO, SO_GET_ENTRIES, &h->entries, &tmp) < 0) { + close(sockfd); free(h); return NULL; } @@ -292,6 +297,16 @@ return h; } +void +TC_FREE(TC_HANDLE_T *h) +{ + close(sockfd); + if ((*h)->cache_chain_heads) + free((*h)->cache_chain_heads); + free(*h); + *h = NULL; +} + static inline int print_match(const STRUCT_ENTRY_MATCH *m) { @@ -504,10 +519,8 @@ (*handle)->cache_chain_iteration++; if ((*handle)->cache_chain_iteration - (*handle)->cache_chain_heads - == (*handle)->cache_num_chains) { - free((*handle)->cache_chain_heads); + == (*handle)->cache_num_chains) return NULL; - } return (*handle)->cache_chain_iteration->name; } @@ -1584,11 +1597,13 @@ STRUCT_REPLACE *repl; STRUCT_COUNTERS_INFO *newcounters; unsigned int i; - size_t counterlen - = sizeof(STRUCT_COUNTERS_INFO) - + sizeof(STRUCT_COUNTERS) * (*handle)->new_number; + size_t counterlen; CHECK(*handle); + + counterlen = sizeof(STRUCT_COUNTERS_INFO) + + sizeof(STRUCT_COUNTERS) * (*handle)->new_number; + #if 0 TC_DUMP_ENTRIES(*handle); #endif @@ -1715,10 +1730,7 @@ free(newcounters); finished: - if ((*handle)->cache_chain_heads) - free((*handle)->cache_chain_heads); - free(*handle); - *handle = NULL; + TC_FREE(handle); return 1; } ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-05-02 14:14 ` Martin Josefsson @ 2003-05-02 15:21 ` Harald Welte 2003-05-03 20:52 ` Martin Josefsson 0 siblings, 1 reply; 11+ messages in thread From: Harald Welte @ 2003-05-02 15:21 UTC (permalink / raw) To: Martin Josefsson; +Cc: Tomá? Lejdar, Netfilter-devel [-- Attachment #1: Type: text/plain, Size: 1240 bytes --] On Fri, May 02, 2003 at 04:14:19PM +0200, Martin Josefsson wrote: > On Fri, 2003-05-02 at 15:47, Martin Josefsson wrote: > > On Fri, 2003-05-02 at 14:47, Martin Josefsson wrote: > > > > > This patch breaks {ip,ip6}tables-{save,restore} and it runs free() on > > > the wrong memoryaddress (I think free() does the right thing anyway but > > > the patch still breaks stuff). > > > > Ok, I was wrong, it did free on a correct memoryaddress, I'll fix up my > > patch and resend, sorry about that. > > Here's an updated patch that fixes the memory-leak in the previous one. applied this one instead of the other. > This should fix it correctly (I hope), iptables, iptables-{save,restore} > works fine. we'll see. I think iptables-1.2.9 is in a quite distant future, so I hope we discover any potentially introduced bugs until then. > /Martin -- - Harald Welte <laforge@netfilter.org> http://www.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 [-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-05-02 15:21 ` Harald Welte @ 2003-05-03 20:52 ` Martin Josefsson 0 siblings, 0 replies; 11+ messages in thread From: Martin Josefsson @ 2003-05-03 20:52 UTC (permalink / raw) To: Harald Welte; +Cc: Netfilter-devel [-- Attachment #1: Type: text/plain, Size: 378 bytes --] On Fri, 2003-05-02 at 17:21, Harald Welte wrote: > > This should fix it correctly (I hope), iptables, iptables-{save,restore} > > works fine. > > we'll see. I think iptables-1.2.9 is in a quite distant future, so > I hope we discover any potentially introduced bugs until then. I broke it a little... I've attached a fix... it fixes iptables.c and ip6tables.c -- /Martin [-- Attachment #2: iptables.c-fix --] [-- Type: text/plain, Size: 1471 bytes --] --- userspace/iptables.c.orig 2003-05-02 17:31:44.000000000 +0200 +++ userspace/iptables.c 2003-05-03 22:43:39.000000000 +0200 @@ -1668,7 +1668,6 @@ char *protocol = NULL; const char *modprobe = NULL; int proto_used = 0; - int no_handle = 0; memset(&fw, 0, sizeof(fw)); @@ -2149,10 +2148,8 @@ chain, IPT_FUNCTION_MAXNAMELEN); /* only allocate handle if we weren't called with a handle */ - if (!*handle) { + if (!*handle) *handle = iptc_init(*table); - no_handle = 1; - } if (!*handle) { /* try to insmod the module if iptc_init failed */ @@ -2297,8 +2294,5 @@ if (verbose > 1) dump_entries(*handle); - if (no_handle) - iptc_free(handle); - return ret; } --- userspace/ip6tables.c.orig 2003-05-02 17:31:44.000000000 +0200 +++ userspace/ip6tables.c 2003-05-03 22:50:51.000000000 +0200 @@ -1670,7 +1670,6 @@ const char *modprobe = NULL; int proto_used = 0; char icmp6p[] = "icmpv6"; - int no_handle = 0; memset(&fw, 0, sizeof(fw)); @@ -2148,10 +2147,8 @@ chain, IP6T_FUNCTION_MAXNAMELEN); /* only allocate handle if we weren't called with a handle */ - if (!*handle) { + if (!*handle) *handle = ip6tc_init(*table); - no_handle = 1; - } if (!*handle) { /* try to insmod the module if iptc_init failed */ @@ -2296,8 +2293,5 @@ if (verbose > 1) dump_entries6(*handle); - if (no_handle) - ip6tc_free(handle); - return ret; } ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: libiptc memory leak - PATCH 2003-05-02 12:47 ` Martin Josefsson 2003-05-02 13:47 ` Martin Josefsson @ 2003-05-02 15:14 ` Harald Welte 1 sibling, 0 replies; 11+ messages in thread From: Harald Welte @ 2003-05-02 15:14 UTC (permalink / raw) To: Martin Josefsson; +Cc: Tomá? Lejdar, Netfilter-devel [-- Attachment #1: Type: text/plain, Size: 1392 bytes --] On Fri, May 02, 2003 at 02:47:51PM +0200, Martin Josefsson wrote: > On Wed, 2003-04-30 at 17:47, Harald Welte wrote: > > On Mon, Apr 28, 2003 at 09:14:25AM +0200, Tomá? Lejdar wrote: > > > Hi, > > > I thing there is no problem, the memory is freed only when the > > > function next_chain returns NULL and run through the chains is on the end. > > > In the next call of first_chain() is memory alocated again in > > > populate_cache(). > > > > no, it's fine. It was a misunderstanding. I'll apply your patch now. > > Sorry for the fuzz. > > This patch breaks {ip,ip6}tables-{save,restore} and it runs free() on > the wrong memoryaddress (I think free() does the right thing anyway but > the patch still breaks stuff). *sigh*. I knew that I should have tested it before accepting. > I've attached a patch that reverts this patch and adds > iptc_exit(iptc_handle_t h) that takes care of the freeing. > It also contains some small cleanups. I'll apply your patch, thanks Martin. > /Martin -- - Harald Welte <laforge@netfilter.org> http://www.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 [-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2003-05-03 20:52 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2003-04-21 22:25 libiptc memory leak - PATCH Tomáš Lejdar 2003-04-27 12:51 ` Harald Welte 2003-04-27 12:53 ` Harald Welte 2003-04-28 7:14 ` Tomáš Lejdar 2003-04-30 15:47 ` Harald Welte 2003-05-02 12:47 ` Martin Josefsson 2003-05-02 13:47 ` Martin Josefsson 2003-05-02 14:14 ` Martin Josefsson 2003-05-02 15:21 ` Harald Welte 2003-05-03 20:52 ` Martin Josefsson 2003-05-02 15:14 ` Harald Welte
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.