提交 48acc0cd authored 作者: Travis Cross's avatar Travis Cross

fs_cli: do not assume that LineInfo buffers are null-terminated

man editline(3el) says that they're not.
上级 e87af901
...@@ -797,17 +797,26 @@ static void set_fn_keys(cli_profile_t *profile) ...@@ -797,17 +797,26 @@ static void set_fn_keys(cli_profile_t *profile)
static char* end_of_str(char *s) { return (*s == '\0' ? s : s + strlen(s) - 1); } static char* end_of_str(char *s) { return (*s == '\0' ? s : s + strlen(s) - 1); }
static unsigned char esl_console_complete(const char *buffer, const char *cursor) static char* _strndup(const char *s, int n)
{
char *d = (char*)malloc(n + 1);
while (*s && n>0) {
*d = *s;
d++; s++;
}
*d = 0;
return d;
}
static unsigned char esl_console_complete(const char *buffer, const char *cursor, const char *lastchar)
{ {
char cmd_str[2048] = ""; char cmd_str[2048] = "";
unsigned char ret = CC_REDISPLAY; unsigned char ret = CC_REDISPLAY;
char *dup = strdup(buffer); int buflen = (lastchar - buffer);
char *dup = _strndup(buffer, buflen);
char *buf = dup; char *buf = dup;
int pos = 0, sc = 0; int sc = 0, offset = (cursor - buffer), pos = (offset > 0) ? offset : 0;
char *p; char *p;
if (!esl_strlen_zero(cursor) && !esl_strlen_zero(buffer)) {
pos = (int)(cursor - buffer);
}
if (pos > 0) { if (pos > 0) {
*(buf + pos) = '\0'; *(buf + pos) = '\0';
} }
...@@ -880,7 +889,7 @@ static unsigned char esl_console_complete(const char *buffer, const char *cursor ...@@ -880,7 +889,7 @@ static unsigned char esl_console_complete(const char *buffer, const char *cursor
static unsigned char complete(EditLine *el, int ch) static unsigned char complete(EditLine *el, int ch)
{ {
const LineInfo *lf = el_line(el); const LineInfo *lf = el_line(el);
return esl_console_complete(lf->buffer, lf->cursor); return esl_console_complete(lf->buffer, lf->cursor, lf->lastchar);
} }
#endif #endif
...@@ -1250,9 +1259,9 @@ int main(int argc, char *argv[]) ...@@ -1250,9 +1259,9 @@ int main(int argc, char *argv[])
#ifdef HAVE_EDITLINE #ifdef HAVE_EDITLINE
{ {
const LineInfo *lf = el_line(el); const LineInfo *lf = el_line(el);
char *s = (char *) lf->buffer; int len = (lf->lastchar - lf->buffer);
el_deletestr(el, strlen(s) + 1); el_deletestr(el, len + 1);
memset(s, 0, strlen(s)); memset((char*)lf->buffer, 0, len);
} }
#endif #endif
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论