diff -ur bcrypt-master-old/src/includes.h bcrypt-master/src/includes.h --- bcrypt-master-old/src/includes.h 2013-01-30 15:24:23.000000000 +0700 +++ bcrypt-master/src/includes.h 2015-04-19 13:44:23.000000000 +0700 @@ -22,4 +22,4 @@ #include #include #include - +#include diff -ur bcrypt-master-old/src/rwfile.c bcrypt-master/src/rwfile.c --- bcrypt-master-old/src/rwfile.c 2013-01-30 15:24:23.000000000 +0700 +++ bcrypt-master/src/rwfile.c 2015-04-19 13:42:10.000000000 +0700 @@ -21,44 +21,31 @@ return(r); } +/* I modified this function for low level file I/O because Linux OS buffering + wasn't commiting data written prior to deletion. The net result was that + the file being deleted WAS NOT overwrtten with random data before + deletion. - jafadmin +*/ int deletefile(char *file, BCoptions options, char *key, struct stat statbuf) { - int lsize; - long g; - uLong j = 0, k = 0; - signed char i; - char *state, *garbage; - FILE *fd; + int j, fd; signed char i; char ch = 0; - if (options.securedelete > 0) { - lsize = sizeof(long); - k = (statbuf.st_size / lsize) + 1; - if ((state = malloc(257)) == NULL) - memerror(); - - initstate((unsigned long) key, state, 256); - if ((garbage = malloc(lsize)) == NULL) - memerror(); - - fd = fopen(file, "r+b"); - if (!fd) { - fprintf(stderr, "Error deleting file %s: %s\n", file, strerror(errno)); - return(1); - } - for (i = options.securedelete; i > 0; i--) { - fseek(fd, 0, SEEK_SET); - - for (j = 0; j < k; j += lsize) { - g = random(); - memcpy(garbage, &g, lsize); - fwrite(garbage, lsize, 1, fd); - } - fflush(fd); + if (options.securedelete > 0) + { + for (i = options.securedelete; i > 0; i--) + { + fd = open(file, O_WRONLY); + for (j = 0; j < statbuf.st_size; j++) + { + ch = random(); + write(fd, &ch, 1); + } + fsync(fd); + close(fd); } - fclose(fd); } if (unlink(file)) { - fprintf(stderr, "Error deleting file %s: %s\n", file, strerror(errno)); + fprintf(stderr, "Error deleting file %s\n", file); return(1); } return(0);