@@ -166,14 +166,26 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
166
166
parse_u32 ( payload) . context ( "invalid IFLA_IPTUN_LINK value" ) ?,
167
167
) ,
168
168
IFLA_IPTUN_LOCAL => {
169
- let ip = parse_ip_addr ( payload)
170
- . context ( "invalid IFLA_IPTUN_LOCAL" ) ?;
171
- Self :: Local ( ip)
169
+ match parse_ip_addr ( payload) {
170
+ Ok ( ip) => Local ( ip) ,
171
+ Err ( _) => {
172
+ // Fallback for malformed IP addresses in SIT tunnels
173
+ Other ( DefaultNla :: parse ( buf) . context (
174
+ "failed to parse IFLA_IPTUN_LOCAL as fallback" ,
175
+ ) ?)
176
+ }
177
+ }
172
178
}
173
179
IFLA_IPTUN_REMOTE => {
174
- let ip = parse_ip_addr ( payload)
175
- . context ( "invalid IFLA_IPTUN_REMOTE" ) ?;
176
- Self :: Remote ( ip)
180
+ match parse_ip_addr ( payload) {
181
+ Ok ( ip) => Remote ( ip) ,
182
+ Err ( _) => {
183
+ // Fallback for malformed IP addresses in SIT tunnels
184
+ Other ( DefaultNla :: parse ( buf) . context (
185
+ "failed to parse IFLA_IPTUN_REMOTE as fallback" ,
186
+ ) ?)
187
+ }
188
+ }
177
189
}
178
190
IFLA_IPTUN_TTL => {
179
191
Ttl ( parse_u8 ( payload)
@@ -221,25 +233,26 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
221
233
IFLA_IPTUN_6RD_PREFIX => {
222
234
if payload. len ( ) == 16 {
223
235
let mut data = [ 0u8 ; 16 ] ;
224
- data. copy_from_slice ( & payload[ 0 .. 16 ] ) ;
236
+ data. copy_from_slice ( payload) ;
225
237
Self :: Ipv6RdPrefix ( Ipv6Addr :: from ( data) )
226
238
} else {
227
- return Err ( DecodeError :: from ( format ! (
228
- "Invalid IFLA_IPTUN_6RD_PREFIX, got unexpected length \
229
- of IPv6 address payload {payload:?}"
230
- ) ) ) ;
239
+ // Fallback for malformed 6RD prefix data
240
+ Other ( DefaultNla :: parse ( buf ) . context (
241
+ "failed to parse IFLA_IPTUN_6RD_PREFIX as fallback" ,
242
+ ) ? )
231
243
}
232
244
}
233
245
IFLA_IPTUN_6RD_RELAY_PREFIX => {
234
246
if payload. len ( ) == 16 {
235
247
let mut data = [ 0u8 ; 16 ] ;
236
- data. copy_from_slice ( & payload[ 0 .. 16 ] ) ;
248
+ data. copy_from_slice ( payload) ;
237
249
Self :: Ipv6RdRelayPrefix ( Ipv6Addr :: from ( data) )
238
250
} else {
239
- return Err ( DecodeError :: from ( format ! (
240
- "Invalid IFLA_IPTUN_6RD_RELAY_PREFIX, got unexpected \
241
- length of IPv6 address payload {payload:?}"
242
- ) ) ) ;
251
+ // Fallback for malformed 6RD relay prefix data
252
+ Other (
253
+ DefaultNla :: parse ( buf)
254
+ . context ( "failed to parse IFLA_IPTUN_6RD_RELAY_PREFIX as fallback" ) ?,
255
+ )
243
256
}
244
257
}
245
258
IFLA_IPTUN_6RD_PREFIXLEN => Ipv6RdPrefixLen (
0 commit comments