fix a segfault in parse_filter_chain

This commit is contained in:
tonton th 2020-12-19 12:49:06 +01:00
parent 22ef7c084e
commit 6bd95089f9

View File

@ -5,6 +5,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <alloca.h>
#include "../floatimg.h" #include "../floatimg.h"
#include "crapulator.h" #include "crapulator.h"
@ -165,7 +166,7 @@ return -1;
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
int parse_filter_chain(int numid, char *argument) int parse_filter_chain(int numid, char *argument)
{ {
char *cptr; char *cptr, *tmparg;
int value, foo; int value, foo;
if (numid < 0 || numid > NUMBER_OF_STACK) { if (numid < 0 || numid > NUMBER_OF_STACK) {
@ -181,11 +182,19 @@ if (foo) {
return foo; return foo;
} }
/* BUG ?
If the 'argument' string is coming from a default value (as defined
here in main), strtok make a nice segfault. so I make a copy of that
string...
*/
tmparg = alloca(strlen(argument) + 1);
strcpy(tmparg, argument);
for (;;) { for (;;) {
cptr = strtok(argument, ":"); cptr = strtok(tmparg, ":");
// fprintf(stderr, "cptr %p\n", cptr); // fprintf(stderr, "cptr %p\n", cptr);
if (NULL==cptr) break; if (NULL==cptr) break;
argument = NULL; tmparg = NULL; /* for the next pass of strtok */
// fprintf(stderr, " parsing '%s'\n", cptr); // fprintf(stderr, " parsing '%s'\n", cptr);
if (1 == sscanf(cptr, "%d", &value)) { if (1 == sscanf(cptr, "%d", &value)) {
foo = filterstack_add(numid, value, 1, 1.0); foo = filterstack_add(numid, value, 1, 1.0);