The branch, master has been updated via a8ec8304917 s4-torture: test file_line_parse as well via ae4dd2ab82e lib: Fix file_lines_parse() to do what people expect. Much safer to use. via 61f6672d8bb lib: create a wrapper for file_lines_parse(). from 2ba6d596ff0 tests python krb5: add arcfour salt tests
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit a8ec83049176fdebe086be8c03c7d058c58f48d8 Author: Günther Deschner <g...@samba.org> Date: Tue Nov 10 17:10:27 2020 +0100 s4-torture: test file_line_parse as well Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Günther Deschner <g...@samba.org> Autobuild-Date(master): Fri Nov 13 17:47:33 UTC 2020 on sn-devel-184 commit ae4dd2ab82eae1ddffbb00e7a753521a0879341b Author: Jeremy Allison <j...@samba.org> Date: Tue Nov 10 13:52:01 2020 -0800 lib: Fix file_lines_parse() to do what people expect. Much safer to use. Take an incoming const char * pointer and return an allocated array that must be freed. Don't expose the internal optimization of file_lines_parse_internal() breaking the passed in string into lines. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Guenther Deschner <g...@samba.org> commit 61f6672d8bbdbb6889be94591a7dbaeb55ab3d30 Author: Jeremy Allison <j...@samba.org> Date: Tue Nov 10 13:43:24 2020 -0800 lib: create a wrapper for file_lines_parse(). Make the internal function file_lines_parse_internal(). Currently file_lines_parse() just wraps file_lines_parse_internal(), but this allows me to change file_lines_parse() to take a const char * to make it safe for callers (no talloc tricks). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Guenther Deschner <g...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/util/samba_util.h | 2 +- lib/util/tests/file.c | 31 +++++++++++++++++++++++++++++++ lib/util/util_file.c | 23 ++++++++++++++++++++--- 3 files changed, 52 insertions(+), 4 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h index 5a81baa80b6..3a60b618083 100644 --- a/lib/util/samba_util.h +++ b/lib/util/samba_util.h @@ -394,7 +394,7 @@ load a file into memory from a fd. _PUBLIC_ char *fd_load(int fd, size_t *size, size_t maxsize, TALLOC_CTX *mem_ctx); -char **file_lines_parse(char *p, size_t size, int *numlines, TALLOC_CTX *mem_ctx); +char **file_lines_parse(const char *p, size_t size, int *numlines, TALLOC_CTX *mem_ctx); /** load a file into memory diff --git a/lib/util/tests/file.c b/lib/util/tests/file.c index 55c9d4cec9a..3501c7e135f 100644 --- a/lib/util/tests/file.c +++ b/lib/util/tests/file.c @@ -243,6 +243,34 @@ done: return ret; } +static bool test_file_lines_parse(struct torture_context *tctx) +{ + char **lines; + int numlines; + TALLOC_CTX *mem_ctx = tctx; + char *buf; + size_t size; + + torture_assert(tctx, file_save(TEST_FILENAME, + (const void *)TEST_DATA, + strlen(TEST_DATA)), + "saving file"); + + buf = file_load(TEST_FILENAME, &size, 0, mem_ctx); + torture_assert(tctx, buf, "failed to load file"); + unlink(TEST_FILENAME); + + lines = file_lines_parse(buf, + size, + &numlines, + mem_ctx); + torture_assert(tctx, lines, "failed to parse lines"); + + TALLOC_FREE(lines); + TALLOC_FREE(buf); + return true; +} + struct torture_suite *torture_local_util_file(TALLOC_CTX *mem_ctx) { struct torture_suite *suite = torture_suite_create(mem_ctx, "file"); @@ -256,5 +284,8 @@ struct torture_suite *torture_local_util_file(TALLOC_CTX *mem_ctx) torture_suite_add_simple_test(suite, "afdgets", test_afdgets); + torture_suite_add_simple_test(suite, "file_lines_parse", + test_file_lines_parse); + return suite; } diff --git a/lib/util/util_file.c b/lib/util/util_file.c index 0c890f9b5ea..af90e4a7621 100644 --- a/lib/util/util_file.c +++ b/lib/util/util_file.c @@ -253,7 +253,7 @@ _PUBLIC_ char *file_load(const char *fname, size_t *size, size_t maxsize, TALLOC parse a buffer into lines 'p' will be freed on error, and otherwise will be made a child of the returned array **/ -char **file_lines_parse(char *p, size_t size, int *numlines, TALLOC_CTX *mem_ctx) +static char **file_lines_parse_internal(char *p, size_t size, int *numlines, TALLOC_CTX *mem_ctx) { unsigned int i; char *s, **ret; @@ -305,7 +305,7 @@ _PUBLIC_ char **file_lines_load(const char *fname, int *numlines, size_t maxsize p = file_load(fname, &size, maxsize, mem_ctx); if (!p) return NULL; - return file_lines_parse(p, size, numlines, mem_ctx); + return file_lines_parse_internal(p, size, numlines, mem_ctx); } /** @@ -321,7 +321,24 @@ _PUBLIC_ char **fd_lines_load(int fd, int *numlines, size_t maxsize, TALLOC_CTX p = fd_load(fd, &size, maxsize, mem_ctx); if (!p) return NULL; - return file_lines_parse(p, size, numlines, mem_ctx); + return file_lines_parse_internal(p, size, numlines, mem_ctx); +} + +_PUBLIC_ char **file_lines_parse(const char *p_in, + size_t size, + int *numlines, + TALLOC_CTX *mem_ctx) +{ + /* + * Copy the incoming string so it can end up + * being owned by the returned pointer and + * freed when that is. + */ + char *p = talloc_strdup(mem_ctx, p_in); + if (p == NULL) { + return NULL; + } + return file_lines_parse_internal(p, size, numlines, mem_ctx); } _PUBLIC_ bool file_save_mode(const char *fname, const void *packet, -- Samba Shared Repository