keepsimple1 / mdns-sd

Rust library for mDNS based Service Discovery
Apache License 2.0
96 stars 37 forks source link

check_service_name_length() attempt to subtract with overflow #158

Closed wfeii1980 closed 9 months ago

wfeii1980 commented 9 months ago
fn check_service_name_length(ty_domain: &str, limit: u8) -> Result<()> {
-   let service_name_len = ty_domain.len() - DOMAIN_LEN - 1; // exclude the leading `_`
+   let service_name_len = ty_domain.len() - (DOMAIN_LEN - 1); // exclude the leading `_`
    if service_name_len > limit as usize {
        return Err(e_fmt!("Service name length must be <= {} bytes", limit));
    }
    Ok(())
}
keepsimple1 commented 9 months ago
-   let service_name_len = ty_domain.len() - DOMAIN_LEN - 1; // exclude the leading `_`
+   let service_name_len = ty_domain.len() - (DOMAIN_LEN - 1); // exclude the leading `_`

Curiously, I cannot understand what the issue is, and why the diff is correct. Could you please explain a bit?

wfeii1980 commented 9 months ago
-   let service_name_len = ty_domain.len() - DOMAIN_LEN - 1; // exclude the leading `_`
+   let service_name_len = ty_domain.len() - (DOMAIN_LEN - 1); // exclude the leading `_`

Curiously, I cannot understand what the issue is, and why the diff is correct. Could you please explain a bit?

cargo run --example register _tcp _googlecast
   Compiling mdns-sd v0.10.1 (/home/wii/data/works2/usb/mdns-sd)
    Finished dev [unoptimized + debuginfo] target(s) in 0.78s
     Running `target/debug/examples/register _tcp _googlecast`
Registered service _googlecast._tcp.local.
thread 'mDNS_daemon' panicked at src/service_daemon.rs:2086:28:
attempt to subtract with overflow
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
keepsimple1 commented 9 months ago
cargo run --example register _tcp _googlecast

The usage of this command is:

$ cargo run --example register                               
    Finished dev [unoptimized + debuginfo] target(s) in 0.05s
     Running `target/debug/examples/register`
Usage:
cargo run --example register <service_type> <instance_name> [--unregister]
Options:
--unregister: automatically unregister after 2 seconds

For example:
cargo run --example register _my-hello._udp test1

In your case, the service type should be _googlecast._tcp, and the service instance name is missing. This command should be like:

cargo run --example register _googlecast._tcp mycast-device

(where mycast-device is the instance name)

Does it make sense?

(Meantime, I can try to make the example code and the mentioned function more error proof. But the current logic is correct. Right? )

keepsimple1 commented 9 months ago

I've opened a PR to add a sanity check for the service type name length. If you have time, let me know that helps.

keepsimple1 commented 9 months ago

Patch is merged. Let me know if there is any issue.