Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

error when extracting a ubi file in blk.data_crc() function from ubireader #83

Open
arunmagesh opened this issue May 2, 2023 · 1 comment
Assignees

Comments

@arunmagesh
Copy link

There appears to be a bug in the ubireader which checks for crc information in the header and fails to catch if it doesn't recognise it properly.

To Reproduce
Steps to reproduce the behavior:

  1. Launch unblob with command unblob file.ubi
  2. See error

Detail
Error from unblob

code=0x1 pid=22412 severity=<Severity.WARNING: 'WARNING'> stderr=Traceback (most recent call last):
  File "/home/arunmag_001/.local/bin/ubireader_extract_images", line 143, in <module>
    ubi_obj = ubi(ufile_obj)
  File "/home/arunmag_001/.local/lib/python3.10/site-packages/ubireader/ubi/__init__.py", line 146, in __init__
    super(ubi, self).__init__(ubi_file)
  File "/home/arunmag_001/.local/lib/python3.10/site-packages/ubireader/ubi/__init__.py", line 46, in __init__
    self._blocks = extract_blocks(self)
  File "/home/arunmag_001/.local/lib/python3.10/site-packages/ubireader/ubi/block/__init__.py", line 131, in extract_blocks
    blk.data_crc = (~crc32(buf[blk.ec_hdr.data_offset:blk.ec_hdr.data_offset+blk.vid_hdr.data_size]) & UBI_CRC32_INIT)
AttributeError: 'NoneType' object has no attribute 'data_size'

Same error from ubireader as well.

 ubireader_display_info 20000.ubi
Traceback (most recent call last):
  File "/home/arunmag_001/.local/bin/ubireader_display_info", line 132, in <module>
    ubi_obj = ubi(ufile_obj)
  File "/home/arunmag_001/.local/lib/python3.10/site-packages/ubireader/ubi/__init__.py", line 146, in __init__
    super(ubi, self).__init__(ubi_file)
  File "/home/arunmag_001/.local/lib/python3.10/site-packages/ubireader/ubi/__init__.py", line 46, in __init__
    self._blocks = extract_blocks(self)
  File "/home/arunmag_001/.local/lib/python3.10/site-packages/ubireader/ubi/block/__init__.py", line 131, in extract_blocks
    blk.data_crc = (~crc32(buf[blk.ec_hdr.data_offset:blk.ec_hdr.data_offset+blk.vid_hdr.data_size]) & UBI_CRC32_INIT)
AttributeError: 'NoneType' object has no attribute 'data_size'

Expected behavior
The script crash and fails to extract.

Environment information :
Linux arunmag 5.15.90.1-microsoft-standard-WSL2 onekey-sec/unblob#1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
"Ubuntu 22.04.1 LTS"
"unblob==23.4.17"

83886080-84803584.zip

@qkaiser
Copy link
Contributor

qkaiser commented May 4, 2023

The bug stems from this line: https://github.com/jrspruitt/ubi_reader/blob/master/ubireader/ubi/block/__init__.py#L65

When a block header error is encountered, the vid_hdr value of the block is not set which leads to the exception you're seeing.

A fix to have a better error message would be:

diff --git a/ubireader/ubi/block/__init__.py b/ubireader/ubi/block/__init__.py
index ce80f96..ae66e35 100755
--- a/ubireader/ubi/block/__init__.py
+++ b/ubireader/ubi/block/__init__.py
@@ -62,7 +62,7 @@ class description(object):
         # TODO better understanding of block types/errors
         self.ec_hdr = ec_hdr(block_buf[0:UBI_EC_HDR_SZ])
 
-        if not self.ec_hdr.errors or settings.ignore_block_header_errors:
+        if not self.ec_hdr.errors or settings.ignore_block_header_errors or settings.warn_only_block_read_errors:
             self.vid_hdr = vid_hdr(block_buf[self.ec_hdr.vid_hdr_offset:self.ec_hdr.vid_hdr_offset+UBI_VID_HDR_SZ])
 
             if not self.vid_hdr.errors or settings.ignore_block_header_errors:
@@ -72,7 +72,8 @@ class description(object):
                     self.vtbl_recs = vtbl_recs(block_buf[self.ec_hdr.data_offset:])
 
                 self.leb_num = self.vid_hdr.lnum
-
+        else:
+            raise Exception("ECC error in block header. Use either --warn-only-block-read-errors or --ignore-block-header-errors.")
         self.is_vtbl = bool(self.vtbl_recs) or False
         self.is_valid = not self.ec_hdr.errors and not self.vid_hdr.errors or settings.ignore_block_header_errors

If you do apply that fix, or use ubireader with --ignore-block-header-errors you'll get this with your sample:

UBI Fatal: Less than 2 layout blocks found.

@qkaiser qkaiser self-assigned this May 4, 2023
@qkaiser qkaiser transferred this issue from onekey-sec/unblob May 21, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants