Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package netavark for openSUSE:Factory 
checked in at 2024-09-15 12:32:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/netavark (Old)
 and      /work/SRC/openSUSE:Factory/.netavark.new.29891 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "netavark"

Sun Sep 15 12:32:50 2024 rev:13 rq:1200754 version:1.12.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/netavark/netavark.changes        2024-08-13 
13:22:10.859588923 +0200
+++ /work/SRC/openSUSE:Factory/.netavark.new.29891/netavark.changes     
2024-09-15 12:32:51.483680136 +0200
@@ -1,0 +2,12 @@
+Tue Sep 10 15:51:16 UTC 2024 - danish.prak...@suse.com
+
+- Update to version 1.12.2:
+  * Release v1.12.2
+  * Release notes for 1.12.2
+  * fix new rust 1.80 lint issues
+  * silence new rust 1.80 warnings
+  * aardvark: on start failure delete entries again
+  * iptables: make dns rules cover tcp as well
+  * nftables: make dns rules cover tcp as well
+
+-------------------------------------------------------------------

Old:
----
  netavark-1.12.1.tar.gz

New:
----
  netavark-1.12.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ netavark.spec ++++++
--- /var/tmp/diff_new_pack.9XV7Ix/_old  2024-09-15 12:33:16.760726308 +0200
+++ /var/tmp/diff_new_pack.9XV7Ix/_new  2024-09-15 12:33:16.764726474 +0200
@@ -19,7 +19,7 @@
 %define major_minor %((v=%{version}; echo ${v%.*}))
 
 Name:           netavark
-Version:        1.12.1
+Version:        1.12.2
 Release:        0
 Summary:        Container network stack
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.9XV7Ix/_old  2024-09-15 12:33:16.804728131 +0200
+++ /var/tmp/diff_new_pack.9XV7Ix/_new  2024-09-15 12:33:16.808728296 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/containers/netavark.git</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="scm">git</param>
-    <param name="revision">v1.12.1</param>
+    <param name="revision">v1.12.2</param>
     <param name="match-tag">*</param>
     <param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.9XV7Ix/_old  2024-09-15 12:33:16.836729457 +0200
+++ /var/tmp/diff_new_pack.9XV7Ix/_new  2024-09-15 12:33:16.840729622 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/containers/netavark.git</param>
-              <param 
name="changesrevision">a4e1359ee7fa036db2712f495d4afc95c63a32d8</param></service></servicedata>
+              <param 
name="changesrevision">a6d67b7f1a4445771e5ceb5e278286dd3a64bc3d</param></service></servicedata>
 (No newline at EOF)
 

++++++ netavark-1.12.1.tar.gz -> netavark-1.12.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/Cargo.lock 
new/netavark-1.12.2/Cargo.lock
--- old/netavark-1.12.1/Cargo.lock      2024-08-01 22:45:40.000000000 +0200
+++ new/netavark-1.12.2/Cargo.lock      2024-08-16 17:39:42.000000000 +0200
@@ -1359,7 +1359,7 @@
 
 [[package]]
 name = "netavark"
-version = "1.12.1"
+version = "1.12.2"
 dependencies = [
  "anyhow",
  "chrono",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/Cargo.toml 
new/netavark-1.12.2/Cargo.toml
--- old/netavark-1.12.1/Cargo.toml      2024-08-01 22:45:40.000000000 +0200
+++ new/netavark-1.12.2/Cargo.toml      2024-08-16 17:39:42.000000000 +0200
@@ -1,6 +1,6 @@
 [package]
 name = "netavark"
-version = "1.12.1"
+version = "1.12.2"
 edition = "2021"
 authors = ["github.com/containers"]
 license = "Apache-2.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/RELEASE_NOTES.md 
new/netavark-1.12.2/RELEASE_NOTES.md
--- old/netavark-1.12.1/RELEASE_NOTES.md        2024-08-01 22:45:40.000000000 
+0200
+++ new/netavark-1.12.2/RELEASE_NOTES.md        2024-08-16 17:39:42.000000000 
+0200
@@ -1,5 +1,10 @@
 # Release Notes
 
+## v1.12.2
+
+* Ensure DNS rules cover TCP for iptables and nftables
+* On ardvark-dns start, delete entries again on failure
+
 ## v1.12.1
 
 * Fixed problem with categories in Cargo.toml that prevented us from 
publishing v1.12.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/build.rs new/netavark-1.12.2/build.rs
--- old/netavark-1.12.1/build.rs        2024-08-01 22:45:40.000000000 +0200
+++ new/netavark-1.12.2/build.rs        2024-08-16 17:39:42.000000000 +0200
@@ -75,6 +75,7 @@
         "none" => "none",
         inv => panic!("Invalid default firewall driver {}", inv),
     };
