Commit 18d08023 authored by Nikodemus Siivola's avatar Nikodemus Siivola
Browse files

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.
parent c1c2f11c
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -302,9 +302,13 @@ quit_cmd(char **ptr)

    printf("Really quit? [y] ");
    fflush(stdout);
    fgets(buf, sizeof(buf), ldb_in);
    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
+8 −5
Original line number Diff line number Diff line
@@ -195,12 +195,15 @@ static boolean continue_p(boolean newline)
            printf("More? [y] ");
            fflush(stdout);

            fgets(buffer, sizeof(buffer), stdin);

            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;
            }
        }
    }

+23 −7
Original line number Diff line number Diff line
@@ -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);
    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);
    }

+1 −1
Original line number Diff line number Diff line
@@ -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"