On (18/02/16 13:34), Petr Cech wrote: >On 01/29/2016 02:55 PM, Lukas Slebodnik wrote: >>On (29/01/16 14:15), Lukas Slebodnik wrote: >>>On (06/01/16 13:47), Petr Cech wrote: >>>//snip >>>>Lukas, thanks for careful review. >>>> >>>>There are fixed patches attached. I hope that I check memory leaks in proper >>>>way. >>>>I am little confused if we need "struct test_colondb_ctx" because it is >>>>empty >>>>now. >>>> >>>>Regards >>>> >>>>-- >>>>Petr^4 Cech >>> >>>>From 435b1c44f7b7c351129847f67e7db04898711e9e Mon Sep 17 00:00:00 2001 >>>>From: Petr Cech <pc...@redhat.com> >>>>Date: Tue, 24 Nov 2015 10:34:10 -0500 >>>>Subject: [PATCH 1/2] COLONDB: Add comments on functions >>>> >>>>The colondb API provides three function: >>>>* sss_colondb_open() >>>>* sss_colondb_write_field() >>>>* sss_colondb_read_field() >>>> >>>>It is not obvious that sss_colondb_open() add destructor on talloc >>>>context which close the colondb during free context. And there is >>>>expectation that SSS_COLONDB_SENTINEL is type of last item in line. >>>> >>>>So this patch adds simple lightening comments in doxygen style. >>>> >>>>Resolves: >>>>https://fedorahosted.org/sssd/ticket/2764 >>>LGTM >>> >>>>From ab29fc0d22862bfd873f93982ba6a6ae9120f3b1 Mon Sep 17 00:00:00 2001 >>>>From: Petr Cech <pc...@redhat.com> >>>>Date: Fri, 27 Nov 2015 06:39:37 -0500 >>>>Subject: [PATCH 2/2] TEST_TOOLS_COLONDB: Add tests for sss_colondb_* >>>> >>>>There are three functions at API of colondb wrapper: >>>>* sss_colondb_open() >>>>* sss_colondb_readline() >>>>* sss_colondb_writeline() >>>> >>>>This patch adds tests for all of them. >>>> >>>>We test those cases: >>>>* open nonexisting file for read >>>>* open nonexisting file for write >>>>* open existing empty file for read >>>>* open existing file with records for read >>>>* open existing empty file for write >>>>* open existing file with records for write >>>>* write to empty file >>>>* write to file with existing records >>>>* sss_colondb_open() >>>>* sss_colondb_readline() >>>>* sss_colondb_write_line() >>>>* write to empty file and read it >>>> >>>>Resolves: >>>>https://fedorahosted.org/sssd/ticket/2764 >>>>--- >>>>Makefile.am | 16 ++ >>>>src/tests/cmocka/test_tools_colondb.c | 423 >>>>++++++++++++++++++++++++++++++++++ >>>>2 files changed, 439 insertions(+) >>>>create mode 100644 src/tests/cmocka/test_tools_colondb.c >>>> >>>>diff --git a/Makefile.am b/Makefile.am >>>>index >>>>a9d3f25d3775f6ac824b9f9b85dd0412417c33d3..12ac53d0e15ff1d62f36a8ed7b9898e23992927f >>>> 100644 >>>>--- a/Makefile.am >>>>+++ b/Makefile.am >>>>@@ -241,6 +241,7 @@ if HAVE_CMOCKA >>>> pam-srv-tests \ >>>> test_ipa_subdom_util \ >>>> test_ipa_subdom_server \ >>>>+ test_tools_colondb \ >>>> test_krb5_wait_queue \ >>>> test_cert_utils \ >>>> test_ldap_id_cleanup \ >>>>@@ -2570,6 +2571,21 @@ test_ipa_subdom_server_LDADD = \ >>>> libdlopen_test_providers.la \ >>>> $(NULL) >>>> >>>>+test_tools_colondb_SOURCES = \ >>>>+ src/tests/cmocka/test_tools_colondb.c \ >>>>+ src/tools/common/sss_colondb.c \ >>>>+ $(NULL) >>>>+test_tools_colondb_CFLAGS = \ >>>>+ $(AM_CFLAGS) \ >>>>+ $(NULL) >>>>+test_tools_colondb_LDFLAGS = \ >>>>+ $(NULL) >>>>+test_tools_colondb_LDADD = \ >>>>+ $(CMOCKA_LIBS) \ >>>>+ $(SSSD_INTERNAL_LTLIBS) \ >>>>+ libsss_test_common.la \ >>>>+ $(NULL) >>>>+ >>>>test_krb5_wait_queue_SOURCES = \ >>>> src/tests/cmocka/common_mock_be.c \ >>>> src/tests/cmocka/test_krb5_wait_queue.c \ >>>>diff --git a/src/tests/cmocka/test_tools_colondb.c >>>>b/src/tests/cmocka/test_tools_colondb.c >>>>new file mode 100644 >>>>index >>>>0000000000000000000000000000000000000000..5b23e593add9349e701b977b134236234e6df773 >>>>--- /dev/null >>>>+++ b/src/tests/cmocka/test_tools_colondb.c >>>>@@ -0,0 +1,423 @@ >>>>+/* >>>>+ Authors: >>>>+ Petr Čech <pc...@redhat.com> >>>>+ >>>>+ Copyright (C) 2015 Red Hat >>>>+ >>>>+ This program is free software; you can redistribute it and/or modify >>>>+ it under the terms of the GNU General Public License as published by >>>>+ the Free Software Foundation; either version 3 of the License, or >>>>+ (at your option) any later version. >>>>+ >>>>+ This program is distributed in the hope that it will be useful, >>>>+ but WITHOUT ANY WARRANTY; without even the implied warranty of >>>>+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >>>>+ GNU General Public License for more details. >>>>+ >>>>+ You should have received a copy of the GNU General Public License >>>>+ along with this program. If not, see <http://www.gnu.org/licenses/>. >>>>+*/ >>>>+ >>>>+#include <talloc.h> >>>>+#include <errno.h> >>>>+#include <popt.h> >>>>+ >>>>+#include "tests/cmocka/common_mock.h" >>>>+#include "src/tools/common/sss_colondb.h" >>>>+ >>>>+#define TESTS_PATH "tp_" BASE_FILE_STEM >>>>+#define TESTS_FILE "test_colondb.ldb" >>>>+ >>>>+const char *TEST_STRING1 = "white"; >>>>+const int TEST_INT1 = 12; >>>>+ >>>>+const char *TEST_STRING2 = "black"; >>>>+const int TEST_INT2 = 34; >>>>+ >>>>+struct test_colondb_ctx { >>>>+ ; >>>>+}; >>>"test context" is usually used for passing >>>values from setup funtion to tests. >>> >>>If you plan to reuse in future in extended test >>>then it might be easier to directly use TALLOC_CTX. >>> >>>>+static void create_dir(const char *path) >>>>+{ >>>>+ errno_t ret; >>>>+ >>>>+ errno = 0; >>>>+ ret = mkdir(path, 0775); >>>>+ assert_int_equal(ret, 0); >>>>+} >>>>+ >>>>+static void create_empty_file(const char *path, const char *name) >>>>+{ >>>>+ TALLOC_CTX *tmp_ctx = NULL; >>>>+ char *file_name = NULL; >>>>+ FILE *fp = NULL; >>>>+ >>>>+ tmp_ctx = talloc_new(NULL); >>> Please do not allocate anything on NULL context. >>> It will disable leak checking leak_check_setup, leak_check_teardown >>> Try to look into leak checking in test >>> src/tests/cmocka/test_child_common.c. >>> And it's not important whether allocation is in test >>> or in setup function. It's better to be consistent, >>> >>>Otherwise patch LGTM. >>> >>There are few issues it the patch set. >>http://sssd-ci.duckdns.org/logs/job/36/89/summary.html >> >>Linking error on debian. >>/usr/bin/ld: src/tests/cmocka/test_tools_colondb-test_tools_colondb.o: >>undefined reference to symbol 'poptFreeContext@@LIBPOPT_0' >>//lib/x86_64-linux-gnu/libpopt.so.0: error adding symbols: DSO missing from >>command line >> >>just add $(POPT_LIBS) to test_tools_colondb_LDADD in Makefile.am >> >> >>and also memory leak >>http://sssd-ci.duckdns.org/logs/job/36/89/rhel7/ci-build-debug/test_tools_colondb.30639.valgrind.log >> >>LS > >Hello Lukas, > >thank you for careful code review. I addressed all comments and I found >memory leak in original colondb tool. Patch of memory leak is attached in >patch #1 with brief but explaining description in commit message. > >Regards >-- >Petr^4 Cech
>From 2bce55008b3f1a070c224bbb25191408efa42fee Mon Sep 17 00:00:00 2001 >From: Petr Cech <pc...@redhat.com> >Date: Thu, 18 Feb 2016 06:33:53 -0500 >Subject: [PATCH 1/3] COLONDB: Fix memory leak > >man 3 getline says: >ssize_t getline(char **lineptr, size_t *n, FILE *stream); >If *lineptr is set to NULL and *n is set 0 before the call, then >getline() will allocate a buffer for storing the line. This buffer >should be freed by the user program even if getline() failed. > >This patch fix buffer freeing in case if getline() failed. > Nice catch. ACK >From 016afc2aff7b980ba56690b6bafbcab377cf1e80 Mon Sep 17 00:00:00 2001 >From: Petr Cech <pc...@redhat.com> >Date: Tue, 24 Nov 2015 10:34:10 -0500 >Subject: [PATCH 2/3] COLONDB: Add comments on functions > >The colondb API provides three function: >* sss_colondb_open() >* sss_colondb_write_field() >* sss_colondb_read_field() > >It is not obvious that sss_colondb_open() add destructor on talloc >context which close the colondb during free context. And there is >expectation that SSS_COLONDB_SENTINEL is type of last item in line. > >So this patch adds simple lightening comments in doxygen style. > >Resolves: >https://fedorahosted.org/sssd/ticket/2764 >--- ACK >From 036ffc7e61456baa9bbb112452bbcc483e0e07c3 Mon Sep 17 00:00:00 2001 >From: Petr Cech <pc...@redhat.com> >Date: Fri, 27 Nov 2015 06:39:37 -0500 >Subject: [PATCH 3/3] TEST_TOOLS_COLONDB: Add tests for sss_colondb_* > >There are three functions at API of colondb wrapper: > * sss_colondb_open() > * sss_colondb_readline() > * sss_colondb_writeline() > >This patch adds tests for all of them. > >We test those cases: > * open nonexisting file for read > * open nonexisting file for write > * open existing empty file for read > * open existing file with records for read > * open existing empty file for write > * open existing file with records for write > * write to empty file > * write to file with existing records > * sss_colondb_open() > * sss_colondb_readline() > * sss_colondb_write_line() > * write to empty file and read it > >Resolves: >https://fedorahosted.org/sssd/ticket/2764 I'm not sure that talloc leak checking is properly used in this unit test. There are leaks in setup functions: diff --git a/src/tests/cmocka/test_tools_colondb.c b/src/tests/cmocka/test_tools_colondb.c index 11274d9..9cbb17f 100644 --- a/src/tests/cmocka/test_tools_colondb.c +++ b/src/tests/cmocka/test_tools_colondb.c @@ -61,7 +61,7 @@ static void create_empty_file(void **state, const char *path, const char *name) assert_non_null(fp); fclose(fp); - //talloc_free(tmp_ctx); + talloc_free(tmp_ctx); } static void create_nonempty_file(void **state, @@ -86,7 +86,7 @@ static void create_nonempty_file(void **state, sss_colondb_writeline(db, table); - //talloc_free(tmp_ctx); + talloc_free(tmp_ctx); } BTW we do not use c++ style comments :-) It's already in old coding style. https://www.freeipa.org/page/Coding_Style#Comments and moreover there is a leak in sss_colondb_writeline. @see attached patch. I didn't try to find out what's wrong with leak check. If you you are not able to fix it yourself then we might take a look at test together to save some time sending/reviewing patches. LS
>From fd458598cb619ec24ef0d00a47d84c790631257b Mon Sep 17 00:00:00 2001 From: Lukas Slebodnik <lsleb...@redhat.com> Date: Fri, 19 Feb 2016 16:18:02 +0100 Subject: [PATCH 1/2] TOOLS: Fix minor memory leak in sss_colondb_writeline The variable line was initialized to NULL. The we created temporary context tmp_ctx. We use talloc_asprintf_append to append string to line which is initially NULL and therefore new context which was not connected to tmp_ctx. man 3 talloc_string -> talloc_asprintf_append --- src/tools/common/sss_colondb.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/tools/common/sss_colondb.c b/src/tools/common/sss_colondb.c index a1a52c552b949076bdedae58f275d29a176be1e6..e8aeb315c9ed0efde15553e2d741d04c5d895b1a 100644 --- a/src/tools/common/sss_colondb.c +++ b/src/tools/common/sss_colondb.c @@ -202,6 +202,13 @@ errno_t sss_colondb_writeline(struct sss_colondb *db, return ENOMEM; } + line = talloc_strdup(tmp_ctx, ""); + if (line == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n"); + ret = ENOMEM; + goto done; + } + for (i = 0; table[i].type != SSS_COLONDB_SENTINEL; i++) { switch (table[i].type) { case SSS_COLONDB_UINT32: -- 2.5.0
_______________________________________________ sssd-devel mailing list sssd-devel@lists.fedorahosted.org https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org