Переглянути джерело

Fixed error check when truncating files to larger size

Christopher Haster 7 роки тому
батько
коміт
6716b5580a
2 змінених файлів з 28 додано та 3 видалено
  1. 1 1
      lfs.c
  2. 27 2
      tests/test_truncate.sh

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

+ 27 - 2
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"