From 18d08023458b475bbd6734ece3b428166f74a8f3 Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Sat, 17 Jan 2009 10:43:57 +0000 Subject: [PATCH] 1.0.24.45: handle IO errors in LDB and when saving the core * In LDB, if users response cannot be read, assume y. * Check fwrite() called when saving the core, and report the error. * Patch by Daniel Lowe. --- src/runtime/monitor.c | 8 ++++++-- src/runtime/print.c | 13 ++++++++----- src/runtime/save.c | 30 +++++++++++++++++++++++------- version.lisp-expr | 2 +- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index ce0ef79..9d17508 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -302,9 +302,13 @@ quit_cmd(char **ptr) printf("Really quit? [y] "); fflush(stdout); - fgets(buf, sizeof(buf), ldb_in); - if (buf[0] == 'y' || buf[0] == 'Y' || buf[0] == '\n') + if (fgets(buf, sizeof(buf), ldb_in)) { + if (buf[0] == 'y' || buf[0] == 'Y' || buf[0] == '\n') + exit(1); + } else { + printf("\nUnable to read response, assuming y.\n"); exit(1); + } } static void diff --git a/src/runtime/print.c b/src/runtime/print.c index 73ec03b..833ec91 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -195,12 +195,15 @@ static boolean continue_p(boolean newline) printf("More? [y] "); fflush(stdout); - fgets(buffer, sizeof(buffer), stdin); - - if (buffer[0] == 'n' || buffer[0] == 'N') - throw_to_monitor(); - else + if (fgets(buffer, sizeof(buffer), stdin)) { + if (buffer[0] == 'n' || buffer[0] == 'N') + throw_to_monitor(); + else + cur_lines = 0; + } else { + printf("\nUnable to read response, assuming y.\n"); cur_lines = 0; + } } } diff --git a/src/runtime/save.c b/src/runtime/save.c index 20d72d7..635bf498 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -56,13 +56,18 @@ write_runtime_options(FILE *file, struct runtime_options *options) optarray[3] = options->thread_control_stack_size; } - fwrite(optarray, sizeof(size_t), RUNTIME_OPTIONS_WORDS, file); + if (RUNTIME_OPTIONS_WORDS != + fwrite(optarray, sizeof(size_t), RUNTIME_OPTIONS_WORDS, file)) { + perror("Error writing runtime options to file"); + } } static void write_lispobj(lispobj obj, FILE *file) { - fwrite(&obj, sizeof(lispobj), 1, file); + if (1 != fwrite(&obj, sizeof(lispobj), 1, file)) { + perror("Error writing to file"); + } } static long @@ -354,9 +359,13 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function, write_runtime_options(file, (save_runtime_options ? runtime_options : NULL)); - fwrite(&core_start_pos, sizeof(os_vm_offset_t), 1, file); - write_lispobj(CORE_MAGIC, file); - fclose(file); + if (1 != fwrite(&core_start_pos, sizeof(os_vm_offset_t), 1, file)) { + perror("Error writing core starting position to file"); + fclose(file); + } else { + write_lispobj(CORE_MAGIC, file); + fclose(file); + } #ifndef LISP_FEATURE_WIN32 if (make_executable) @@ -416,13 +425,20 @@ save_runtime_to_filehandle(FILE *output, void *runtime, size_t runtime_size) size_t padding; void *padbytes; - fwrite(runtime, 1, runtime_size, output); + if (runtime_size != fwrite(runtime, 1, runtime_size, output)) { + perror("Error saving runtime"); + return 0; + } padding = (os_vm_page_size - (runtime_size % os_vm_page_size)) & ~os_vm_page_size; if (padding > 0) { padbytes = successful_malloc(padding); memset(padbytes, 0, padding); - fwrite(padbytes, 1, padding, output); + if (padding != fwrite(padbytes, 1, padding, output)) { + perror("Error saving runtime"); + free(padbytes); + return 0; + } free(padbytes); } diff --git a/version.lisp-expr b/version.lisp-expr index ca2be36..b43f299 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.24.44" +"1.0.24.45" -- 1.7.10.4