Files
erofs-freebsd-out-tree/tests/TC156-inode-timestamp-validation.md
T
2026-08-18 09:20:44 +02:00

52 lines
2.3 KiB
Markdown

# Test Case: Compact and Extended Timestamp Validation
**Test ID**: TC156-inode-timestamp-validation
**Category**: Inode Corruption
**Priority**: Critical
**Regression**: Timestamp arithmetic and conversion accepted malformed values
## Objective
Verify checked compact-inode epoch addition, nanoseconds below one billion for
both inode layouts, and rejection of unsigned seconds that cannot be represented
by FreeBSD 15 amd64 `time_t`.
## Fixtures
Generate the review fixtures with `tests/review_fixtures.py`. Its structured
field assertions produce:
| Image | Malformed field | Trigger |
|---|---|---|
| `compact-epoch-wrap.erofs` | `epoch=UINT64_MAX`, root `i_mtime=1` | `uint64_t` addition overflow |
| `compact-epoch-range.erofs` | `epoch=INT64_MAX`, target `i_mtime=1` | result exceeds signed 64-bit `time_t` |
| `compact-nsec-invalid.erofs` | `fixed_nsec=1000000000` | invalid compact nanoseconds |
| `extended-nsec-invalid.erofs` | target `i_mtime_nsec=1000000000` | invalid extended nanoseconds |
| `extended-seconds-range.erofs` | target `i_mtime=INT64_MAX+1` | seconds exceed `time_t` |
Every image must pass the helper's EROFS field-location and CRC32C checks before
guest transfer.
## Procedure
1. For `compact-epoch-wrap.erofs`, attach the image and trace the mount. The
mount must fail with `ERR#97` when the root inode is decoded.
2. For `compact-nsec-invalid.erofs`, trace the mount. Superblock timestamp
validation must fail with `ERR#97` before a vnode is returned.
3. Mount `compact-epoch-range.erofs`. The root timestamp at `INT64_MAX` remains
representable, but `stat /zz-identity.txt` must fail with `ERR#97`.
4. Mount each extended fixture. The root remains usable, while
`stat /extended-time.txt` must fail with `ERR#97` for the targeted field.
5. Repeat every failing access, compare dmesg, and clean the mount and md unit
after each image.
## Expected Results
- Compact epoch addition overflow returns `EINTEGRITY`, not a wrapped time.
- Exactly `999999999` remains the maximum accepted nanosecond value;
`1000000000` is rejected for compact and extended timestamps.
- `INT64_MAX` seconds is accepted on the qualified amd64 ABI, while
`INT64_MAX+1` is rejected before assignment to `timespec.tv_sec`.
- No malformed inode creates a vnode with normalized, negative, or wrapped
timestamps, and no panic or assertion occurs.