From 6716b5580af841c379edbdd1ba2a558ebce0cb58 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sun, 4 Feb 2018 13:48:44 -0600 Subject: [PATCH] Fixed error check when truncating files to larger size --- lfs.c | 2 +- tests/test_truncate.sh | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lfs.c b/lfs.c index 514a85b..1e490c0 100644 --- a/lfs.c +++ b/lfs.c @@ -1694,7 +1694,7 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { // flush+seek if not already at end if (file->pos != oldsize) { int err = lfs_file_seek(lfs, file, 0, SEEK_END); - if (err) { + if (err < 0) { return err; } } diff --git a/tests/test_truncate.sh b/tests/test_truncate.sh index 1da0cce..da5ccaf 100755 --- a/tests/test_truncate.sh +++ b/tests/test_truncate.sh @@ -13,10 +13,12 @@ TEST truncate_test() { STARTSIZES="$1" -HOTSIZES="$2" -COLDSIZES="$3" +STARTSEEKS="$2" +HOTSIZES="$3" +COLDSIZES="$4" tests/test.py << TEST static const lfs_off_t startsizes[] = {$STARTSIZES}; + static const lfs_off_t startseeks[] = {$STARTSEEKS}; static const lfs_off_t hotsizes[] = {$HOTSIZES}; lfs_mount(&lfs, &cfg) => 0; @@ -33,6 +35,11 @@ tests/test.py << TEST } lfs_file_size(&lfs, &file[0]) => startsizes[i]; + if (startseeks[i] != startsizes[i]) { + lfs_file_seek(&lfs, &file[0], + startseeks[i], LFS_SEEK_SET) => startseeks[i]; + } + lfs_file_truncate(&lfs, &file[0], hotsizes[i]) => 0; lfs_file_size(&lfs, &file[0]) => hotsizes[i]; @@ -107,18 +114,21 @@ TEST echo "--- Cold shrinking truncate ---" truncate_test \ + "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" echo "--- Cold expanding truncate ---" truncate_test \ + " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" echo "--- Warm shrinking truncate ---" truncate_test \ + "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ " 0, 0, 0, 0, 0" @@ -126,6 +136,21 @@ truncate_test \ echo "--- Warm expanding truncate ---" truncate_test \ " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ + " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ + "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ + "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" + +echo "--- Mid-file shrinking truncate ---" +truncate_test \ + "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ + " $LARGESIZE, $LARGESIZE, $LARGESIZE, $LARGESIZE, $LARGESIZE" \ + " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ + " 0, 0, 0, 0, 0" + +echo "--- Mid-file expanding truncate ---" +truncate_test \ + " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \ + " 0, 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE" \ "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \ "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE"