Messages in this thread | | | From | Steve Magnani <> | Subject | [PATCH 0/1] udf: Incorrect final NOT_ALLOCATED (hole) extent length | Date | Tue, 4 Jun 2019 07:31:57 -0500 |
| |
The following script reveals some errors in the final NOT_RECORDED_NOT_ALLOCATED extent of a file following use of truncate(1) to extend the file by adding or manipulating a hole at the end.
The script produces the following output:
Now testing NOT ALLOCATED extent. Testing 0 --> 300 : FAILED - bad extent type/length: expected 8000012C, actual 80000200 Testing 300 --> 301 : PASSED Testing 301 --> 302 : FAILED - bad extent type/length: expected 8000012E, actual 8000012D Testing 302 --> 511 : FAILED - bad extent type/length: expected 800001FF, actual 8000012D Testing 511 --> 512 : FAILED - bad extent type/length: expected 80000200, actual 8000012D Testing 512 --> 513 : FAILED - bad extent type/length: expected 80000201, actual 80000400 Testing 513 --> 514 : PASSED Testing 514 --> 1023 : FAILED - bad extent type/length: expected 800003FF, actual 80000202 Testing 1023 --> 1024 : FAILED - bad extent type/length: expected 80000400, actual 80000202 Testing 1024 --> 1026 : FAILED - bad extent type/length: expected 80000402, actual 80000600 Testing 1026 --> 1538 : FAILED - bad extent type/length: expected 80000602, actual 80000800 Testing 1538 --> 4096 : PASSED Testing 4096 --> 0 : PASSED Testing 0 --> 4096 : PASSED Testing 4096 --> 0 : PASSED Testing 0 --> 4097 : FAILED - bad extent type/length: expected 80001001, actual 80001200 Testing 4097 --> 0 : PASSED
Now testing RECORDED extent. Testing 512 --> 512 : PASSED Testing 512 --> 511 : PASSED Testing 511 --> 300 : PASSED Testing 300 --> 512 : FAILED - bad extent type/length: expected 00000200, actual 0000012C
Now testing NOT ALLOCATED beyond RECORDED. Testing 512 --> 513 : FAILED - bad extent type/length: expected 00000200 80000001, actual 00000200 80000200 Testing 513 --> 512 : PASSED Testing 512 --> 300 : PASSED Testing 300 --> 513 : FAILED - bad extent type/length: expected 00000200 80000001, actual 00000200 80000200 Testing 513 --> 300 : PASSED Testing 300 --> 1538 : FAILED - bad extent type/length: expected 00000200 80000402, actual 00000200 80000600 Testing 1538 --> 0 : PASSED
Now testing multiple NOT ALLOCATED. Testing 0 --> 1073741312 : PASSED Testing 1073741312 --> 0 : PASSED Testing 0 --> 1073741313 : FAILED - bad extent type/length: expected BFFFFE00 80000001, actual BFFFFE00 80000200 Testing 1073741313 --> 0 : PASSED Testing 0 --> 1073741824 : PASSED
#!/bin/bash
FS_SIZE=256K FS_FILE=/tmp/test.udf MNT=/mnt ICB_LSN=261 XXD=/usr/bin/xxd
truncate_test() { local prev_size=`ls -l ${MNT}/truncate.test | cut -d' ' -f5` printf "Testing %4u --> %4u : " $prev_size $1 truncate --size=$1 ${MNT}/truncate.test sync local new_size=`ls -l ${MNT}/truncate.test | cut -d' ' -f5`
if [ $new_size -ne $1 ] ; then echo FAILED - bad information length else local ext_type_and_len=`dd if=${FS_FILE} skip=${ICB_LSN} count=1 2> /dev/null | dd bs=1 skip=216 count=4 2> /dev/null | ${XXD} -g4 -e -u | cut -c11-18` if [ "$ext_type_and_len" = "$2" ] ; then if [ -z "$3" ] ; then echo PASSED else ext_type_and_len=`dd if=${FS_FILE} skip=${ICB_LSN} count=1 2> /dev/null | dd bs=1 skip=232 count=4 2> /dev/null | ${XXD} -g4 -e -u | cut -c11-18` if [ "$ext_type_and_len" = "$3" ] ; then echo PASSED else echo FAILED - bad extent type/length: expected $2 $3, actual $2 $ext_type_and_len fi fi else echo FAILED - bad extent type/length: expected $2, actual $ext_type_and_len fi fi }
### MAIN
rm -f $FS_FILE
truncate --size=${FS_SIZE} $FS_FILE mkudffs --label=TRUNCATE --media-type=hd --uid=1000 --gid=1000 $FS_FILE > /dev/null echo -n Mounting test filesystem... sudo mount $FS_FILE $MNT -o loop echo touch ${MNT}/truncate.test
echo echo Now testing NOT ALLOCATED extent. truncate_test 300 8000012C truncate_test 301 8000012D truncate_test 302 8000012E truncate_test 511 800001FF truncate_test 512 80000200 truncate_test 513 80000201 truncate_test 514 80000202 truncate_test 1023 800003FF truncate_test 1024 80000400 truncate_test 1026 80000402 truncate_test 1538 80000602 truncate_test 4096 80001000 truncate_test 0 00000000 truncate_test 4096 80001000 truncate_test 0 00000000 truncate_test 4097 80001001 truncate_test 0 00000000
dd if=/dev/zero of=${MNT}/truncate.test bs=512 count=1 2> /dev/null echo echo Now testing RECORDED extent. truncate_test 512 00000200 truncate_test 511 000001FF truncate_test 300 0000012C truncate_test 512 00000200 echo echo Now testing NOT ALLOCATED beyond RECORDED. truncate_test 513 00000200 80000001 truncate_test 512 00000200 00000000 truncate_test 300 0000012C truncate_test 513 00000200 80000001 truncate_test 300 0000012C 00000000 truncate_test 1538 00000200 80000402 truncate_test 0 00000000
echo echo Now testing multiple NOT ALLOCATED. truncate_test 1073741312 BFFFFE00 truncate_test 0 00000000 truncate_test 1073741313 BFFFFE00 80000001 truncate_test 0 00000000 truncate_test 1073741824 BFFFFE00 80000200
sudo umount $FS_FILE
------------------------------------------------------------------------ Steven J. Magnani "I claim this network for MARS! www.digidescorp.com Earthling, return my space modulator!"
#include <standard.disclaimer>
| |