Skip to content

Commit d301c25

Browse files
committed
Fix crash when out of memory while opening a terminal window: Handle out-of-memory more gracefully.
1 parent be217ef commit d301c25

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

liteidex/src/3rdparty/libvterm/src/screen.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ static ScreenCell *realloc_buffer(VTermScreen *screen, ScreenCell *buffer, int n
9595
}
9696
}
9797

98-
if(buffer)
99-
vterm_allocator_free(screen->vt, buffer);
98+
vterm_allocator_free(screen->vt, buffer);
10099

101100
return new_buffer;
102101
}
@@ -520,8 +519,7 @@ static int resize(int new_rows, int new_cols, VTermPos *delta, void *user)
520519
screen->rows = new_rows;
521520
screen->cols = new_cols;
522521

523-
if(screen->sb_buffer)
524-
vterm_allocator_free(screen->vt, screen->sb_buffer);
522+
vterm_allocator_free(screen->vt, screen->sb_buffer);
525523

526524
screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * new_cols);
527525

@@ -625,10 +623,13 @@ static VTermStateCallbacks state_cbs = {
625623
static VTermScreen *screen_new(VTerm *vt)
626624
{
627625
VTermState *state = vterm_obtain_state(vt);
628-
if(!state)
626+
if (state == NULL)
629627
return NULL;
630628

631629
VTermScreen *screen = vterm_allocator_malloc(vt, sizeof(VTermScreen));
630+
if (screen == NULL)
631+
return NULL;
632+
632633
int rows, cols;
633634

634635
vterm_get_size(vt, &rows, &cols);
@@ -652,6 +653,12 @@ static VTermScreen *screen_new(VTerm *vt)
652653

653654
screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * cols);
654655

656+
if (screen->buffer == NULL || screen->sb_buffer == NULL)
657+
{
658+
vterm_screen_free(screen);
659+
return NULL;
660+
}
661+
655662
vterm_state_set_callbacks(screen->state, &state_cbs, screen);
656663

657664
return screen;
@@ -660,11 +667,8 @@ static VTermScreen *screen_new(VTerm *vt)
660667
INTERNAL void vterm_screen_free(VTermScreen *screen)
661668
{
662669
vterm_allocator_free(screen->vt, screen->buffers[0]);
663-
if(screen->buffers[1])
664-
vterm_allocator_free(screen->vt, screen->buffers[1]);
665-
670+
vterm_allocator_free(screen->vt, screen->buffers[1]);
666671
vterm_allocator_free(screen->vt, screen->sb_buffer);
667-
668672
vterm_allocator_free(screen->vt, screen);
669673
}
670674

liteidex/src/3rdparty/libvterm/src/state.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ static VTermState *vterm_state_new(VTerm *vt)
5252
{
5353
VTermState *state = vterm_allocator_malloc(vt, sizeof(VTermState));
5454

55+
if (state == NULL)
56+
return NULL;
5557
state->vt = vt;
5658

5759
state->rows = vt->rows;
@@ -1736,6 +1738,8 @@ VTermState *vterm_obtain_state(VTerm *vt)
17361738
return vt->state;
17371739

17381740
VTermState *state = vterm_state_new(vt);
1741+
if (state == NULL)
1742+
return NULL;
17391743
vt->state = state;
17401744

17411745
state->combine_chars_size = 16;

liteidex/src/3rdparty/libvterm/src/vterm.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ VTerm *vterm_new_with_allocator(int rows, int cols, VTermAllocatorFunctions *fun
3737
/* Need to bootstrap using the allocator function directly */
3838
VTerm *vt = (*funcs->malloc)(sizeof(VTerm), allocdata);
3939

40+
if (vt == NULL)
41+
return NULL;
4042
vt->allocator = funcs;
4143
vt->allocdata = allocdata;
4244

@@ -51,13 +53,24 @@ VTerm *vterm_new_with_allocator(int rows, int cols, VTermAllocatorFunctions *fun
5153
vt->parser.strbuffer_len = 64;
5254
vt->parser.strbuffer_cur = 0;
5355
vt->parser.strbuffer = vterm_allocator_malloc(vt, vt->parser.strbuffer_len);
56+
if (vt->parser.strbuffer == NULL)
57+
{
58+
vterm_allocator_free(vt, vt);
59+
return NULL;
60+
}
5461

5562
vt->outfunc = NULL;
5663
vt->outdata = NULL;
5764

5865
vt->outbuffer_len = 64;
5966
vt->outbuffer_cur = 0;
6067
vt->outbuffer = vterm_allocator_malloc(vt, vt->outbuffer_len);
68+
if (vt->outbuffer == NULL)
69+
{
70+
vterm_allocator_free(vt, vt->parser.strbuffer);
71+
vterm_allocator_free(vt, vt);
72+
return NULL;
73+
}
6174

6275
vt->tmpbuffer_len = 64;
6376
vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len);
@@ -87,7 +100,8 @@ INTERNAL void *vterm_allocator_malloc(VTerm *vt, size_t size)
87100

88101
INTERNAL void vterm_allocator_free(VTerm *vt, void *ptr)
89102
{
90-
(*vt->allocator->free)(ptr, vt->allocdata);
103+
if (ptr)
104+
(*vt->allocator->free)(ptr, vt->allocdata);
91105
}
92106

93107
void vterm_get_size(const VTerm *vt, int *rowsp, int *colsp)

0 commit comments

Comments
 (0)