From: pcarana Date: Fri, 29 Mar 2019 21:38:36 +0000 (-0600) Subject: Add some fixes (errors, mem leak, error report PDU) X-Git-Tag: v0.0.2~52^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c71804449b0da4e56df5cbd5b9793dfca8e5c61;p=thirdparty%2FFORT-validator.git Add some fixes (errors, mem leak, error report PDU) -Return errors as negative -Fix mem leak at clients.c -Send received PDU header at error PDU when client session ID doesn't match server's session ID --- diff --git a/src/array_list.h b/src/array_list.h index 882fb52f..ff00c934 100644 --- a/src/array_list.h +++ b/src/array_list.h @@ -48,7 +48,7 @@ * sizeof(elem_type)); \ if (tmp == NULL) { \ warn("Couldn't realloc array"); \ - return errno; \ + return -ENOMEM; \ } \ list->array = tmp; \ } \ diff --git a/src/clients.c b/src/clients.c index 45c9144c..0dcfb8f4 100644 --- a/src/clients.c +++ b/src/clients.c @@ -153,6 +153,7 @@ clients_forget(int fd) read_unlock(&rlock, &wlock, &rcounter); sem_wait(&wlock); + clientsdb_cleanup(&clients_db, client_destroy); clients_db = *new_db; sem_post(&wlock); free(new_db); diff --git a/src/configuration.c b/src/configuration.c index ad4fc2f3..71089aaa 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -348,13 +348,13 @@ init_addrinfo(char const *hostname, char const *service) warnx("Could not infer a bindable address out of address '%s' and port '%s': %s", (hostname != NULL) ? hostname : "any", service, gai_strerror(error)); - return error; + return -error; } config.port = strdup(service); if (config.port == NULL) { warn( "'%s' couldn't be allocated.", OPTNAME_LISTEN_PORT); - return errno; + return -errno; } return 0; diff --git a/src/csv.c b/src/csv.c index ea89100e..00cf962c 100644 --- a/src/csv.c +++ b/src/csv.c @@ -90,7 +90,7 @@ add_vrp(char *line, struct vrplist *vrplist) line_copy = malloc(strlen(line) + 1); if (line_copy == NULL) { - error = errno; + error = -errno; warn("Out of memory allocating CSV line copy"); goto error; } @@ -228,8 +228,9 @@ load_vrps_file(bool check_update, bool *updated) /* Look for the last update date */ error = stat(location, &attr); if (error) { - warn("Couldn't get last modified date of %s, skip update", + warnx("Couldn't get last modified date of %s, skip update", location); + error = -ENOENT; goto end; } diff --git a/src/line_file.c b/src/line_file.c index 923fe0ab..c995e4ba 100644 --- a/src/line_file.c +++ b/src/line_file.c @@ -18,7 +18,6 @@ int lfile_open(const char *file_name, struct line_file **result) { struct line_file *lfile; - int error; lfile = malloc(sizeof(struct line_file)); if (lfile == NULL) @@ -26,9 +25,8 @@ lfile_open(const char *file_name, struct line_file **result) lfile->file = fopen(file_name, "r"); if (lfile->file == NULL) { - error = errno; free(lfile); - return error; + return -errno; } lfile->file_name = file_name; lfile->offset = 0; @@ -59,7 +57,6 @@ lfile_read(struct line_file *lfile, char **result) size_t alloc_len; ssize_t len; ssize_t i; - int error; /* * Note to myself: @@ -99,21 +96,18 @@ lfile_read(struct line_file *lfile, char **result) len = getline(&string, &alloc_len, lfile->file); if (len == -1) { - error = errno; free(string); *result = NULL; if (ferror(lfile->file)) { - warnx("Error while reading file: %s", - strerror(error)); - return error; + warn("Error while reading file"); + return -errno; } if (feof(lfile->file)) return 0; - error = -EINVAL; warnx("Supposedly unreachable code reached. ferror:%d feof:%d", ferror(lfile->file), feof(lfile->file)); - return error; + return -EINVAL; } lfile->offset += len; @@ -125,11 +119,10 @@ lfile_read(struct line_file *lfile, char **result) */ for (i = 0; i < len; i++) { if (string[i] == '\0') { - error = -EINVAL; warnx("File '%s' has an illegal null character in its body. Please remove it.", lfile_name(lfile)); free(string); - return error; + return -EINVAL; } } diff --git a/src/rtr/pdu_handler.c b/src/rtr/pdu_handler.c index f60d08ee..0ec9c4bf 100644 --- a/src/rtr/pdu_handler.c +++ b/src/rtr/pdu_handler.c @@ -65,8 +65,8 @@ handle_serial_query_pdu(int fd, void *pdu) version = received->header.protocol_version; session_id = get_current_session_id(version); if (received->header.session_id != session_id) - return err_pdu_send(fd, version, ERR_PDU_CORRUPT_DATA, NULL, - NULL); + return err_pdu_send(fd, version, ERR_PDU_CORRUPT_DATA, + &received->header, NULL); current_serial = get_last_serial_number(); init_sender_common(&common, fd, version, &session_id, diff --git a/src/rtr/pdu_sender.c b/src/rtr/pdu_sender.c index df4a7ca7..421feddc 100644 --- a/src/rtr/pdu_sender.c +++ b/src/rtr/pdu_sender.c @@ -95,7 +95,7 @@ send_response(int fd, char *data, size_t data_len) free_buffer(&buffer); if (error < 0) { warnx("Error sending response"); - return error; + return -EINVAL; } return 0; @@ -208,7 +208,7 @@ send_payload_pdus(struct sender_common *common) vrps = malloc(sizeof(struct vrp)); if (vrps == NULL) { warn("Couldn't allocate VRPs to send PDUs"); - return -errno; + return -ENOMEM; } len = get_vrps_delta(common->start_serial, common->end_serial, &vrps); if (len == 0) diff --git a/src/rtr/primitive_reader.c b/src/rtr/primitive_reader.c index 2a2e8015..dd264d48 100644 --- a/src/rtr/primitive_reader.c +++ b/src/rtr/primitive_reader.c @@ -16,14 +16,12 @@ read_exact(int fd, unsigned char *buffer, size_t buffer_len) { ssize_t read_result; size_t offset; - int err; for (offset = 0; offset < buffer_len; offset += read_result) { read_result = read(fd, &buffer[offset], buffer_len - offset); if (read_result == -1) { - err = errno; warn("Client socket read interrupted"); - return err; + return -errno; } if (read_result == 0) { warnx("Stream ended mid-PDU.");