=== modified file 'src/screen.c' --- old/src/screen.c 2020-01-06 14:57:05 +0000 +++ new/src/screen.c 2021-07-06 15:00:30 +0000 @@ -659,13 +659,19 @@ .setlineinfo = &setlineinfo, }; +/* + * Allocate a new screen and return it. + * Return NULL when out of memory. + */ static VTermScreen *screen_new(VTerm *vt) { VTermState *state = vterm_obtain_state(vt); - if(!state) + if (state == NULL) return NULL; VTermScreen *screen = vterm_allocator_malloc(vt, sizeof(VTermScreen)); + if (screen == NULL) + return NULL; int rows, cols; vterm_get_size(vt, &rows, &cols); @@ -689,6 +695,12 @@ screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * cols); + if (screen->buffer == NULL || screen->sb_buffer == NULL) + { + vterm_screen_free(screen); + return NULL; + } + vterm_state_set_callbacks(screen->state, &state_cbs, screen); return screen; @@ -697,11 +709,8 @@ INTERNAL void vterm_screen_free(VTermScreen *screen) { vterm_allocator_free(screen->vt, screen->buffers[BUFIDX_PRIMARY]); - if(screen->buffers[BUFIDX_ALTSCREEN]) - vterm_allocator_free(screen->vt, screen->buffers[BUFIDX_ALTSCREEN]); - + vterm_allocator_free(screen->vt, screen->buffers[BUFIDX_ALTSCREEN]); vterm_allocator_free(screen->vt, screen->sb_buffer); - vterm_allocator_free(screen->vt, screen); } === modified file 'src/state.c' --- old/src/state.c 2021-05-11 22:07:17 +0000 +++ new/src/state.c 2021-07-06 14:57:04 +0000 @@ -60,6 +60,8 @@ { VTermState *state = vterm_allocator_malloc(vt, sizeof(VTermState)); + if (state == NULL) + return NULL; state->vt = vt; state->rows = vt->rows; @@ -1955,12 +1957,18 @@ .resize = on_resize, }; +/* + * Return the existing state or create a new one. + * Returns NULL when out of memory. + */ VTermState *vterm_obtain_state(VTerm *vt) { if(vt->state) return vt->state; VTermState *state = vterm_state_new(vt); + if (state == NULL) + return NULL; vt->state = state; vterm_parser_set_callbacks(vt, &parser_callbacks, state); === modified file 'src/vterm.c' --- old/src/vterm.c 2020-01-06 14:57:05 +0000 +++ new/src/vterm.c 2021-07-06 15:03:02 +0000 @@ -37,6 +37,9 @@ /* Need to bootstrap using the allocator function directly */ VTerm *vt = (*funcs->malloc)(sizeof(VTerm), allocdata); + if (vt == NULL) + return NULL; + vt->allocator = funcs; vt->allocdata = allocdata; @@ -54,9 +57,19 @@ vt->outbuffer_len = 64; vt->outbuffer_cur = 0; vt->outbuffer = vterm_allocator_malloc(vt, vt->outbuffer_len); + if (vt->outbuffer == NULL) + { + vterm_allocator_free(vt, vt); + return NULL; + } vt->tmpbuffer_len = 64; vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len); + if (vt->tmpbuffer == NULL) + { + vterm_allocator_free(vt, vt); + return NULL; + } return vt; } @@ -80,9 +93,13 @@ return (*vt->allocator->malloc)(size, vt->allocdata); } +/* + * Free "ptr" unless it is NULL. + */ INTERNAL void vterm_allocator_free(VTerm *vt, void *ptr) { - (*vt->allocator->free)(ptr, vt->allocdata); + if (ptr != NULL) + (*vt->allocator->free)(ptr, vt->allocdata); } void vterm_get_size(const VTerm *vt, int *rowsp, int *colsp)