+    println!("cargo:rustc-check-cfg=cfg(default_fw, values(\"nftables\", 
\"iptables\", \"none\"))");
     println!("cargo:rustc-cfg=default_fw=\"{}\"", fwdriver);
     println!("cargo:rustc-env=DEFAULT_FW={fwdriver}");
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/src/commands/teardown.rs 
new/netavark-1.12.2/src/commands/teardown.rs
--- old/netavark-1.12.1/src/commands/teardown.rs        2024-08-01 
22:45:40.000000000 +0200
+++ new/netavark-1.12.2/src/commands/teardown.rs        2024-08-16 
17:39:42.000000000 +0200
@@ -67,7 +67,7 @@
             let path = Path::new(&config_dir).join("aardvark-dns");
 
             let aardvark_interface = Aardvark::new(path, rootless, 
aardvark_bin, dns_port);
-            if let Err(err) = 
aardvark_interface.delete_from_netavark_entries(aardvark_entries) {
+            if let Err(err) = 
aardvark_interface.delete_from_netavark_entries(&aardvark_entries) {
                 error_list.push(NetavarkError::wrap("remove aardvark entries", 
err));
             }
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/src/dhcp_proxy/cache.rs 
new/netavark-1.12.2/src/dhcp_proxy/cache.rs
--- old/netavark-1.12.1/src/dhcp_proxy/cache.rs 2024-08-01 22:45:40.000000000 
+0200
+++ new/netavark-1.12.2/src/dhcp_proxy/cache.rs 2024-08-16 17:39:42.000000000 
+0200
@@ -43,7 +43,7 @@
     /// # Arguments
     ///
     /// * `writer`: any type that can has the Write and Clear trait 
implemented. In production this
-    /// is a file. In development/testing this is a Cursor of bytes
+    ///   is a file. In development/testing this is a Cursor of bytes
     ///
     /// returns: Result<LeaseCache<W>, Error>
     ///
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/src/dhcp_proxy/lib.rs 
new/netavark-1.12.2/src/dhcp_proxy/lib.rs
--- old/netavark-1.12.1/src/dhcp_proxy/lib.rs   2024-08-01 22:45:40.000000000 
+0200
+++ new/netavark-1.12.2/src/dhcp_proxy/lib.rs   2024-08-16 17:39:42.000000000 
+0200
@@ -40,10 +40,7 @@
     impl From<DhcpV4Lease> for Lease {
         fn from(l: DhcpV4Lease) -> Lease {
             // Since these fields are optional as per mozim. Match them first 
and then set them
-            let domain_name = match l.domain_name {
-                None => String::from(""),
-                Some(l) => l,
-            };
+            let domain_name = l.domain_name.unwrap_or_default();
             let mtu = l.mtu.unwrap_or(0) as u32;
 
             Lease {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/src/dns/aardvark.rs 
new/netavark-1.12.2/src/dns/aardvark.rs
--- old/netavark-1.12.1/src/dns/aardvark.rs     2024-08-01 22:45:40.000000000 
+0200
+++ new/netavark-1.12.2/src/dns/aardvark.rs     2024-08-16 17:39:42.000000000 
+0200
@@ -211,7 +211,7 @@
         Ok(())
     }
 
-    pub fn commit_entries(&self, entries: Vec<AardvarkEntry>) -> Result<()> {
+    pub fn commit_entries(&self, entries: &[AardvarkEntry]) -> Result<()> {
         // Acquire fs lock to ensure other instance of aardvark cannot commit
         // or start aardvark instance till already running instance has not
         // completed its `commit` phase.
@@ -240,7 +240,7 @@
             ));
         }
 
-        for entry in &entries {
+        for entry in entries {
             let mut path = Path::new(&self.config).join(entry.network_name);
             if entry.is_internal {
                 let new_path = 
Path::new(&self.config).join(entry.network_name.to_owned() + "%int");
@@ -344,8 +344,18 @@
 
     pub fn commit_netavark_entries(&self, entries: Vec<AardvarkEntry>) -> 
NetavarkResult<()> {
         if !entries.is_empty() {
-            self.commit_entries(entries)?;
-            self.notify(true, false)?;
+            self.commit_entries(&entries)?;
+            match self.notify(true, false) {
+                Ok(_) => (),
+                Err(e) => {
+                    if let Err(err) = 
self.delete_from_netavark_entries(&entries) {
+                        log::warn!(
+                            "Failed to delete aardvark-dns entries after 
failed start: {err}"
+                        );
+                    };
+                    return Err(e);
+                }
+            };
         }
         Ok(())
     }
@@ -450,8 +460,8 @@
         Ok(())
     }
 
-    pub fn delete_from_netavark_entries(&self, entries: Vec<AardvarkEntry>) -> 
NetavarkResult<()> {
-        for entry in &entries {
+    pub fn delete_from_netavark_entries(&self, entries: &[AardvarkEntry]) -> 
NetavarkResult<()> {
+        for entry in entries {
             self.delete_entry(entry.container_id, entry.network_name)?;
         }
         self.notify(false, false)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/src/firewall/nft.rs 
new/netavark-1.12.2/src/firewall/nft.rs
--- old/netavark-1.12.1/src/firewall/nft.rs     2024-08-01 22:45:40.000000000 
+0200
+++ new/netavark-1.12.2/src/firewall/nft.rs     2024-08-16 17:39:42.000000000 
+0200
@@ -380,9 +380,21 @@
                     vec![
                         get_subnet_match(&subnet, "saddr", stmt::Operator::EQ),
                         stmt::Statement::Match(stmt::Match {
+                            left: 
expr::Expression::Named(expr::NamedExpression::Meta(
+                                expr::Meta {
+                                    key: expr::MetaKey::L4proto,
+                                },
+                            )),
+                            right: 
expr::Expression::Named(expr::NamedExpression::Set(vec![
+                                
expr::SetItem::Element(expr::Expression::String("udp".to_string())),
+                                
expr::SetItem::Element(expr::Expression::String("tcp".to_string())),
+                            ])),
+                            op: stmt::Operator::EQ,
+                        }),
+                        stmt::Statement::Match(stmt::Match {
                             left: 
expr::Expression::Named(expr::NamedExpression::Payload(
                                 expr::Payload::PayloadField(expr::PayloadField 
{
-                                    protocol: "udp".to_string(),
+                                    protocol: "th".to_string(),
                                     field: "dport".to_string(),
                                 }),
                             )),
@@ -1126,9 +1138,19 @@
         vec![
             get_ip_match(dns_ip, "daddr", stmt::Operator::EQ),
             stmt::Statement::Match(stmt::Match {
+                left: 
expr::Expression::Named(expr::NamedExpression::Meta(expr::Meta {
+                    key: expr::MetaKey::L4proto,
+                })),
+                right: expr::Expression::Named(expr::NamedExpression::Set(vec![
+                    
expr::SetItem::Element(expr::Expression::String("udp".to_string())),
+                    
expr::SetItem::Element(expr::Expression::String("tcp".to_string())),
+                ])),
+                op: stmt::Operator::EQ,
+            }),
+            stmt::Statement::Match(stmt::Match {
                 left: expr::Expression::Named(expr::NamedExpression::Payload(
                     expr::Payload::PayloadField(expr::PayloadField {
-                        protocol: "udp".to_string(),
+                        protocol: "th".to_string(),
                         field: "dport".to_string(),
                     }),
                 )),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/src/firewall/varktables/types.rs 
new/netavark-1.12.2/src/firewall/varktables/types.rs
--- old/netavark-1.12.1/src/firewall/varktables/types.rs        2024-08-01 
22:45:40.000000000 +0200
+++ new/netavark-1.12.2/src/firewall/varktables/types.rs        2024-08-16 
17:39:42.000000000 +0200
@@ -373,13 +373,15 @@
 
     // Always add ACCEPT rules in firewall for dns traffic from containers
     // to gateway when using bridge network with internal dns.
-    netavark_input_chain.build_rule(VarkRule::new(
-        format!(
-            "-p {} -s {} --dport {} -j {}",
-            "udp", network, dns_port, ACCEPT
-        ),
-        Some(TeardownPolicy::OnComplete),
-    ));
+    for proto in ["udp", "tcp"] {
+        netavark_input_chain.build_rule(VarkRule::new(
+            format!(
+                "-p {} -s {} --dport {} -j {}",
+                proto, network, dns_port, ACCEPT
+            ),
+            Some(TeardownPolicy::OnComplete),
+        ));
+    }
     chains.push(netavark_input_chain);
 
     // Drop all invalid packages, due a race the container source ip could be 
leaked on the local
@@ -522,13 +524,15 @@
                 ip_value = format!("[{ip_value}]")
             }
             netavark_hostport_dn_chain.create = true;
-            netavark_hostport_dn_chain.build_rule(VarkRule::new(
-                format!(
-                    "-j {} -d {} -p {} --dport {} --to-destination {}:{}",
-                    DNAT, dns_ip, "udp", 53, ip_value, pfwd.dns_port
-                ),
-                Some(TeardownPolicy::OnComplete),
-            ));
+            for proto in ["udp", "tcp"] {
+                netavark_hostport_dn_chain.build_rule(VarkRule::new(
+                    format!(
+                        "-j {} -d {} -p {} --dport {} --to-destination {}:{}",
+                        DNAT, dns_ip, proto, 53, ip_value, pfwd.dns_port
+                    ),
+                    Some(TeardownPolicy::OnComplete),
+                ));
+            }
         }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/test/100-bridge-iptables.bats 
new/netavark-1.12.2/test/100-bridge-iptables.bats
--- old/netavark-1.12.1/test/100-bridge-iptables.bats   2024-08-01 
22:45:40.000000000 +0200
+++ new/netavark-1.12.2/test/100-bridge-iptables.bats   2024-08-16 
17:39:42.000000000 +0200
@@ -250,12 +250,16 @@
 }
 
 @test "$fw_driver - bridge driver must generate config for aardvark with 
custom dns server" {
-    # get a random port directly to avoid low ports e.g. 53 would not create 
iptables
-    dns_port=$((RANDOM+10000))
-
-    NETAVARK_DNS_PORT="$dns_port" run_netavark --file 
${TESTSDIR}/testfiles/dualstack-bridge-custom-dns-server.json \
+    run_netavark --file 
${TESTSDIR}/testfiles/dualstack-bridge-custom-dns-server.json \
         setup $(get_container_netns_path)
 
+     run_in_host_netns iptables -S NETAVARK_INPUT
+    assert "${lines[1]}" == "-A NETAVARK_INPUT -s 10.89.3.0/24 -p udp -m udp 
--dport 53 -j ACCEPT" "ipv4 dns udp accept rule"
+    assert "${lines[2]}" == "-A NETAVARK_INPUT -s 10.89.3.0/24 -p tcp -m tcp 
--dport 53 -j ACCEPT" "ipv4 dns tcp accept rule"
+    run_in_host_netns ip6tables -S NETAVARK_INPUT
+    assert "${lines[1]}" == "-A NETAVARK_INPUT -s fd10:88:a::/64 -p udp -m udp 
--dport 53 -j ACCEPT" "ipv6 dns udp accept rule"
+    assert "${lines[2]}" == "-A NETAVARK_INPUT -s fd10:88:a::/64 -p tcp -m tcp 
--dport 53 -j ACCEPT" "ipv6 dns tcp accept rule"
+
     # check aardvark config and running
     run_helper cat "$NETAVARK_TMPDIR/config/aardvark-dns/podman1"
     assert "${lines[0]}" =~ "10.89.3.1,fd10:88:a::1" "aardvark set to listen 
to all IPs"
@@ -265,7 +269,7 @@
     aardvark_pid=$(cat "$NETAVARK_TMPDIR/config/aardvark-dns/aardvark.pid")
     assert "$ardvark_pid" =~ "[0-9]*" "aardvark pid not found"
     run_helper ps "$aardvark_pid"
-    assert "${lines[1]}" =~ ".*aardvark-dns --config 
$NETAVARK_TMPDIR/config/aardvark-dns -p $dns_port run" "aardvark not running or 
bad options"
+    assert "${lines[1]}" =~ ".*aardvark-dns --config 
$NETAVARK_TMPDIR/config/aardvark-dns -p 53 run" "aardvark not running or bad 
options"
 }
 
 @test "$fw_driver - bridge driver must generate config for aardvark with 
multiple custom dns server" {
@@ -316,8 +320,10 @@
     # check iptables
     run_in_host_netns iptables -t nat -S NETAVARK-HOSTPORT-DNAT
     assert "${lines[1]}" == "-A NETAVARK-HOSTPORT-DNAT -d 10.89.3.1/32 -p udp 
-m udp --dport 53 -j DNAT --to-destination 10.89.3.1:$dns_port" "ipv4 dns 
forward rule"
+    assert "${lines[2]}" == "-A NETAVARK-HOSTPORT-DNAT -d 10.89.3.1/32 -p tcp 
-m tcp --dport 53 -j DNAT --to-destination 10.89.3.1:$dns_port" "ipv4 dns tcp 
forward rule"
     run_in_host_netns ip6tables -t nat -S NETAVARK-HOSTPORT-DNAT
     assert "${lines[1]}" == "-A NETAVARK-HOSTPORT-DNAT -d fd10:88:a::1/128 -p 
udp -m udp --dport 53 -j DNAT --to-destination [fd10:88:a::1]:$dns_port" "ipv6 
dns forward rule"
+    assert "${lines[2]}" == "-A NETAVARK-HOSTPORT-DNAT -d fd10:88:a::1/128 -p 
tcp -m tcp --dport 53 -j DNAT --to-destination [fd10:88:a::1]:$dns_port" "ipv6 
dns tcp forward rule"
 
     # check aardvark config and running
     run_helper cat "$NETAVARK_TMPDIR/config/aardvark-dns/podman1"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netavark-1.12.1/test/250-bridge-nftables.bats 
new/netavark-1.12.2/test/250-bridge-nftables.bats
--- old/netavark-1.12.1/test/250-bridge-nftables.bats   2024-08-01 
22:45:40.000000000 +0200
+++ new/netavark-1.12.2/test/250-bridge-nftables.bats   2024-08-16 
17:39:42.000000000 +0200
@@ -240,12 +240,13 @@
 }
 
 @test "$fw_driver - bridge driver must generate config for aardvark with 
custom dns server" {
-    # get a random port directly to avoid low ports e.g. 53 would not create 
nftables rules
-    dns_port=$((RANDOM+10000))
-
-    NETAVARK_DNS_PORT="$dns_port" run_netavark --file 
${TESTSDIR}/testfiles/dualstack-bridge-custom-dns-server.json \
+    run_netavark --file 
${TESTSDIR}/testfiles/dualstack-bridge-custom-dns-server.json \
         setup $(get_container_netns_path)
 
+    # check nftables
+    run_in_host_netns nft list chain inet netavark INPUT
+    assert "${lines[3]}" =~ "ip saddr 10.89.3.0/24 meta l4proto \{ tcp, udp \} 
th dport 53 accept" "DNS accept rule"
+
     # check aardvark config and running
     run_helper cat "$NETAVARK_TMPDIR/config/aardvark-dns/podman1"
     assert "${lines[0]}" =~ "10.89.3.1,fd10:88:a::1" "aardvark set to listen 
to all IPs"
@@ -255,7 +256,18 @@
     aardvark_pid=$(cat "$NETAVARK_TMPDIR/config/aardvark-dns/aardvark.pid")
     assert "$ardvark_pid" =~ "[0-9]*" "aardvark pid not found"
     run_helper ps "$aardvark_pid"
-    assert "${lines[1]}" =~ ".*aardvark-dns --config 
$NETAVARK_TMPDIR/config/aardvark-dns -p $dns_port run" "aardvark not running or 
bad options"
+    assert "${lines[1]}" =~ ".*aardvark-dns --config 
$NETAVARK_TMPDIR/config/aardvark-dns -p 53 run" "aardvark not running or bad 
options"
+}
+
+@test "$fw_driver - aardvark-dns entries after startup failure" {
+    # force failure with invalid aardvark-dns binary
+    expected_rc=1 run_netavark --aardvark-binary ${TESTSDIR} --file 
${TESTSDIR}/testfiles/dualstack-bridge-custom-dns-server.json \
+        setup $(get_container_netns_path)
+    assert "$output" =~ "aardvark-dns failed to start: Failed to find 
executable" "netavark error"
+
+    # check aardvark config must not exists after error
+    run_helper ls "$NETAVARK_TMPDIR/config/aardvark-dns"
+    assert "$output" == "" "No aardvark entries"
 }
 
 @test "$fw_driver - bridge driver must generate config for aardvark with 
multiple custom dns server" {
@@ -305,7 +317,7 @@
 
     # check nftables
     run_in_host_netns nft list chain inet netavark NETAVARK-HOSTPORT-DNAT
-    assert "${lines[2]}" =~ "ip daddr 10.89.3.1 udp dport 53 dnat ip to 
10.89.3.1:$dns_port" "DNS forward rule"
+    assert "${lines[2]}" =~ "ip daddr 10.89.3.1 meta l4proto \{ tcp, udp \} th 
dport 53 dnat ip to 10.89.3.1:$dns_port" "DNS forward rule"
 
     # check aardvark config and running
     run_helper cat "$NETAVARK_TMPDIR/config/aardvark-dns/podman1"

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/netavark/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.netavark.new.29891/vendor.tar.gz differ: char 13, 
line 1

Reply via email to