diff --git a/ChangeLog b/ChangeLog index 592ba697395e5bc41e6c319530dc7386b0b12c5c..91aca9f88b79a1066ea47013d4669b7b2045c786 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-01-02 David Benjamin <davidben@Savannah> + * src/search.c (parse_syntax): Fix blatantly and dangerously incorrect code for + deleting old syntaxes. + 2013-01-02 Mike Frysinger <vapier@gentoo.org> * src/files.c (cwd_tab_completion): Remove unnecessary variables * src/search.c (search_init): Fix gcc complaints on certain versions diff --git a/src/rcfile.c b/src/rcfile.c index 56eeb72d594929cad6bc3d4d7d66c3a8a30f8399..991eba930f57915b00a4bdd6ccf27e4c74b7503c 100644 --- a/src/rcfile.c +++ b/src/rcfile.c @@ -252,7 +252,7 @@ bool nregcomp(const char *regex, int cflags) void parse_syntax(char *ptr) { const char *fileregptr = NULL, *nameptr = NULL; - syntaxtype *tmpsyntax; + syntaxtype *tmpsyntax, *prev_syntax; exttype *endext = NULL; /* The end of the extensions list for this syntax. */ @@ -279,15 +279,26 @@ void parse_syntax(char *ptr) /* Search for a duplicate syntax name. If we find one, free it, so * that we always use the last syntax with a given name. */ + prev_syntax = NULL; for (tmpsyntax = syntaxes; tmpsyntax != NULL; tmpsyntax = tmpsyntax->next) { if (strcmp(nameptr, tmpsyntax->desc) == 0) { - syntaxtype *prev_syntax = tmpsyntax; + syntaxtype *old_syntax = tmpsyntax; + + if (endsyntax == tmpsyntax) + endsyntax = prev_syntax; tmpsyntax = tmpsyntax->next; - free(prev_syntax); + if (prev_syntax != NULL) + prev_syntax->next = tmpsyntax; + else + syntaxes = tmpsyntax; + + free(old_syntax->desc); + free(old_syntax); break; } + prev_syntax = tmpsyntax; } if (syntaxes == NULL) {