Files
dualfroz c6a4588fb3 fix(validation): allow image height up to spec maximum of 400
Image height was validated against 0..=144, the same bound as width, but the
RSS 2.0 specification allows heights up to 400 (width max is 144). Spec-valid
images with a height between 145 and 400 were wrongly reported as invalid.
Validate height against 0..=400 and fix the error message.
2026-09-04 09:35:35 +02:00

2.6 KiB

Fix image height validation to allow the spec maximum of 400

Problem

Channel/Image validation rejects images whose <height> is greater than 144, even though the RSS 2.0 specification allows heights up to 400. A perfectly spec-compliant image is reported as invalid:

use rss::validation::Validate;
use rss::ImageBuilder;

let image = ImageBuilder::default()
    .url("https://example.com/image.png".to_string())
    .link("https://example.com/".to_string())
    .title("title".to_string())
    .height("200".to_string()) // valid per the RSS spec
    .build();

assert!(image.validate().is_err()); // <- wrongly errors today

Root cause

src/validation.rs, in impl Validate for Image, validated height against the same range used for width:

let height = height.parse::<i64>()?;
validate!(
    (0..=144).contains(&height),
    "Image height is not between 0 and 144"
);

The RSS 2.0 specification (https://www.rssboard.org/rss-specification, <image> sub-element) states:

  • width: "Maximum value for width is 144, default value is 88."
  • height: "Maximum value for height is 400, default value is 31."

So 144 is correct for width, but height must allow up to 400. The bound (and the error message) were copied from the width check.

Fix

Validate height against 0..=400 and correct the error message:

let height = height.parse::<i64>()?;
validate!(
    (0..=400).contains(&height),
    "Image height is not between 0 and 400"
);

width is unchanged and keeps its specification maximum of 144.

Test

Added tests/validation.rs (gated on the validation feature):

  • image_height_allows_up_to_400: heights 31, 200 and 400 validate OK.
  • image_height_above_400_is_invalid: height 401 is rejected.
  • image_width_max_is_still_144: width 144 is OK, 145 is rejected.

Gate

  • cargo test --all-features -> ok (all suites pass, exit 0)
  • cargo build --all-features -> ok (exit 0)
  • cargo fmt --check -> ok (exit 0)

Counterfactual

Reverting the bound back to 0..=144 makes the new test fail:

thread 'image_height_allows_up_to_400' panicked at tests/validation.rs:28:5:
assertion failed: image_with_height("200").validate().is_ok()

Flags for the account owner

cargo clippy --all-targets --all-features -- -D warnings currently fails, but this is pre-existing and unrelated to this change: on an unmodified checkout the same lint (clippy::get_first, i.e. "accessing first element with .get(0)", emitted by a newer Clippy than the tests were written against) already produces these errors in tests/read.rs. The files touched here are clippy-clean.