On 12 January 2015 at 11:50, Ciprian Barbu <[email protected]> wrote:
> Signed-off-by: Ciprian Barbu <[email protected]>
> ---
> Fix for https://bugs.linaro.org/show_bug.cgi?id=1049
>
> example/packet/odp_pktio.c | 29 +++++++++++++++--------------
> 1 file changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c
> index b162fac..0d5918a 100644
> --- a/example/packet/odp_pktio.c
> +++ b/example/packet/odp_pktio.c
> @@ -69,6 +69,7 @@ typedef struct {
> int if_count; /**< Number of interfaces to be used */
> char **if_names; /**< Array of pointers to interface names */
> int mode; /**< Packet IO mode */
> + char *if_str; /**< Storage for interface names */
> } appl_args_t;
>
> /**
> @@ -376,6 +377,8 @@ int main(int argc, char *argv[])
> /* Master thread waits for other threads to exit */
> odph_linux_pthread_join(thread_tbl, num_workers);
>
> + free(args->appl.if_names);
> + free(args->appl.if_str);
> free(args);
> printf("Exit\n\n");
>
> @@ -462,7 +465,7 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
> {
> int opt;
> int long_index;
> - char *names, *str, *token, *save;
> + char *token;
> size_t len;
> int i;
> static struct option longopts[] = {
> @@ -495,19 +498,19 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
> }
> len += 1; /* add room for '\0' */
>
> - names = malloc(len);
> - if (names == NULL) {
> + appl_args->if_str = malloc(len);
> + if (appl_args->if_str == NULL) {
> usage(argv[0]);
> exit(EXIT_FAILURE);
> }
>
> /* count the number of tokens separated by ',' */
> - strcpy(names, optarg);
> - for (str = names, i = 0;; str = NULL, i++) {
> - token = strtok_r(str, ",", &save);
> - if (token == NULL)
> - break;
> - }
> + strcpy(appl_args->if_str, optarg);
> + for (token = strtok(appl_args->if_str, ","), i = 0;
strtok() is not thread-safe and thus doesn't seem like a great idea to
use it in a multithreaded application based on ODP. I don't know about
this exact usage here, perhaps this argument parsing is always only
going to happen in a single thread?
But why not just define _POSIX_C_SOURCE to get access to strtok_r()?
This is how we do it in other places in ODP with the same problem.
E.g. the timer cunit test uses rand_r and not rand() (which likewise
is not thread-safe).
> + token != NULL;
> + token = strtok(NULL, ","), i++)
> + ;
> +
> appl_args->if_count = i;
>
> if (appl_args->if_count == 0) {
> @@ -520,11 +523,9 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
> calloc(appl_args->if_count, sizeof(char *));
>
> /* store the if names (reset names string) */
> - strcpy(names, optarg);
> - for (str = names, i = 0;; str = NULL, i++) {
> - token = strtok_r(str, ",", &save);
> - if (token == NULL)
> - break;
> + strcpy(appl_args->if_str, optarg);
> + for (token = strtok(appl_args->if_str, ","), i = 0;
> + token != NULL; token = strtok(NULL, ","), i++) {
> appl_args->if_names[i] = token;
> }
> break;
> --
> 1.8.3.2
>
>
> _______________________________________________
> lng-odp mailing list
> [email protected]
> http://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp