From: dhfelix Date: Sat, 28 Nov 2020 01:03:21 +0000 (-0600) Subject: Force to stop application on ENOMEM error X-Git-Tag: v1.5.0~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad841d50;p=thirdparty%2FFORT-validator.git Force to stop application on ENOMEM error discussed in #40 --- diff --git a/src/asn1/decode.c b/src/asn1/decode.c index f4703d1d..4e9b2437 100644 --- a/src/asn1/decode.c +++ b/src/asn1/decode.c @@ -96,6 +96,9 @@ asn1_decode(const void *buffer, size_t buffer_size, rval = ber_decode(&s_codec_ctx, descriptor, result, buffer, buffer_size); if (rval.code != RC_OK) { + if (rval.code == RC_FAIL && errno == ENOMEM) + pr_enomem(); + /* Must free partial object according to API contracts. */ ASN_STRUCT_FREE(*descriptor, *result); /* We expect the data to be complete; RC_WMORE is an error. */ diff --git a/src/log.c b/src/log.c index f5d8c7a9..2e797777 100644 --- a/src/log.c +++ b/src/log.c @@ -462,6 +462,9 @@ pr_errno(int error, bool syslog_enabled, bool fprintf_enabled, int facility, int pr_op_errno(int error, const char *format, ...) { + if (abs(error) == ENOMEM) + pr_enomem(); + PR_OP_SIMPLE(LOG_ERR); return pr_errno(error, op_syslog_enabled, @@ -473,6 +476,9 @@ pr_op_errno(int error, const char *format, ...) int pr_val_errno(int error, const char *format, ...) { + if (abs(error) == ENOMEM) + pr_enomem(); + PR_VAL_SIMPLE(LOG_ERR); return pr_errno(error, val_syslog_enabled, @@ -592,7 +598,8 @@ pr_enomem(void) __fprintf(LOG_ERR, config_get_op_log_tag(), config_get_op_log_color_output(), "Out of memory.\n"); - return -ENOMEM; + print_stack_trace(); + exit(ENOMEM); } /** diff --git a/src/rsync/rsync.c b/src/rsync/rsync.c index a6b01bfe..6332192d 100644 --- a/src/rsync/rsync.c +++ b/src/rsync/rsync.c @@ -446,6 +446,9 @@ do_rsync(struct rpki_uri *uri, bool is_ta, bool log_operation) /* Happy path (but also sad path sometimes). */ error = WEXITSTATUS(child_status); pr_val_debug("Child terminated with error code %d.", error); + if (error == ENOMEM) + pr_enomem(); + if (!error) goto release_args; diff --git a/src/rtr/pdu_handler.c b/src/rtr/pdu_handler.c index de9f45a3..6c8bbd4a 100644 --- a/src/rtr/pdu_handler.c +++ b/src/rtr/pdu_handler.c @@ -67,6 +67,7 @@ handle_serial_query_pdu(int fd, struct rtr_request const *request) error = send_cache_reset_pdu(fd, version); goto end; case -ENOMEM: /* Memory allocation failure */ + pr_enomem(); goto end; case EAGAIN: /* Too many threads */ /*