LINUX.ORG.RU

fsck_udf из netbsd падает на моей машине

 


0

1

в связи с завозом в netbsd 10 (current) поддержки udf 2.50 для makefs/fsck решил собрать утилитки под Linux/termux

https://github.com/Randrianasulu/fsck_udf https://github.com/Randrianasulu/makefs_termux

оно вроде собирается и даже работает, но на моей Франкенслаке почему-то падает fsck. Разработчик любезно глянул в мой хак, и лог gdb но там похоже что-то не инициализируется нормально - я могу обойти краш но при этом fsck начинает ругаться на файл образ созданный makefs…

кто-нибудь может собрать на разных линуксах и попробовать создать образ

makefs -o v=2.50,V=2.50 image.udf tree/

и проверить его?

fsck_udf image.udf

падает так:

(gdb) run ../makefs_termux-main/test.disk
Starting program: /home/guest/fsck_udf-main/fsck_udf ../makefs_termux-main/test.disk
** Checking UDF file system on ../makefs_termux-main/test.disk
** Phase 1 - discovering format from disc

Filesystem sectorsize is 512 bytes.

Volume set       `626424902ae528dd`
Primary volume   `0f20d23b`
Logical volume   `anonymous`
Bad descriptor sum in vds, ignoring
Unknown VDS type 59256 found, ignored

Minimum read  version v2.50
Minimum write version v2.50
Maximum write version v2.50

Last logical volume integrity state is CLOSED.
Format flags


Program received signal SIGSEGV, Segmentation fault.
0x080587e0 in udf_translate_vtop (lb_num=24, vpart=1, lb_numres=0xffffd6e4, extres=0xffffd6e0) at udf_core.c:3967
3967                    l_ea = udf_rw32(efe->l_ea);
(gdb) bt full
#0  0x080587e0 in udf_translate_vtop (lb_num=24, vpart=1,
    lb_numres=0xffffd6e4, extres=0xffffd6e0) at udf_core.c:3967
        pdesc = 0x0
        sme = 0x1
        short_ad = 0xf7e2e740 <main_arena>
        efe = 0x0
        ext = 2147483647
        len = 32
        lb_rel = 0
        lb_packet = 528
        vat_off = 8
        start_lb = 2004
        lb_offset = 1
        end_lb_offset = 110
        udf_rw32_lbmap = 34
        flags = 134635536
        vat_pos = 0xf7e2eaf0 <main_arena+944> "\350\352\342\367\350\352\342\367\330;\a\b\330;\a\b\370\352\342\367\370\352\342\367"
        data_pos = 0x7 <error: Cannot access memory at address 0x7>
        dscr_size = 216
        l_ea = 1
        l_ad = 92
        icbflags = 0
        addr_type = -136124608
        rel = 57
        part = 1
#1  0x08058a3e in udf_read_virt (blob=0x806f4f0, location=24,
    vpart=1, sectors=1) at udf_core.c:4072
        phys = 10
        ext = 134635936
        data = 0x806f4f0 ""
        error = -136126464
#2  0x08058ec4 in udf_read_dscr_virt (sector=24, vpart=1,
    dstp=0xffffd768) at udf_core.c:4218
        dst = 0x806f4f0
        new_dst = 0x0
--Type <RET> for more, q to quit, c to continue without paging--
        pos = 0x805c580 "\nLast logical volume integrity state is %s.\n"
        sectors = 4294956868
        dscrlen = 512
        sector_size = 512
        error = 0
        __PRETTY_FUNCTION__ = "udf_read_dscr_virt"
#3  0x0804d18b in udf_read_metadata_nodes (mapping=0x806edde,
    log_part=1) at main.c:2342
        dscr1 = 0x0
        dscr2 = 0x0
        dscr3 = 0x0
        pmm = 0x806edde
        raw_phys_part = 0
        phys_part = 1
        tagid = -136123104
        file_type = -137605021
        error = 0
