From 7ced8d77ae31d4c82bfe71221e521ea9a7ca3175 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 19 Sep 2017 21:48:53 -0500 Subject: [PATCH] libpkgconf: fragment: pkgconf_fragment_parse: return false on parse failure --- doc/libpkgconf-fragment.rst | 4 ++-- libpkgconf/fragment.c | 22 +++++++++++++++++----- libpkgconf/libpkgconf.h | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/doc/libpkgconf-fragment.rst b/doc/libpkgconf-fragment.rst index 73e25b7..a6f64cf 100644 --- a/doc/libpkgconf-fragment.rst +++ b/doc/libpkgconf-fragment.rst @@ -90,7 +90,7 @@ which is composable, mergeable and reorderable. :param pkgconf_list_t* list: The `fragment list` to delete. :return: nothing -.. c:function:: void pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value) +.. c:function:: bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value) Parse a string into a `fragment list`. @@ -98,4 +98,4 @@ which is composable, mergeable and reorderable. :param pkgconf_list_t* list: The `fragment list` to add the fragment entries to. :param pkgconf_list_t* vars: A list of variables to use for variable substitution. :param char* value: The string to parse into fragments. - :return: nothing + :return: true on success, false on parse error diff --git a/libpkgconf/fragment.c b/libpkgconf/fragment.c index beacecf..f81b917 100644 --- a/libpkgconf/fragment.c +++ b/libpkgconf/fragment.c @@ -600,7 +600,7 @@ pkgconf_fragment_free(pkgconf_list_t *list) /* * !doc * - * .. c:function:: void pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value) + * .. c:function:: bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value) * * Parse a string into a `fragment list`. * @@ -608,9 +608,9 @@ pkgconf_fragment_free(pkgconf_list_t *list) * :param pkgconf_list_t* list: The `fragment list` to add the fragment entries to. * :param pkgconf_list_t* vars: A list of variables to use for variable substitution. * :param char* value: The string to parse into fragments. - * :return: nothing + * :return: true on success, false on parse error */ -void +bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value) { int i, ret, argc; @@ -622,12 +622,24 @@ pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkg { PKGCONF_TRACE(client, "unable to parse fragment string [%s]", repstr); free(repstr); - return; + return false; } - for (i = 0; i < argc && argv[i] != NULL; i++) + for (i = 0; i < argc; i++) + { + if (argv[i] == NULL) + { + PKGCONF_TRACE(client, "parsed fragment string is inconsistent: argc = %d while argv[%d] == NULL", argc, i); + pkgconf_argv_free(argv); + free(repstr); + return false; + } + pkgconf_fragment_add(client, list, argv[i]); + } pkgconf_argv_free(argv); free(repstr); + + return true; } diff --git a/libpkgconf/libpkgconf.h b/libpkgconf/libpkgconf.h index d7fe911..ac873bf 100644 --- a/libpkgconf/libpkgconf.h +++ b/libpkgconf/libpkgconf.h @@ -273,7 +273,7 @@ PKGCONF_API void pkgconf_argv_free(char **argv); /* fragment.c */ typedef bool (*pkgconf_fragment_filter_func_t)(const pkgconf_client_t *client, const pkgconf_fragment_t *frag, void *data); -PKGCONF_API void pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value); +PKGCONF_API bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value); PKGCONF_API void pkgconf_fragment_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *string); PKGCONF_API void pkgconf_fragment_copy(const pkgconf_client_t *client, pkgconf_list_t *list, const pkgconf_fragment_t *base, bool is_private); PKGCONF_API void pkgconf_fragment_delete(pkgconf_list_t *list, pkgconf_fragment_t *node);