diff --git a/src/geonames.c b/src/geonames.c index 73b3db32..1bf9e42f 100644 --- a/src/geonames.c +++ b/src/geonames.c @@ -23,6 +23,10 @@ */ geoname_t *geoname_new(void) { geoname_t *self = malloc(sizeof(geoname_t)); + if (self == NULL) { + return NULL; + } + self->name = char_array_new_size(GEONAMES_NAME_DEFAULT_LENGTH); self->canonical = char_array_new_size(GEONAMES_NAME_DEFAULT_LENGTH); @@ -36,6 +40,14 @@ geoname_t *geoname_new(void) { self->admin3_code = char_array_new_size(GEONAMES_ADMIN3_CODE_DEFAULT_LENGTH); self->admin4_code = char_array_new_size(GEONAMES_ADMIN4_CODE_DEFAULT_LENGTH); + if (!(self->name && self->canonical && self->iso_language + && self->feature_code && self->country_code + && self->admin1_code && self->admin2_code + && self->admin3_code && self->admin4_code)) { + geoname_destroy(self); + return NULL; + } + return self; } @@ -273,6 +285,10 @@ void geoname_print(geoname_t *self) { gn_postal_code_t *gn_postal_code_new(void) { gn_postal_code_t *self = malloc(sizeof(gn_postal_code_t)); + if (self == NULL) { + return NULL; + } + self->postal_code = char_array_new_size(GEONAMES_POSTAL_CODE_DEFAULT_LENGTH); self->country_code = char_array_new_size(GEONAMES_COUNTRY_CODE_DEFAULT_LENGTH); self->containing_geoname = char_array_new_size(GEONAMES_NAME_DEFAULT_LENGTH); @@ -284,6 +300,12 @@ gn_postal_code_t *gn_postal_code_new(void) { self->admin2_ids = uint32_array_new_size(GEONAMES_POSTAL_ADMIN2_IDS_DEFAULT_LENGTH); self->admin3_ids = uint32_array_new_size(GEONAMES_POSTAL_ADMIN3_IDS_DEFAULT_LENGTH); + if (!(self->postal_code && self->country_code && self->containing_geoname + && self->admin1_ids && self->admin2_ids && self->admin3_ids)) { + gn_postal_code_destroy(self); + return NULL; + } + return self; } diff --git a/src/numex.c b/src/numex.c index 661b1b4a..7fa7fca7 100644 --- a/src/numex.c +++ b/src/numex.c @@ -146,6 +146,9 @@ static numex_language_t *numex_language_read(FILE *f) { } char *name = malloc(lang_name_len); + if (name == NULL) { + return NULL; + } if (!file_read_chars(f, name, lang_name_len)) { return NULL; @@ -326,6 +329,9 @@ static ordinal_indicator_t *ordinal_indicator_read(FILE *f) { } char *key = malloc(key_len); + if (key == NULL) { + return NULL; + } if (!file_read_chars(f, key, key_len)) { return NULL; @@ -347,6 +353,9 @@ static ordinal_indicator_t *ordinal_indicator_read(FILE *f) { } char *ordinal_suffix = malloc(ordinal_suffix_len); + if (ordinal_suffix == NULL) { + return NULL; + } if (!file_read_chars(f, ordinal_suffix, ordinal_suffix_len)) { return NULL; diff --git a/src/trie.c b/src/trie.c index 40d8e652..f9206de8 100644 --- a/src/trie.c +++ b/src/trie.c @@ -26,8 +26,6 @@ uint8_t DEFAULT_ALPHABET[] = { 13, 17, 21, 25, 29, 210, 214, 93, 222, 234, 238, 242, 246, 250, 125, 255 }; -#define DEFAULT_ALPHABET_SIZE sizeof(DEFAULT_ALPHABET) - /* Constructors @@ -1016,7 +1014,7 @@ trie_t *trie_read(FILE *file) { uint32_t num_keys; if (!file_read_uint32(file, &num_keys)) { - goto exit_file_read; + goto exit_trie_created; } trie->num_keys = num_keys; @@ -1037,6 +1035,9 @@ trie_t *trie_read(FILE *file) { unsigned char *buf; size_t buf_size = num_nodes * sizeof(uint32_t) * 2; buf = malloc(buf_size); + if (buf == NULL) { + goto exit_trie_created; + } unsigned char *buf_ptr;