[Git][java-team/jmdns][master] 6 commits: Standards-Version updated to 4.2.1
Emmanuel Bourg
gitlab at salsa.debian.org
Fri Oct 19 14:29:46 BST 2018
Emmanuel Bourg pushed to branch master at Debian Java Maintainers / jmdns
Commits:
efc9d30d by Emmanuel Bourg at 2018-10-19T13:25:54Z
Standards-Version updated to 4.2.1
- - - - -
21ec5fe9 by Emmanuel Bourg at 2018-10-19T13:26:00Z
Switch to debhelper level 11
- - - - -
0413846b by Emmanuel Bourg at 2018-10-19T13:26:08Z
Use salsa.debian.org Vcs-* URLs
- - - - -
7b0dad19 by Emmanuel Bourg at 2018-10-19T13:26:46Z
New upstream version 3.5.4
- - - - -
2de243d5 by Emmanuel Bourg at 2018-10-19T13:26:46Z
Update upstream source from tag 'upstream/3.5.4'
Update to upstream version '3.5.4'
with Debian dir 1cb50817f6ffb5a1b655e556295fa574b4fd2872
- - - - -
ab1625d6 by Emmanuel Bourg at 2018-10-19T13:29:25Z
New upstream release (3.5.4)
- - - - -
17 changed files:
- debian/changelog
- debian/compat
- debian/control
- debian/rules
- debian/watch
- p2/features/org.jmdns.feature/feature.xml
- p2/features/org.jmdns.feature/pom.xml
- p2/features/pom.xml
- p2/pom.xml
- p2/repository/pom.xml
- p2/targetplatform/pom.xml
- pom.xml
- src/main/java/javax/jmdns/impl/DNSRecord.java
- src/main/java/javax/jmdns/impl/JmDNSImpl.java
- src/main/java/javax/jmdns/impl/ServiceInfoImpl.java
- src/main/java/javax/jmdns/impl/constants/DNSConstants.java
- src/main/java/javax/jmdns/impl/util/ByteWrangler.java
Changes:
=====================================
debian/changelog
=====================================
@@ -1,3 +1,13 @@
+jmdns (3.5.4-1) unstable; urgency=medium
+
+ * Team upload.
+ * New upstream release
+ * Standards-Version updated to 4.2.1
+ * Switch to debhelper level 11
+ * Use salsa.debian.org Vcs-* URLs
+
+ -- Emmanuel Bourg <ebourg at apache.org> Fri, 19 Oct 2018 15:29:20 +0200
+
jmdns (3.5.3-1) unstable; urgency=medium
* Team upload.
=====================================
debian/compat
=====================================
@@ -1 +1 @@
-10
+11
=====================================
debian/control
=====================================
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
Uploaders: James Page <james.page at ubuntu.com>
Build-Depends:
- debhelper (>= 10),
+ debhelper (>= 11),
default-jdk,
junit4,
libeasymock-java,
@@ -12,9 +12,9 @@ Build-Depends:
libmaven-javadoc-plugin-java,
libslf4j-java,
maven-debian-helper
-Standards-Version: 4.1.1
-Vcs-Git: https://anonscm.debian.org/git/pkg-java/jmdns.git
-Vcs-Browser: https://anonscm.debian.org/cgit/pkg-java/jmdns.git
+Standards-Version: 4.2.1
+Vcs-Git: https://salsa.debian.org/java-team/jmdns.git
+Vcs-Browser: https://salsa.debian.org/java-team/jmdns
Homepage: https://github.com/jmdns/jmdns
Package: libjmdns-java
=====================================
debian/rules
=====================================
@@ -2,6 +2,3 @@
%:
dh $@ --buildsystem=maven
-
-get-orig-source:
- uscan --download-current-version --force-download --rename --repack --compression xz
=====================================
debian/watch
=====================================
@@ -1,2 +1,3 @@
-version=3
+version=4
+opts=repack,compression=xz \
https://github.com/jmdns/jmdns/tags .*/archive/jmdns-([\d\.]+).tar.gz
=====================================
p2/features/org.jmdns.feature/feature.xml
=====================================
@@ -1,7 +1,7 @@
<feature
id="org.jmdns.feature"
label="JmDNS"
- version="3.5.3.qualifier"
+ version="3.5.4"
provider-name="JmDNS.org">
<description>
@@ -9,7 +9,7 @@
</description>
<copyright>
- Copyright (C) 2017 JmDNS.org and others
+ Copyright (C) 2018 JmDNS.org and others
</copyright>
<license url="%licenseURL">
=====================================
p2/features/org.jmdns.feature/pom.xml
=====================================
@@ -5,7 +5,7 @@
<parent>
<groupId>org.jmdns.p2</groupId>
<artifactId>features</artifactId>
- <version>3.5.3-SNAPSHOT</version>
+ <version>3.5.4</version>
</parent>
<artifactId>org.jmdns.feature</artifactId>
=====================================
p2/features/pom.xml
=====================================
@@ -7,7 +7,7 @@
<parent>
<groupId>org.jmdns.p2</groupId>
<artifactId>pom</artifactId>
- <version>3.5.3-SNAPSHOT</version>
+ <version>3.5.4</version>
</parent>
<artifactId>features</artifactId>
=====================================
p2/pom.xml
=====================================
@@ -6,7 +6,7 @@
<groupId>org.jmdns.p2</groupId>
<artifactId>pom</artifactId>
- <version>3.5.3-SNAPSHOT</version>
+ <version>3.5.4</version>
<packaging>pom</packaging>
<name>JmDNS p2</name>
=====================================
p2/repository/pom.xml
=====================================
@@ -5,7 +5,7 @@
<parent>
<groupId>org.jmdns.p2</groupId>
<artifactId>pom</artifactId>
- <version>3.5.3-SNAPSHOT</version>
+ <version>3.5.4</version>
</parent>
<artifactId>org.jmdns.repository</artifactId>
=====================================
p2/targetplatform/pom.xml
=====================================
@@ -5,7 +5,7 @@
<parent>
<groupId>org.jmdns.p2</groupId>
<artifactId>pom</artifactId>
- <version>3.4.3</version>
+ <version>3.5.4</version>
</parent>
<artifactId>targetplatform</artifactId>
=====================================
pom.xml
=====================================
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.jmdns</groupId>
<artifactId>jmdns</artifactId>
- <version>3.5.3</version>
+ <version>3.5.4</version>
<name>JmDNS</name>
<packaging>jar</packaging>
<description>JmDNS is a Java implementation of multi-cast DNS and can be used for service registration and discovery in local area networks. JmDNS is fully compatible with Apple's Bonjour.
@@ -52,7 +52,7 @@ The project was originally started in December 2002 by Arthur van Hoff at Strang
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
- <version>1.7.16</version>
+ <version>1.7.25</version>
</dependency>
<dependency>
<groupId>junit</groupId>
=====================================
src/main/java/javax/jmdns/impl/DNSRecord.java
=====================================
@@ -672,12 +672,14 @@ public abstract class DNSRecord extends DNSEntry {
final String text = ByteWrangler.readUTF(_text);
- // if the text is longer than 20 characters cut it to 17 chars
- // and add "..." at the end
- if (20 < text.length()) {
- sb.append(text, 0, 17).append("...");
- } else {
- sb.append(text);
+ if (text != null) {
+ // if the text is longer than 20 characters cut it to 17 chars
+ // and add "..." at the end
+ if (20 < text.length()) {
+ sb.append(text, 0, 17).append("...");
+ } else {
+ sb.append(text);
+ }
}
sb.append('\'');
}
@@ -1078,4 +1080,9 @@ public abstract class DNSRecord extends DNSEntry {
public int getTTL() {
return _ttl;
}
+
+ public long getCreated() {
+ return this._created;
+ }
+
}
=====================================
src/main/java/javax/jmdns/impl/JmDNSImpl.java
=====================================
@@ -464,6 +464,7 @@ public class JmDNSImpl extends JmDNS implements DNSStatefulObject, DNSTaskStarte
_socket = new MulticastSocket(DNSConstants.MDNS_PORT);
if ((hostInfo != null) && (hostInfo.getInterface() != null)) {
final SocketAddress multicastAddr = new InetSocketAddress(_group, DNSConstants.MDNS_PORT);
+ _socket.setNetworkInterface(hostInfo.getInterface());
logger.trace("Trying to joinGroup({}, {})", multicastAddr, hostInfo.getInterface());
@@ -1346,14 +1347,22 @@ public class JmDNSImpl extends JmDNS implements DNSStatefulObject, DNSTaskStarte
final boolean unique = newRecord.isUnique();
final DNSRecord cachedRecord = (DNSRecord) this.getCache().getDNSEntry(newRecord);
logger.debug("{} handle response cached record: {}", this.getName(), cachedRecord);
+ // RFC 6762, section 10.2 Announcements to Flush Outdated Cache Entries
+ // https://tools.ietf.org/html/rfc6762#section-10.2
+ // if (cache-flush a.k.a unique), remove all existing records matching these criterias :--
+ // 1. same name
+ // 2. same record type
+ // 3. same record class
+ // 4. record is older than 1 second.
if (unique) {
for (DNSEntry entry : this.getCache().getDNSEntryList(newRecord.getKey())) {
if ( newRecord.getRecordType().equals(entry.getRecordType()) &&
newRecord.getRecordClass().equals(entry.getRecordClass()) &&
- (entry != cachedRecord)
+ isOlderThanOneSecond( (DNSRecord)entry, now )
) {
logger.trace("setWillExpireSoon() on: {}", entry);
- ((DNSRecord) entry).setWillExpireSoon(now);
+ // this set ttl to 1 second,
+ ((DNSRecord) entry).setWillExpireSoon(now);
}
}
}
@@ -1425,6 +1434,16 @@ public class JmDNSImpl extends JmDNS implements DNSStatefulObject, DNSTaskStarte
}
}
+
+ /**
+ *
+ * @param dnsRecord
+ * @param timeToCompare a given times for comparison
+ * @return true if dnsRecord create time is older than 1 second, relative to the given time; false otherwise
+ */
+ private boolean isOlderThanOneSecond(DNSRecord dnsRecord, long timeToCompare) {
+ return (dnsRecord.getCreated() < (timeToCompare - DNSConstants.FLUSH_RECORD_OLDER_THAN_1_SECOND*1000));
+ }
/**
* Handle an incoming response. Cache answers, and pass them on to the appropriate questions.
=====================================
src/main/java/javax/jmdns/impl/ServiceInfoImpl.java
=====================================
@@ -795,6 +795,7 @@ public class ServiceInfoImpl extends ServiceInfo implements DNSListener, DNSStat
// flag for changes
boolean serviceChanged = false;
+ // When a record is soon to be expired, i.e. ttl=1, consider that as expired too.
if (record.isExpired(now)) {
// remove data
serviceChanged = handleExpiredRecord(record);
@@ -813,7 +814,18 @@ public class ServiceInfoImpl extends ServiceInfo implements DNSListener, DNSStat
// ServiceEvent event = ((DNSRecord) rec).getServiceEvent(dns);
// event = new ServiceEventImpl(dns, event.getType(), event.getName(), this);
// Failure to resolve services - ID: 3517826
- ServiceEvent event = new ServiceEventImpl(dns, this.getType(), this.getName(), this);
+ //
+ // There is a timing/ concurrency issue here. The ServiceInfo object is subject to concurrent change.
+ // e.g. when a device announce a new IP, the old IP has TTL=1.
+ //
+ // The listeners runs on different threads concurrently. When they start and read the event,
+ // the ServiceInfo is already removed/ changed.
+ //
+ // The simple solution is to clone the ServiceInfo. Therefore, future changes to ServiceInfo
+ // will not be seen by the listeners.
+ //
+ // Fixes ListenerStatus warning "Service Resolved called for an unresolved event: {}"
+ ServiceEvent event = new ServiceEventImpl(dns, this.getType(), this.getName(), this.clone());
dns.handleServiceResolved(event);
}
} else {
=====================================
src/main/java/javax/jmdns/impl/constants/DNSConstants.java
=====================================
@@ -53,6 +53,7 @@ public final class DNSConstants {
public static final int RECORD_EXPIRY_DELAY = 1; // This is 1s delay used in ttl and therefore in seconds
public static final int KNOWN_ANSWER_TTL = 120;
public static final int ANNOUNCED_RENEWAL_TTL_INTERVAL = DNS_TTL * 500; // 50% of the TTL in milliseconds
+ public static final int FLUSH_RECORD_OLDER_THAN_1_SECOND = 1; // rfc6762, section 10.2 Flush outdated cache (older than 1 second)
public static final int STALE_REFRESH_INCREMENT = 5;
public static final int STALE_REFRESH_STARTING_PERCENTAGE = 80;
=====================================
src/main/java/javax/jmdns/impl/util/ByteWrangler.java
=====================================
@@ -3,8 +3,11 @@ package javax.jmdns.impl.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.charset.Charset;
import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* This class contains all the byte shifting
@@ -13,6 +16,7 @@ import java.util.Map;
*
*/
public class ByteWrangler {
+ private static Logger logger = LoggerFactory.getLogger(ByteWrangler.class.getName());
/**
* Maximum number of bytes a value can consist of.
@@ -39,79 +43,35 @@ public class ByteWrangler {
public final static byte[] EMPTY_TXT = new byte[] { 0 };
/**
- * Write a UTF string with a length to a stream.
+ * Name for charset used to convert Strings to/from wire bytes: {@value #CHARSET_NAME}.
+ */
+ public final static String CHARSET_NAME = "UTF-8";
+
+ /**
+ * Charset used to convert Strings to/from wire bytes: {@value #CHARSET_NAME}.
+ */
+ private final static Charset CHARSET_UTF_8 = Charset.forName(CHARSET_NAME);
+
+ /**
+ * Write a String as {@value #CHARSET_NAME} encoded bytes to a stream.
*/
public static void writeUTF(final OutputStream out, final String str) throws IOException {
- final int len = str.length();
- for (int i = 0; i < len; i++) {
- final int c = str.charAt(i);
- if ((c >= 0x0001) && (c <= 0x007F)) {
- out.write(c);
- } else {
- if (c > 0x07FF) {
- out.write(0xE0 | ((c >> 12) & 0x0F));
- out.write(0x80 | ((c >> 6) & 0x3F));
- out.write(0x80 | ((c >> 0) & 0x3F));
- } else {
- out.write(0xC0 | ((c >> 6) & 0x1F));
- out.write(0x80 | ((c >> 0) & 0x3F));
- }
- }
- }
+ final byte[] utf8Bytes = str.getBytes(CHARSET_UTF_8);
+ out.write(utf8Bytes);
}
/**
- * Read data bytes as UTF-8 to a String.
+ * Read data bytes as {@value #CHARSET_NAME} to String.
*/
public static String readUTF(final byte data[]) {
return readUTF(data, 0, data.length);
}
/**
- * Read data bytes as UTF-8 to a String.
+ * Read data bytes as {@value #CHARSET_NAME} to String.
*/
public static String readUTF(final byte data[], final int off, final int len) {
- int offset = off;
- final StringBuilder sb = new StringBuilder();
- for (final int end = offset + len; offset < end;) {
- int ch = data[offset++] & 0xFF;
- switch (ch >> 4) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- // 0xxxxxxx
- break;
- case 12:
- case 13:
- if (offset >= len) {
- return null;
- }
- // 110x xxxx 10xx xxxx
- ch = ((ch & 0x1F) << 6) | (data[offset++] & 0x3F);
- break;
- case 14:
- if (offset + 2 >= len) {
- return null;
- }
- // 1110 xxxx 10xx xxxx 10xx xxxx
- ch = ((ch & 0x0f) << 12) | ((data[offset++] & 0x3F) << 6) | (data[offset++] & 0x3F);
- break;
- default:
- if (offset + 1 >= len) {
- return null;
- }
- // 10xx xxxx, 1111 xxxx
- ch = ((ch & 0x3F) << 4) | (data[offset++] & 0x0f);
- break;
- }
- sb.append((char) ch);
- }
- return sb.toString();
+ return new String(data, off, len, CHARSET_UTF_8);
}
public static void readProperties(final Map<String, byte[]> properties, final byte[] textBytes) throws Exception {
@@ -181,7 +141,8 @@ public class ByteWrangler {
}
byte data[] = out2.toByteArray();
if (data.length > MAX_VALUE_LENGTH) {
- throw new IOException("Cannot have individual values larger that 255 chars. Offending value: " + key + (val != null ? "" : "=" + val));
+ logger.warn("Cannot have individual values larger that 255 chars. Offending value: {}", key + (val == null ? "" : "=" + val));
+ return EMPTY_TXT;
}
out.write((byte) data.length);
out.write(data, 0, data.length);
@@ -201,7 +162,8 @@ public class ByteWrangler {
writeUTF(out2, text);
final byte data[] = out2.toByteArray();
if (data.length > MAX_VALUE_LENGTH) {
- throw new IOException("Cannot have individual values larger that 255 chars. Offending value: " + text);
+ logger.warn("Cannot have individual values larger that 255 chars. Offending value: {}", text);
+ return EMPTY_TXT;
}
out.write((byte) data.length);
out.write(data, 0, data.length);
View it on GitLab: https://salsa.debian.org/java-team/jmdns/compare/7577b598b24385a1505cd9013bf83cf15d8f2c22...ab1625d6e240c548f16b5a2e0a22f1c5d8613ae8
--
View it on GitLab: https://salsa.debian.org/java-team/jmdns/compare/7577b598b24385a1505cd9013bf83cf15d8f2c22...ab1625d6e240c548f16b5a2e0a22f1c5d8613ae8
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20181019/383ee483/attachment.html>
More information about the pkg-java-commits
mailing list