Skip to content

Commit e20271e

Browse files
author
이유비
committed
HADOOP-18087. fix bug when getting CNAME chain records and no record from remote dns server
1 parent dae33cf commit e20271e

File tree

1 file changed

+16
-5
lines changed
  • hadoop-common-project/hadoop-registry/src/main/java/org/apache/hadoop/registry/server/dns

1 file changed

+16
-5
lines changed

hadoop-common-project/hadoop-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,18 +1127,28 @@ private byte remoteLookup(Message response, Name name, int type,
11271127

11281128
// Always add any CNAMEs to the response first
11291129
if (type != Type.CNAME) {
1130-
Record[] cnameAnswers = getRecords(name, Type.CNAME);
1131-
if (cnameAnswers != null) {
1130+
Name targetName = name;
1131+
// support for CNAME chaining
1132+
for (int i = iterations; i < 6; i++) {
1133+
Record[] cnameAnswers = getRecords(targetName, Type.CNAME);
1134+
if (cnameAnswers == null) {
1135+
break;
1136+
}
11321137
for (Record cnameR : cnameAnswers) {
11331138
if (!response.findRecord(cnameR)) {
11341139
response.addRecord(cnameR, Section.ANSWER);
1140+
targetName = ((CNAMERecord) cnameR).getTarget();
11351141
}
11361142
}
11371143
}
11381144
}
11391145

11401146
// Forward lookup to primary DNS servers
11411147
Record[] answers = getRecords(name, type);
1148+
// no answer
1149+
if (answers == null) {
1150+
return Rcode.NOERROR;
1151+
}
11421152
try {
11431153
for (Record r : answers) {
11441154
if (!response.findRecord(r)) {
@@ -1148,10 +1158,11 @@ private byte remoteLookup(Message response, Name name, int type,
11481158
response.addRecord(r, Section.ANSWER);
11491159
}
11501160
}
1151-
if (r.getType() == Type.CNAME) {
1152-
Name cname = r.getName();
1161+
// when desired type is CNAME, don't follow CNAME chain
1162+
if (type != Type.CNAME && r.getType() == Type.CNAME) {
11531163
if (iterations < 6) {
1154-
remoteLookup(response, cname, type, iterations + 1);
1164+
Name cname = ((CNAMERecord) r).getTarget();
1165+
return remoteLookup(response, cname, type, iterations + 1);
11551166
}
11561167
}
11571168
}

0 commit comments

Comments
 (0)