From ff70e7df27a7cfbb4b6f056a69f6b83d6fbddddf Mon Sep 17 00:00:00 2001 From: Chris Cromer Date: Mon, 12 Nov 2018 18:29:51 -0300 Subject: [PATCH 1/2] fix buffer overflow --- src/sort.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/sort.c b/src/sort.c index 4c353cf..4ad975d 100644 --- a/src/sort.c +++ b/src/sort.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "random.h" #include "timer.h" #include "bubble_sort.h" @@ -66,6 +67,34 @@ void print_array(int *array, int n) { fprintf(stdout, "\n\n"); } +/** + * Leer el buffer de stdin y guardar el valor si es numerico + * @param variable Donde se guarda el valor del stdin + * @return Retorna 1 si es exitosa ó 0 si falla + */ +int read_buffer(int *variable) { + char buffer[12]; + while (1) { + if (fgets(buffer, 12, stdin) != NULL) { + if (buffer[strlen(buffer) - 1] == '\n') { + buffer[strlen(buffer) - 1] = '\0'; + break; + } + } + } + char **check = malloc(sizeof(char**)); + long input = strtol(buffer, check, 10); + if (*check[0] == '\0') { + free(check); + *variable = (int) input; + return 1; + } + else { + free(check); + return 0; + } +} + /** * Liberar la memoria al salir */ @@ -180,9 +209,7 @@ int main (int argc, char **argv) { if (elegir) { opt = 0; fprintf(stdout, "Elegir elemento %lli: ", i + 1); - while (!fscanf(stdin, "%d", &opt)) { - // Falló, pide de nuevo después de limpiar stdin - while ((opt = getchar()) != '\n' && opt != EOF) { } + while (!read_buffer(&opt)) { fprintf(stdout, "Número invalido! Tiene que ser mayor de 1!\n"); fprintf(stdout, "Elegir elemento %lli: ", i + 1); } From 9f99802fae0c8632b048c19404efd6f255f8c47d Mon Sep 17 00:00:00 2001 From: Chris Cromer Date: Mon, 12 Nov 2018 18:31:00 -0300 Subject: [PATCH 2/2] show when timer stops --- src/sort.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sort.c b/src/sort.c index 4ad975d..aef6a40 100644 --- a/src/sort.c +++ b/src/sort.c @@ -232,11 +232,12 @@ int main (int argc, char **argv) { // quick sort } else if (algoritmo == 2) { - fprintf(stdout, "Bubble sort corriendo...\n"); + fprintf(stdout, "Bubble sort corriendo... "); fflush(stdout); start_timer(); bubble_sort(array, n); stop_timer(); + fprintf(stdout, "done\n"); } else if (algoritmo == 3) { // bitonic sort