#4  0x0804da31 in udf_process_vds () at main.c:2648
        dscr = 0xf7e2e000
        mapping = 0x806edde
        pdesc = 0xffffd908
        fsd_loc = {len = 134536814, loc = {lb_num = 134672064,
            part_num = 61440}, impl = {bytes = "\006\b;\214\317\367",
            im_used = {flags = 2054, unique_id = 4157574203}}}
        pmap_pos = 0x806edde "\002@"
        domain_name = 0x806ecf9 "*OSTA UDF Compliant"
        map_name = 0x806ede3 "*UDF Metadata PartitionP\002\004\b"
        check_name = 0x805cd3f "*UDF Metadata Partition"
        pmap_stype = 2
        pmap_size = 64
        pmap_type = 4
        log_part = 1
        phys_part = 1
        raw_phys_part = 0
        n_pm = 2
--Type <RET> for more, q to quit, c to continue without paging--
        n_phys = 1
        n_virt = 0
        n_spar = 0
        n_meta = 1
        len = 23
        error = 134537169
#5  0x0804e1f8 in udf_check_VDS_areas () at main.c:2863
        vds1_buf = 0x80667f0
        vds2_buf = 0x806e800
        vds1_size = 32768
        vds2_size = 32768
        error = -9760
        error1 = 0
        error2 = 0
        __PRETTY_FUNCTION__ = "udf_check_VDS_areas"
#6  0x08051495 in checkfilesys (
    given_dev=0xffffdc0c "../makefs_termux-main/test.disk")
    at main.c:4310
        ti = {tracknr = 1, sessionnr = 1, track_mode = 0 '\000',
          data_mode = 0 '\000', flags = 192, track_start = 0,
          next_writable = 97856, free_blocks = 0, packet_size = 1,
          track_size = 97855, last_recorded = 97856}
        open_flags = 2
        error = 0
#7  0x080517ca in main (argc=0, argv=0xffffda8c) at main.c:4451
        ret = 0
        erg = -134356912
        ch = -1
(gdb)
★★★★★

Последнее исправление: Andrew-R (всего исправлений: 2)

вот хак

guest@slax:~/fsck_udf-main$ diff -u udf_core.c.orig udf_core.c
--- udf_core.c.orig     2022-04-24 09:14:57.889019304 +0300
+++ udf_core.c  2022-04-24 09:21:14.641033960 +0300
@@ -3963,6 +3963,8 @@

                /* get first overlapping extent */
                efe = context.meta_file;
+               if (efe == 0)
+               return EINVAL;
                dscr_size = sizeof(struct extfile_entry) - 1;
                l_ea = udf_rw32(efe->l_ea);
                l_ad = udf_rw32(efe->l_ad);
guest@slax:~/fsck_udf-main$

после него ругается так:


<$ ./fsck_udf ../makefs_termux-main/test.disk
** Checking UDF file system on ../makefs_termux-main/test.disk
** Phase 1 - discovering format from disc

Filesystem sectorsize is 512 bytes.

Volume set       `626424902ae528dd`
Primary volume   `0f20d23b`
Logical volume   `anonymous`
Bad descriptor sum in vds, ignoring
Unknown VDS type 22392 found, ignored

Minimum read  version v2.50
Minimum write version v2.50
Maximum write version v2.50

Last logical volume integrity state is CLOSED.
Format flags

Bad primary metadata file descriptor
Bad mirror metadata file descriptor
No valid metadata file descriptors found!
Couldn't read in the metadata descriptors
Failure reading volume descriptors, disc might be toast
Andrew-R ★★★★★
() автор топика

Linux 5.17.4, libbsd 0.11.6

пустой образ создан с помощью mkfs.udf:

** Checking UDF file system on image
** Phase 1 - discovering format from disc

Filesystem sectorsize is 2048 bytes.

Volume set       `626506527da8f8b9LinuxUDF`
Primary volume   `LinuxUDF`
Logical volume   `LinuxUDF`
Bad descriptor sum in vds, ignoring
Bad descriptor CRC in vds, ignoring
Unknown VDS type 6912 found, ignored
Bad descriptor CRC in vds, ignoring

