52 lines
2.3 KiB
Markdown
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.
|