Skip to content

Commit cb5c9b8

Browse files
committed
DOH: fix DOH Get query issue.
1 parent 53f57b7 commit cb5c9b8

File tree

3 files changed

+60
-7
lines changed

3 files changed

+60
-7
lines changed

src/dns_server.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -7835,7 +7835,7 @@ static int _dns_server_tcp_process_one_request(struct dns_server_conn_tcp_client
78357835
}
78367836
}
78377837

7838-
int decode_len = SSL_base64_decode(base64_query, http_decode_data, DNS_IN_PACKSIZE);
7838+
int decode_len = SSL_base64_decode_ext(base64_query, http_decode_data, DNS_IN_PACKSIZE, 1, 1);
78397839
if (decode_len <= 0) {
78407840
tlog(TLOG_DEBUG, "decode query failed.");
78417841
goto errout;

src/util.c

+57-6
Original file line numberDiff line numberDiff line change
@@ -988,20 +988,55 @@ unsigned char *SSL_SHA256(const unsigned char *d, size_t n, unsigned char *md)
988988
return (md);
989989
}
990990

991-
int SSL_base64_decode(const char *in, unsigned char *out, int max_outlen)
991+
int SSL_base64_decode_ext(const char *in, unsigned char *out, int max_outlen, int url_safe, int auto_padding)
992992
{
993993
size_t inlen = strlen(in);
994+
char *in_padding_data = NULL;
995+
int padding_len = 0;
996+
const char *in_data = in;
994997
int outlen = 0;
995998

996-
if (max_outlen < (int)inlen / 4 * 3) {
997-
goto errout;
998-
}
999-
1000999
if (inlen == 0) {
10011000
return 0;
10021001
}
10031002

1004-
outlen = EVP_DecodeBlock(out, (unsigned char *)in, inlen);
1003+
if ((auto_padding == 1 && inlen % 4 != 0) || url_safe == 1) {
1004+
padding_len = 4 - inlen % 4;
1005+
in_padding_data = (char *)malloc(inlen + padding_len + 1);
1006+
if (in_padding_data == NULL) {
1007+
goto errout;
1008+
}
1009+
1010+
if (url_safe) {
1011+
for (size_t i = 0; i < inlen; i++) {
1012+
if (in[i] == '-') {
1013+
in_padding_data[i] = '+';
1014+
} else if (in[i] == '_') {
1015+
in_padding_data[i] = '/';
1016+
} else {
1017+
in_padding_data[i] = in[i];
1018+
}
1019+
}
1020+
} else {
1021+
memcpy(in_padding_data, in, inlen);
1022+
}
1023+
1024+
if (auto_padding) {
1025+
memset(in_padding_data + inlen, '=', padding_len);
1026+
} else {
1027+
padding_len = 0;
1028+
}
1029+
1030+
in_padding_data[inlen + padding_len] = '\0';
1031+
in_data = in_padding_data;
1032+
inlen += padding_len;
1033+
}
1034+
1035+
if (max_outlen < (int)inlen / 4 * 3) {
1036+
goto errout;
1037+
}
1038+
1039+
outlen = EVP_DecodeBlock(out, (unsigned char *)in_data, inlen);
10051040
if (outlen < 0) {
10061041
goto errout;
10071042
}
@@ -1011,11 +1046,27 @@ int SSL_base64_decode(const char *in, unsigned char *out, int max_outlen)
10111046
--outlen;
10121047
}
10131048

1049+
if (in_padding_data) {
1050+
free(in_padding_data);
1051+
}
1052+
1053+
outlen -= padding_len;
1054+
10141055
return outlen;
10151056
errout:
1057+
1058+
if (in_padding_data) {
1059+
free(in_padding_data);
1060+
}
1061+
10161062
return -1;
10171063
}
10181064

1065+
int SSL_base64_decode(const char *in, unsigned char *out, int max_outlen)
1066+
{
1067+
return SSL_base64_decode_ext(in, out, max_outlen, 0, 0);
1068+
}
1069+
10191070
int SSL_base64_encode(const void *in, int in_len, char *out)
10201071
{
10211072
int outlen = 0;

src/util.h

+2
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ unsigned char *SSL_SHA256(const unsigned char *d, size_t n, unsigned char *md);
114114

115115
int SSL_base64_decode(const char *in, unsigned char *out, int max_outlen);
116116

117+
int SSL_base64_decode_ext(const char *in, unsigned char *out, int max_outlen, int url_safe, int auto_padding);
118+
117119
int SSL_base64_encode(const void *in, int in_len, char *out);
118120

119121
int generate_cert_key(const char *key_path, const char *cert_path, const char *san, int days);

0 commit comments

Comments
 (0)