Patch to fix tab-completion crash on "remove extension"

This patch simply removes some old code back before Asterisk used editline. 
This fixes the crash that occurred when tab-completing "remove extension".

(closes issue #14689)
Reported by: isaacgal


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@191096 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
David Brooks
2009-04-29 18:07:59 +00:00
parent 603a56aa69
commit 4a734fd926

View File

@@ -620,72 +620,12 @@ static int handle_context_remove_extension(int fd, int argc, char *argv[])
return ret; return ret;
} }
#define BROKEN_READLINE 1
#ifdef BROKEN_READLINE
/*
* There is one funny thing, when you have word like 300@ and you hit
* <tab>, you arguments will like as your word is '300 ', so it '@'
* characters acts sometimes as word delimiter and sometimes as a part
* of word
*
* This fix function, allocates new word variable and store here every
* time xxx@yyy always as one word and correct pos is set too
*
* It's ugly, I know, but I'm waiting for Mark suggestion if upper is
* bug or feature ...
*/
static int fix_complete_args(const char *line, char **word, int *pos)
{
char *_line, *_strsep_line, *_previous_word = NULL, *_word = NULL;
int words = 0;
_line = strdup(line);
_strsep_line = _line;
while (_strsep_line) {
_previous_word = _word;
_word = strsep(&_strsep_line, " ");
if (_word && strlen(_word)) words++;
}
if (_word || _previous_word) {
if (_word) {
if (!strlen(_word)) words++;
*word = strdup(_word);
} else
*word = strdup(_previous_word);
*pos = words - 1;
free(_line);
return 0;
}
free(_line);
return -1;
}
#endif /* BROKEN_READLINE */
static char *complete_context_remove_extension_deprecated(const char *line, const char *word, int pos, static char *complete_context_remove_extension_deprecated(const char *line, const char *word, int pos,
int state) int state)
{ {
char *ret = NULL; char *ret = NULL;
int which = 0; int which = 0;
#ifdef BROKEN_READLINE
char *word2;
/*
* Fix arguments, *word is a new allocated structure, REMEMBER to
* free *word when you want to return from this function ...
*/
if (fix_complete_args(line, &word2, &pos)) {
ast_log(LOG_ERROR, "Out of free memory\n");
return NULL;
}
word = word2;
#endif
if (pos == 2) { /* 'remove extension _X_' (exten/cid@context ... */ if (pos == 2) { /* 'remove extension _X_' (exten/cid@context ... */
struct ast_context *c = NULL; struct ast_context *c = NULL;
char *context = NULL, *exten = NULL, *cid = NULL; char *context = NULL, *exten = NULL, *cid = NULL;
@@ -694,9 +634,6 @@ static char *complete_context_remove_extension_deprecated(const char *line, cons
int lcid = 0; /* length of cid */ int lcid = 0; /* length of cid */
lc = split_ec(word, &exten, &context, &cid); lc = split_ec(word, &exten, &context, &cid);
#ifdef BROKEN_READLINE
free(word2);
#endif
if (lc) /* error */ if (lc) /* error */
return NULL; return NULL;
le = strlen(exten); le = strlen(exten);
@@ -762,7 +699,11 @@ static char *complete_context_remove_extension_deprecated(const char *line, cons
*p = '\0'; *p = '\0';
le = strlen(exten); le = strlen(exten);
lc = strlen(context); lc = strlen(context);
lcid = strlen(cid); if (cid == NULL) {
lcid = 0;
} else {
lcid = strlen(cid);
}
len = strlen(word); len = strlen(word);
if (le == 0 || lc == 0) if (le == 0 || lc == 0)
goto error3; goto error3;
@@ -806,9 +747,6 @@ static char *complete_context_remove_extension_deprecated(const char *line, cons
if (exten) if (exten)
free(exten); free(exten);
} }
#ifdef BROKEN_READLINE
free(word2);
#endif
return ret; return ret;
} }
@@ -818,19 +756,6 @@ static char *complete_context_remove_extension(const char *line, const char *wor
char *ret = NULL; char *ret = NULL;
int which = 0; int which = 0;
#ifdef BROKEN_READLINE
char *word2;
/*
* Fix arguments, *word is a new allocated structure, REMEMBER to
* free *word when you want to return from this function ...
*/
if (fix_complete_args(line, &word2, &pos)) {
ast_log(LOG_ERROR, "Out of free memory\n");
return NULL;
}
word = word2;
#endif
if (pos == 3) { /* 'dialplan remove extension _X_' (exten@context ... */ if (pos == 3) { /* 'dialplan remove extension _X_' (exten@context ... */
struct ast_context *c = NULL; struct ast_context *c = NULL;
char *context = NULL, *exten = NULL, *cid = NULL; char *context = NULL, *exten = NULL, *cid = NULL;
@@ -840,9 +765,6 @@ static char *complete_context_remove_extension(const char *line, const char *wor
lc = split_ec(word, &exten, &context, &cid); lc = split_ec(word, &exten, &context, &cid);
if (lc) { /* error */ if (lc) { /* error */
#ifdef BROKEN_READLINE
free(word2);
#endif
return NULL; return NULL;
} }
le = strlen(exten); le = strlen(exten);
@@ -888,10 +810,6 @@ static char *complete_context_remove_extension(const char *line, const char *wor
if (e) /* got a match */ if (e) /* got a match */
break; break;
} }
#ifdef BROKEN_READLINE
free(word2);
#endif
ast_unlock_contexts(); ast_unlock_contexts();
error2: error2:
if (exten) if (exten)
@@ -954,9 +872,6 @@ static char *complete_context_remove_extension(const char *line, const char *wor
error3: error3:
if (exten) if (exten)
free(exten); free(exten);
#ifdef BROKEN_READLINE
free(word2);
#endif
} }
return ret; return ret;
} }