Minimum read  version v2.50
Minimum write version v2.50
Maximum write version v2.50

Last logical volume integrity state is OPEN.
Format flags

Full VAT range search from 0 to 4194304
        Checking range  4194288 to  4194304
malloc(): invalid size (unsorted)
zsh: IOT instruction (core dumped)  ./fsck_udf image

образ создан вышеуказанным makefs проверяется без проблем.

** Checking UDF file system on image
** Phase 1 - discovering format from disc

Filesystem sectorsize is 512 bytes.

Volume set       `626507c625b1304c`
Primary volume   `50a319c4`
Logical volume   `anonymous`
Bad descriptor sum in vds, ignoring
Bad descriptor CRC in vds, ignoring
Unknown VDS type 2816 found, ignored

Minimum read  version v2.50
Minimum write version v2.50
Maximum write version v2.50

Last logical volume integrity state is CLOSED.
Format flags


** File system is clean; not checking

Если нужны дополнительные сведения - напишите. Ещё могу проверить с реальными ФС на дисках, которые создавались другой реализацией UDF.

token_polyak ★★★★★
()
Последнее исправление: token_polyak (всего исправлений: 2)
Ответ на: комментарий от Andrew-R

почему-то падает fsck. Разработчик любезно глянул в мой хак, и лог gdb но там похоже что-то не инициализируется нормально - я могу обойти краш но при этом fsck начинает ругаться на файл образ созданный makefs…

вот хак

Это не хак, это то что там должно и так было быть. fsck не должен падать ни на каких входных данных, сколь угодно битыми они бы ни были.

firkax ★★★★★
()
Ответ на: комментарий от token_polyak

вот почему-то на термуксе (arm32/ android 10) оно не ругается и не падает…

$ mkfs.udf lin.udf 1000 -m bdr
filename=lin.udf
label=LinuxUDF
uuid=62657cc65cc3c9ab
blocksize=2048
blocks=1000
udfrev=2.50
vatblock=319
start=0, blocks=16, type=RESERVED
start=16, blocks=4, type=VRS
start=20, blocks=76, type=USPACE
start=96, blocks=16, type=MVDS
start=112, blocks=16, type=USPACE
start=128, blocks=1, type=LVID
start=129, blocks=95, type=USPACE
start=224, blocks=16, type=RVDS
start=240, blocks=16, type=USPACE
start=256, blocks=1, type=ANCHOR
start=257, blocks=31, type=USPACE
start=288, blocks=704, type=PSPACE
start=992, blocks=8, type=USPACE
$ cd udffsck/
$ ./fsck_udf ../lin.udf
** Checking UDF file system on ../lin.udf
** Phase 1 - discovering format from disc

Filesystem sectorsize is 2048 bytes.

Volume set       `62657cc65cc3c9abLinuxUDF`
Primary volume   `LinuxUDF`
Logical volume   `LinuxUDF`

Minimum read  version v2.50
Minimum write version v2.50
Maximum write version v2.50

Last logical volume integrity state is OPEN.
Format flags

Full VAT range search from 0 to 320
        Checking range      304 to      320

        Found VAT timestamped at Apr 24 18:37
        Logical volume integrity state set to CLOSED


** File system is clean; not checking

$
Andrew-R ★★★★★
() автор топика
Ответ на: комментарий от Andrew-R

i686, Linux 5.15.22-1.1-lts, 0.11.5-1.0 - с образом созданным mkfs.udf вылетает с сегфолтом, makefs -

malloc(): invalid size (unsorted)
zsh: IOT instruction (core dumped)  ./fsck_udf image

Устанавливаю gdb чтобы залить бэктрейс. Точнее, обновлаю абсолютно всё, чтобы доустановить gdb - прелести троллинг-релиза.

P.S. испытания от 11:20 проводились на amd64.

token_polyak ★★★★★
()
Последнее исправление: token_polyak (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.