Fix few memory bugs
This commit is contained in:
parent
81b0623a6c
commit
36b71abfaa
1 changed files with 85 additions and 77 deletions
|
@ -243,6 +243,9 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
|
||||||
{
|
{
|
||||||
int column;
|
int column;
|
||||||
|
|
||||||
|
if (linep >= screen->lines + screen->num_lines)
|
||||||
|
break;
|
||||||
|
|
||||||
for (column = 0;
|
for (column = 0;
|
||||||
column <= linep->len
|
column <= linep->len
|
||||||
&& y < grub_term_num_entries (term_screen->term);
|
&& y < grub_term_num_entries (term_screen->term);
|
||||||
|
@ -337,7 +340,7 @@ insert_string (struct screen *screen, char *s, int update)
|
||||||
screen->num_lines++;
|
screen->num_lines++;
|
||||||
screen->lines = grub_realloc (screen->lines,
|
screen->lines = grub_realloc (screen->lines,
|
||||||
screen->num_lines
|
screen->num_lines
|
||||||
* sizeof (struct line));
|
* sizeof (screen->lines[0]));
|
||||||
if (! screen->lines)
|
if (! screen->lines)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1020,87 +1023,92 @@ complete (struct screen *screen, int continuous, int update)
|
||||||
insert = grub_normal_do_completion (linep->buf, &restore, store_completion);
|
insert = grub_normal_do_completion (linep->buf, &restore, store_completion);
|
||||||
|
|
||||||
linep->buf[screen->column] = saved_char;
|
linep->buf[screen->column] = saved_char;
|
||||||
|
|
||||||
buflen = grub_strlen (completion_buffer.buf);
|
if (completion_buffer.buf)
|
||||||
ucs4 = grub_malloc (sizeof (grub_uint32_t) * (buflen + 1));
|
|
||||||
|
|
||||||
if (!ucs4)
|
|
||||||
{
|
{
|
||||||
grub_print_error ();
|
buflen = grub_strlen (completion_buffer.buf);
|
||||||
grub_errno = GRUB_ERR_NONE;
|
ucs4 = grub_malloc (sizeof (grub_uint32_t) * (buflen + 1));
|
||||||
return 1;
|
|
||||||
}
|
if (!ucs4)
|
||||||
|
{
|
||||||
|
grub_print_error ();
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
ucs4len = grub_utf8_to_ucs4 (ucs4, buflen,
|
ucs4len = grub_utf8_to_ucs4 (ucs4, buflen,
|
||||||
(grub_uint8_t *) completion_buffer.buf,
|
(grub_uint8_t *) completion_buffer.buf,
|
||||||
buflen, 0);
|
buflen, 0);
|
||||||
ucs4[ucs4len] = 0;
|
ucs4[ucs4len] = 0;
|
||||||
|
|
||||||
if (restore)
|
if (restore)
|
||||||
for (i = 0; i < screen->nterms; i++)
|
for (i = 0; i < screen->nterms; i++)
|
||||||
{
|
|
||||||
int num_sections = ((completion_buffer.len
|
|
||||||
+ grub_term_width (screen->terms[i].term) - 8 - 1)
|
|
||||||
/ (grub_term_width (screen->terms[i].term) - 8));
|
|
||||||
grub_uint32_t *endp;
|
|
||||||
grub_uint16_t pos;
|
|
||||||
grub_uint32_t *p = ucs4;
|
|
||||||
|
|
||||||
pos = grub_term_getxy (screen->terms[i].term);
|
|
||||||
grub_term_gotoxy (screen->terms[i].term, 0,
|
|
||||||
grub_term_height (screen->terms[i].term) - 3);
|
|
||||||
|
|
||||||
screen->completion_shown = 1;
|
|
||||||
|
|
||||||
grub_term_gotoxy (screen->terms[i].term, 0,
|
|
||||||
grub_term_height (screen->terms[i].term) - 3);
|
|
||||||
grub_puts_terminal (" ", screen->terms[i].term);
|
|
||||||
switch (completion_type)
|
|
||||||
{
|
{
|
||||||
case GRUB_COMPLETION_TYPE_COMMAND:
|
int num_sections = ((completion_buffer.len
|
||||||
grub_puts_terminal (_("Possible commands are:"),
|
+ grub_term_width (screen->terms[i].term)
|
||||||
screen->terms[i].term);
|
- 8 - 1)
|
||||||
break;
|
/ (grub_term_width (screen->terms[i].term)
|
||||||
case GRUB_COMPLETION_TYPE_DEVICE:
|
- 8));
|
||||||
grub_puts_terminal (_("Possible devices are:"),
|
grub_uint32_t *endp;
|
||||||
screen->terms[i].term);
|
grub_uint16_t pos;
|
||||||
break;
|
grub_uint32_t *p = ucs4;
|
||||||
case GRUB_COMPLETION_TYPE_FILE:
|
|
||||||
grub_puts_terminal (_("Possible files are:"),
|
pos = grub_term_getxy (screen->terms[i].term);
|
||||||
screen->terms[i].term);
|
grub_term_gotoxy (screen->terms[i].term, 0,
|
||||||
break;
|
grub_term_height (screen->terms[i].term) - 3);
|
||||||
case GRUB_COMPLETION_TYPE_PARTITION:
|
|
||||||
grub_puts_terminal (_("Possible partitions are:"),
|
screen->completion_shown = 1;
|
||||||
screen->terms[i].term);
|
|
||||||
break;
|
grub_term_gotoxy (screen->terms[i].term, 0,
|
||||||
case GRUB_COMPLETION_TYPE_ARGUMENT:
|
grub_term_height (screen->terms[i].term) - 3);
|
||||||
grub_puts_terminal (_("Possible arguments are:"),
|
grub_puts_terminal (" ", screen->terms[i].term);
|
||||||
screen->terms[i].term);
|
switch (completion_type)
|
||||||
break;
|
{
|
||||||
default:
|
case GRUB_COMPLETION_TYPE_COMMAND:
|
||||||
grub_puts_terminal (_("Possible things are:"),
|
grub_puts_terminal (_("Possible commands are:"),
|
||||||
screen->terms[i].term);
|
screen->terms[i].term);
|
||||||
break;
|
break;
|
||||||
|
case GRUB_COMPLETION_TYPE_DEVICE:
|
||||||
|
grub_puts_terminal (_("Possible devices are:"),
|
||||||
|
screen->terms[i].term);
|
||||||
|
break;
|
||||||
|
case GRUB_COMPLETION_TYPE_FILE:
|
||||||
|
grub_puts_terminal (_("Possible files are:"),
|
||||||
|
screen->terms[i].term);
|
||||||
|
break;
|
||||||
|
case GRUB_COMPLETION_TYPE_PARTITION:
|
||||||
|
grub_puts_terminal (_("Possible partitions are:"),
|
||||||
|
screen->terms[i].term);
|
||||||
|
break;
|
||||||
|
case GRUB_COMPLETION_TYPE_ARGUMENT:
|
||||||
|
grub_puts_terminal (_("Possible arguments are:"),
|
||||||
|
screen->terms[i].term);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
grub_puts_terminal (_("Possible things are:"),
|
||||||
|
screen->terms[i].term);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_puts_terminal ("\n ", screen->terms[i].term);
|
||||||
|
|
||||||
|
p += (count % num_sections)
|
||||||
|
* (grub_term_width (screen->terms[i].term) - 8);
|
||||||
|
endp = p + (grub_term_width (screen->terms[i].term) - 8);
|
||||||
|
|
||||||
|
if (p != ucs4)
|
||||||
|
grub_putcode (GRUB_TERM_DISP_LEFT, screen->terms[i].term);
|
||||||
|
else
|
||||||
|
grub_putcode (' ', screen->terms[i].term);
|
||||||
|
|
||||||
|
grub_print_ucs4 (p, ucs4 + ucs4len < endp ? ucs4 + ucs4len : endp,
|
||||||
|
0, 0, screen->terms[i].term);
|
||||||
|
|
||||||
|
if (ucs4 + ucs4len > endp)
|
||||||
|
grub_putcode (GRUB_TERM_DISP_RIGHT, screen->terms[i].term);
|
||||||
|
grub_term_gotoxy (screen->terms[i].term, pos >> 8, pos & 0xFF);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
grub_puts_terminal ("\n ", screen->terms[i].term);
|
|
||||||
|
|
||||||
p += (count % num_sections)
|
|
||||||
* (grub_term_width (screen->terms[i].term) - 8);
|
|
||||||
endp = p + (grub_term_width (screen->terms[i].term) - 8);
|
|
||||||
|
|
||||||
if (p != ucs4)
|
|
||||||
grub_putcode (GRUB_TERM_DISP_LEFT, screen->terms[i].term);
|
|
||||||
else
|
|
||||||
grub_putcode (' ', screen->terms[i].term);
|
|
||||||
|
|
||||||
grub_print_ucs4 (p, ucs4 + ucs4len < endp ? ucs4 + ucs4len : endp,
|
|
||||||
0, 0, screen->terms[i].term);
|
|
||||||
|
|
||||||
if (ucs4 + ucs4len > endp)
|
|
||||||
grub_putcode (GRUB_TERM_DISP_RIGHT, screen->terms[i].term);
|
|
||||||
grub_term_gotoxy (screen->terms[i].term, pos >> 8, pos & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (insert)
|
if (insert)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue