… | |
… | |
117 | memset (enc, (char) 0, 256); |
117 | memset (enc, (char) 0, 256); |
118 | memset (dec, (char)INVALID, 256); |
118 | memset (dec, (char)INVALID, 256); |
119 | |
119 | |
120 | for (size = 0; cmap [size]; size++) |
120 | for (size = 0; cmap [size]; size++) |
121 | { |
121 | { |
|
|
122 | char c = cmap [size]; |
|
|
123 | |
122 | enc [size] = cmap [size]; |
124 | enc [size] = c; |
123 | dec [(u8)enc [size]] = size; |
125 | dec [(u8)c] = size; |
|
|
126 | |
|
|
127 | // allow lowercase/uppercase aliases if possible |
|
|
128 | if (c >= 'A' && c <= 'Z' && dec [c + ('a' - 'A')] == INVALID) dec [c + ('a' - 'A')] = size; |
|
|
129 | if (c >= 'a' && c <= 'z' && dec [c - ('a' - 'A')] == INVALID) dec [c - ('a' - 'A')] = size; |
124 | } |
130 | } |
125 | |
131 | |
126 | assert (size < 256); |
132 | assert (size < 256); |
127 | } |
133 | } |
128 | |
134 | |
… | |
… | |
819 | |
825 | |
820 | rcvseq = (rcvseq + 1) & SEQNO_MASK; |
826 | rcvseq = (rcvseq + 1) & SEQNO_MASK; |
821 | |
827 | |
822 | if (!rcvdq.put (r->data, r->datalen)) |
828 | if (!rcvdq.put (r->data, r->datalen)) |
823 | { |
829 | { |
|
|
830 | // MUST never overflow, can be caused by data corruption, TODO |
824 | slog (L_ERR, "DNS: !rcvdq.put (r->data, r->datalen)"); |
831 | slog (L_CRIT, "DNS: !rcvdq.put (r->data, r->datalen)"); |
825 | abort (); // MUST never overflow, can be caused by data corruption, TODO |
832 | c->dnsv4_reset_connection (); |
|
|
833 | return; |
826 | } |
834 | } |
827 | |
835 | |
828 | while (vpn_packet *pkt = rcvdq.get ()) |
836 | while (vpn_packet *pkt = rcvdq.get ()) |
829 | { |
837 | { |
830 | sockinfo si; |
838 | sockinfo si; |
831 | si.host = htonl (c->conf->id); si.port = 0; si.prot = PROT_DNSv4; |
839 | si.host = htonl (c->conf->id); si.port = 0; si.prot = PROT_DNSv4; |
832 | |
840 | |
833 | vpn->recv_vpn_packet (pkt, si); |
841 | vpn->recv_vpn_packet (pkt, si); |
834 | |
|
|
835 | delete pkt; |
842 | delete pkt; |
836 | } |
843 | } |
837 | |
844 | |
838 | // check for further packets |
845 | // check for further packets |
839 | goto redo; |
846 | goto redo; |
… | |
… | |
1137 | |
1144 | |
1138 | if (ip [3] == CMD_IP_RST) |
1145 | if (ip [3] == CMD_IP_RST) |
1139 | { |
1146 | { |
1140 | slog (L_DEBUG, _("DNS: got tunnel RST request")); |
1147 | slog (L_DEBUG, _("DNS: got tunnel RST request")); |
1141 | |
1148 | |
1142 | delete dns; c->dns = 0; |
1149 | c->dnsv4_reset_connection (); |
1143 | |
|
|
1144 | return; |
|
|
1145 | } |
1150 | } |
1146 | else if (ip [3] == CMD_IP_SYN) |
1151 | else if (ip [3] == CMD_IP_SYN) |
1147 | { |
1152 | { |
1148 | slog (L_DEBUG, _("DNS: got tunnel SYN reply, server likes us.")); |
1153 | slog (L_DEBUG, _("DNS: got tunnel SYN reply, server likes us.")); |
1149 | dns->established = true; |
1154 | dns->established = true; |
1150 | } |
1155 | } |
1151 | else if (ip [3] == CMD_IP_REJ) |
1156 | else if (ip [3] == CMD_IP_REJ) |
1152 | { |
|
|
1153 | slog (L_DEBUG, _("DNS: got tunnel REJ reply, server does not like us, aborting.")); |
1157 | slog (L_ERR, _("DNS: got tunnel REJ reply, server does not like us.")); |
1154 | abort (); |
|
|
1155 | } |
|
|
1156 | else |
1158 | else |
1157 | slog (L_INFO, _("DNS: got unknown meta command %02x"), ip [3]); |
1159 | slog (L_INFO, _("DNS: got unknown meta command %02x"), ip [3]); |
1158 | } |
1160 | } |
1159 | else |
1161 | else |
1160 | slog (L_INFO, _("DNS: got spurious a record %d.%d.%d.%d"), |
1162 | slog (L_INFO, _("DNS: got spurious a record %d.%d.%d.%d"), |