diff options
| -rw-r--r-- | driver-csi.c | 9 | ||||
| -rw-r--r-- | driver-ti.c | 9 | ||||
| -rw-r--r-- | termkey.c | 21 | 
3 files changed, 34 insertions, 5 deletions
| diff --git a/driver-csi.c b/driver-csi.c index be709a3..3803c30 100644 --- a/driver-csi.c +++ b/driver-csi.c @@ -37,6 +37,8 @@ static void *new_driver(termkey_t *tk, const char *term)    // Excellent - we'll continue    termkey_csi *csi = malloc(sizeof *csi); +  if(!csi) +    return NULL;    csi->tk = tk; @@ -51,6 +53,8 @@ static void *new_driver(termkey_t *tk, const char *term)    csi->ncsifuncs = 32;    csi->csifuncs = malloc(sizeof(csi->csifuncs[0]) * csi->ncsifuncs); +  if(!csi->csifuncs) +    goto abort_free_csi;    for(i = 0; i < csi->ncsifuncs; i++)      csi->csifuncs[i].sym = TERMKEY_SYM_UNKNOWN; @@ -119,6 +123,11 @@ static void *new_driver(termkey_t *tk, const char *term)    register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 20, 34, NULL);    return csi; + +abort_free_csi: +  free(csi); + +  return NULL;  }  static void free_driver(void *private) diff --git a/driver-ti.c b/driver-ti.c index 66cdbe7..00090bd 100644 --- a/driver-ti.c +++ b/driver-ti.c @@ -33,6 +33,8 @@ static void *new_driver(termkey_t *tk, const char *term)      return NULL;    termkey_ti *ti = malloc(sizeof *ti); +  if(!ti) +    return NULL;    ti->tk = tk; @@ -40,6 +42,8 @@ static void *new_driver(termkey_t *tk, const char *term)    ti->nseqs = 0;    ti->seqs = malloc(ti->alloced_seqs * sizeof(ti->seqs[0])); +  if(!ti->seqs) +    goto abort_free_ti;    int i;    for(i = 0; strfnames[i]; i++) { @@ -64,6 +68,11 @@ static void *new_driver(termkey_t *tk, const char *term)    }    return ti; + +abort_free_ti: +  free(ti); + +  return NULL;  }  static void free_driver(void *private) @@ -96,10 +96,8 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)    tk->flags = flags;    tk->buffer = malloc(buffsize); -  if(!tk->buffer) { -    free(tk); -    return NULL; -  } +  if(!tk->buffer) +    goto abort_free_tk;    tk->buffstart = 0;    tk->buffcount = 0; @@ -113,6 +111,8 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)    tk->nkeynames = 64;    tk->keynames = malloc(sizeof(tk->keynames[0]) * tk->nkeynames); +  if(!tk->keynames) +    goto abort_free_buffer;    int i;    for(i = 0; i < tk->nkeynames; i++) @@ -147,7 +147,7 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)    if(!tk->driver_info) {      fprintf(stderr, "Unable to find a terminal driver\n"); -    return NULL; +    goto abort_free_keynames;    }    if(!(flags & TERMKEY_FLAG_NOTERMIOS)) { @@ -164,6 +164,17 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)    }    return tk; + +abort_free_keynames: +  free(tk->keynames); + +abort_free_buffer: +  free(tk->buffer); + +abort_free_tk: +  free(tk); + +  return NULL;  }  termkey_t *termkey_new(int fd, int flags) | 
