diff options
author | dnobori <da.git@softether.co.jp> | 2018-01-15 05:38:44 +0300 |
---|---|---|
committer | dnobori <da.git@softether.co.jp> | 2018-01-15 05:38:44 +0300 |
commit | c23142a8ffc35088047060989fc3d76c5b4e00af (patch) | |
tree | c6c9b8dbe7824c82e1121ffe38889214ad81049e /src/Mayaqua | |
parent | af7b4d4afba44fc04c808a95ad5f49f5682e796d (diff) |
v4.25-9656-rtmv4.25-9656-rtm
Diffstat (limited to 'src/Mayaqua')
-rw-r--r-- | src/Mayaqua/Encrypt.c | 12 | ||||
-rw-r--r-- | src/Mayaqua/Memory.c | 15 | ||||
-rw-r--r-- | src/Mayaqua/Memory.h | 1 | ||||
-rw-r--r-- | src/Mayaqua/Network.c | 12 | ||||
-rw-r--r-- | src/Mayaqua/Pack.c | 2 | ||||
-rw-r--r-- | src/Mayaqua/Str.c | 48 | ||||
-rw-r--r-- | src/Mayaqua/Str.h | 1 | ||||
-rw-r--r-- | src/Mayaqua/TcpIp.c | 18 | ||||
-rw-r--r-- | src/Mayaqua/Win32.c | 2 |
9 files changed, 102 insertions, 9 deletions
diff --git a/src/Mayaqua/Encrypt.c b/src/Mayaqua/Encrypt.c index 587f7d80..f3b3908e 100644 --- a/src/Mayaqua/Encrypt.c +++ b/src/Mayaqua/Encrypt.c @@ -1981,6 +1981,18 @@ X509 *NewX509(K *pub, K *priv, X *ca, NAME *name, UINT days, X_SERIAL *serial) X509_EXTENSION_free(eku);
}
+ // Alternative subject name
+ if (UniIsEmptyStr(name->CommonName) == false)
+ {
+ char alt_dns[MAX_PATH];
+
+ Format(alt_dns, sizeof(alt_dns), "DNS.1:%S", name->CommonName);
+
+ ex = X509V3_EXT_conf_nid(NULL, NULL, NID_subject_alt_name, alt_dns);
+ X509_add_ext(x509, ex, -1);
+ X509_EXTENSION_free(ex);
+ }
+
Lock(openssl_lock);
{
// Set the public key
diff --git a/src/Mayaqua/Memory.c b/src/Mayaqua/Memory.c index 15d8fb31..9aff9345 100644 --- a/src/Mayaqua/Memory.c +++ b/src/Mayaqua/Memory.c @@ -4313,6 +4313,21 @@ void Copy(void *dst, void *src, UINT size) memcpy(dst, src, size);
}
+// Memory move
+void Move(void *dst, void *src, UINT size)
+{
+ // Validate arguments
+ if (dst == NULL || src == NULL || size == 0 || dst == src)
+ {
+ return;
+ }
+
+ // KS
+ KS_INC(KS_COPY_COUNT);
+
+ memmove(dst, src, size);
+}
+
// Memory comparison
int Cmp(void *p1, void *p2, UINT size)
{
diff --git a/src/Mayaqua/Memory.h b/src/Mayaqua/Memory.h index d705adcb..630273cf 100644 --- a/src/Mayaqua/Memory.h +++ b/src/Mayaqua/Memory.h @@ -284,6 +284,7 @@ void *InternalReAlloc(void *addr, UINT size); void InternalFree(void *addr);
void Copy(void *dst, void *src, UINT size);
+void Move(void *dst, void *src, UINT size);
int Cmp(void *p1, void *p2, UINT size);
int CmpCaseIgnore(void *p1, void *p2, UINT size);
void ZeroMem(void *addr, UINT size);
diff --git a/src/Mayaqua/Network.c b/src/Mayaqua/Network.c index 85a67d6c..f5c12825 100644 --- a/src/Mayaqua/Network.c +++ b/src/Mayaqua/Network.c @@ -7373,7 +7373,7 @@ bool StrToIP6(IP *ip, char *str) if (StartWith(tmp, "[") && EndWith(tmp, "]"))
{
// If the string is enclosed in square brackets, remove brackets
- StrCpy(tmp, sizeof(tmp), &tmp[1]);
+ StrCpyAllowOverlap(tmp, sizeof(tmp), &tmp[1]);
if (StrLen(tmp) >= 1)
{
@@ -12691,6 +12691,14 @@ bool RecvAll(SOCK *sock, void *data, UINT size, bool secure) {
return false;
}
+ if (ret == SOCK_LATER)
+ {
+ // I suppose that this is safe because the RecvAll() function is used only
+ // if the sock->AsyncMode == true. And the Recv() function may return
+ // SOCK_LATER only if the sock->AsyncMode == false. Therefore the call of
+ // Recv() function in the RecvAll() function never returns SOCK_LATER.
+ return false;
+ }
recv_size += ret;
if (recv_size >= size)
{
@@ -17590,7 +17598,7 @@ void IPToInAddr6(struct in6_addr *addr, IP *ip) return;
}
- Zero(addr, sizeof(struct in_addr));
+ Zero(addr, sizeof(struct in6_addr));
if (IsIP6(ip))
{
diff --git a/src/Mayaqua/Pack.c b/src/Mayaqua/Pack.c index 3caafc8a..35a50a5c 100644 --- a/src/Mayaqua/Pack.c +++ b/src/Mayaqua/Pack.c @@ -354,7 +354,7 @@ VALUE *ReadValue(BUF *b, UINT type) break;
case VALUE_STR: // ANSI string
len = ReadBufInt(b);
- if ((len + 1) > MAX_VALUE_SIZE)
+ if (len > (MAX_VALUE_SIZE - 1))
{
// Size over
break;
diff --git a/src/Mayaqua/Str.c b/src/Mayaqua/Str.c index 1e5d14d8..0e1783db 100644 --- a/src/Mayaqua/Str.c +++ b/src/Mayaqua/Str.c @@ -3346,6 +3346,54 @@ UINT StrCpy(char *dst, UINT size, char *src) return len;
}
+UINT StrCpyAllowOverlap(char *dst, UINT size, char *src)
+{
+ UINT len;
+ // Validate arguments
+ if (dst == src)
+ {
+ return StrLen(src);
+ }
+ if (dst == NULL || src == NULL)
+ {
+ if (src == NULL && dst != NULL)
+ {
+ if (size >= 1)
+ {
+ dst[0] = '\0';
+ }
+ }
+ return 0;
+ }
+ if (size == 1)
+ {
+ dst[0] = '\0';
+ return 0;
+ }
+ if (size == 0)
+ {
+ // Ignore the length
+ size = 0x7fffffff;
+ }
+
+ // Check the length
+ len = StrLen(src);
+ if (len <= (size - 1))
+ {
+ Move(dst, src, len + 1);
+ }
+ else
+ {
+ len = size - 1;
+ Move(dst, src, len);
+ dst[len] = '\0';
+ }
+
+ // KS
+ KS_INC(KS_STRCPY_COUNT);
+
+ return len;
+}
// Check whether the string buffer is within the specified size
bool StrCheckSize(char *str, UINT size)
diff --git a/src/Mayaqua/Str.h b/src/Mayaqua/Str.h index ad5b0cb5..a81f2784 100644 --- a/src/Mayaqua/Str.h +++ b/src/Mayaqua/Str.h @@ -135,6 +135,7 @@ UINT StrSize(char *str); bool StrCheckLen(char *str, UINT len);
bool StrCheckSize(char *str, UINT size);
UINT StrCpy(char *dst, UINT size, char *src);
+UINT StrCpyAllowOverlap(char *dst, UINT size, char *src);
UINT StrCat(char *dst, UINT size, char *src);
UINT StrCatLeft(char *dst, UINT size, char *src);
char ToLower(char c);
diff --git a/src/Mayaqua/TcpIp.c b/src/Mayaqua/TcpIp.c index ba455edc..3c890d54 100644 --- a/src/Mayaqua/TcpIp.c +++ b/src/Mayaqua/TcpIp.c @@ -174,14 +174,14 @@ ICMP_RESULT *IcmpParseResult(IP *dest_ip, USHORT src_id, USHORT src_seqno, UCHAR if (true)
{
UINT ip_header_size = GetIpHeaderSize(recv_buffer, i);
- if (ip_header_size >= sizeof(IPV4_HEADER))
+ if (ip_header_size >= sizeof(IPV4_HEADER) && (ip_header_size <= i))
{
IPV4_HEADER *ipv4 = (IPV4_HEADER *)recv_buffer;
if ((IPV4_GET_VERSION(ipv4) == 4) && (ipv4->Protocol == IP_PROTO_ICMPV4))
{
UINT ip_total_len = (UINT)Endian16(ipv4->TotalLength);
- if ((ip_total_len >= sizeof(IPV4_HEADER)) && (ip_total_len <= i))
+ if ((ip_total_len >= sizeof(IPV4_HEADER)) && (ip_total_len <= i) && (ip_total_len >= ip_header_size))
{
UINT icmp_packet_size = ip_total_len - ip_header_size;
ICMP_HEADER *icmp = (ICMP_HEADER *)(recv_buffer + ip_header_size);
@@ -1957,7 +1957,7 @@ void CorrectChecksum(PKT *p) {
udp->Checksum = 0;
- if ((IPV4_GET_FLAGS(v4) & 0x01) == 0)
+ if ((IPV4_GET_FLAGS(v4) & 0x01) == 0 && (p->IPv4PayloadSize >= udp_len))
{
// Calculate the checksum correctly based on the data in case of a non-fragmented packet
udp->Checksum = CalcChecksumForIPv4(v4->SrcIP, v4->DstIP, IP_PROTO_UDP, udp, udp_len, 0);
@@ -2023,7 +2023,7 @@ void CorrectChecksum(PKT *p) {
udp->Checksum = 0;
- if (v6info->FragmentHeader == NULL || ((IPV6_GET_FLAGS(v6info->FragmentHeader) & IPV6_FRAGMENT_HEADER_FLAG_MORE_FRAGMENTS) == 0))
+ if ((v6info->FragmentHeader == NULL || ((IPV6_GET_FLAGS(v6info->FragmentHeader) & IPV6_FRAGMENT_HEADER_FLAG_MORE_FRAGMENTS) == 0)) && (v6info->PayloadSize >= udp_len))
{
// If the packet is not fragmented, recalculate the checksum
udp->Checksum = CalcChecksumForIPv6(&v6->SrcAddress, &v6->DestAddress, IP_PROTO_UDP, udp, udp_len, 0);
@@ -2868,6 +2868,7 @@ PKT *ParsePacketIPv4WithDummyMacHeader(UCHAR *buf, UINT size) {
UCHAR *tmp;
UINT tmp_size;
+ PKT *ret;
// Validate arguments
if (buf == NULL)
{
@@ -2880,7 +2881,14 @@ PKT *ParsePacketIPv4WithDummyMacHeader(UCHAR *buf, UINT size) WRITE_USHORT(tmp + 12, MAC_PROTO_IPV4);
Copy(tmp + 14, buf, size);
- return ParsePacket(tmp, tmp_size);
+ ret = ParsePacket(tmp, tmp_size);
+
+ if (ret == NULL)
+ {
+ Free(tmp);
+ }
+
+ return ret;
}
// IPv4 parsing
diff --git a/src/Mayaqua/Win32.c b/src/Mayaqua/Win32.c index 45c7d1b0..62dea990 100644 --- a/src/Mayaqua/Win32.c +++ b/src/Mayaqua/Win32.c @@ -548,7 +548,7 @@ DIRLIST *Win32EnumDirExW(wchar_t *dirname, COMPARE *compare) UniStrCpy(tmp2, sizeof(tmp2), dirname);
- if (UniStrLen(tmp2) >= 1 && tmp[UniStrLen(tmp2) - 1] == L'\\')
+ if (UniStrLen(tmp2) >= 1 && tmp2[UniStrLen(tmp2) - 1] == L'\\')
{
tmp2[UniStrLen(tmp2) - 1] = 0;
}
|