Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
481d81cb
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
大约 1 年 前同步成功
通知
9
Star
18
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
481d81cb
编写于
1月 02, 2006
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make b_sock.c IPv6 savvy.
上级
c6cb42e4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
115 addition
and
29 deletion
+115
-29
crypto/bio/b_sock.c
crypto/bio/b_sock.c
+115
-29
未找到文件。
crypto/bio/b_sock.c
浏览文件 @
481d81cb
...
@@ -68,11 +68,9 @@
...
@@ -68,11 +68,9 @@
#ifndef OPENSSL_NO_SOCK
#ifndef OPENSSL_NO_SOCK
#ifdef OPENSSL_SYS_WIN16
#include <openssl/dso.h>
#define SOCKET_PROTOCOL 0
/* more microsoft stupidity */
#else
#define SOCKET_PROTOCOL IPPROTO_TCP
#define SOCKET_PROTOCOL IPPROTO_TCP
#endif
#ifdef SO_MAXCONN
#ifdef SO_MAXCONN
#define MAX_LISTEN SO_MAXCONN
#define MAX_LISTEN SO_MAXCONN
...
@@ -461,7 +459,12 @@ int BIO_sock_init(void)
...
@@ -461,7 +459,12 @@ int BIO_sock_init(void)
#endif
#endif
wsa_init_done
=
1
;
wsa_init_done
=
1
;
memset
(
&
wsa_state
,
0
,
sizeof
(
wsa_state
));
memset
(
&
wsa_state
,
0
,
sizeof
(
wsa_state
));
if
(
WSAStartup
(
0x0101
,
&
wsa_state
)
!=
0
)
/* Not making wsa_state available to the rest of the
* code is formally wrong. But the structures we use
* are [beleived to be] invariable among Winsock DLLs,
* while API availability is [expected to be] probed
* at run-time with DSO_global_lookup. */
if
(
WSAStartup
(
0x0202
,
&
wsa_state
)
!=
0
)
{
{
err
=
WSAGetLastError
();
err
=
WSAGetLastError
();
SYSerr
(
SYS_F_WSASTARTUP
,
err
);
SYSerr
(
SYS_F_WSASTARTUP
,
err
);
...
@@ -581,12 +584,13 @@ static int get_ip(const char *str, unsigned char ip[4])
...
@@ -581,12 +584,13 @@ static int get_ip(const char *str, unsigned char ip[4])
int
BIO_get_accept_socket
(
char
*
host
,
int
bind_mode
)
int
BIO_get_accept_socket
(
char
*
host
,
int
bind_mode
)
{
{
int
ret
=
0
;
int
ret
=
0
;
struct
sockaddr_in
server
,
client
;
struct
sockaddr
server
,
client
;
struct
sockaddr_in
*
sin
;
int
s
=
INVALID_SOCKET
,
cs
;
int
s
=
INVALID_SOCKET
,
cs
;
unsigned
char
ip
[
4
];
unsigned
char
ip
[
4
];
unsigned
short
port
;
unsigned
short
port
;
char
*
str
=
NULL
,
*
e
;
char
*
str
=
NULL
,
*
e
;
c
onst
c
har
*
h
,
*
p
;
char
*
h
,
*
p
;
unsigned
long
l
;
unsigned
long
l
;
int
err_num
;
int
err_num
;
...
@@ -600,8 +604,7 @@ int BIO_get_accept_socket(char *host, int bind_mode)
...
@@ -600,8 +604,7 @@ int BIO_get_accept_socket(char *host, int bind_mode)
{
{
if
(
*
e
==
':'
)
if
(
*
e
==
':'
)
{
{
p
=
&
(
e
[
1
]);
p
=
e
;
*
e
=
'\0'
;
}
}
else
if
(
*
e
==
'/'
)
else
if
(
*
e
==
'/'
)
{
{
...
@@ -609,21 +612,51 @@ int BIO_get_accept_socket(char *host, int bind_mode)
...
@@ -609,21 +612,51 @@ int BIO_get_accept_socket(char *host, int bind_mode)
break
;
break
;
}
}
}
}
if
(
p
)
*
p
++=
'\0'
;
/* points at last ':', '::port' is special [see below] */
if
(
p
==
NULL
)
else
p
=
h
,
h
=
NULL
;
#ifdef EAI_FAMILY
do
{
static
union
{
void
*
p
;
int
(
*
f
)(
const
char
*
,
const
char
*
,
const
struct
addrinfo
*
,
struct
addrinfo
**
);
}
getaddrinfo
=
{
NULL
};
static
union
{
void
*
p
;
void
(
*
f
)(
struct
addrinfo
*
);
}
freeaddrinfo
=
{
NULL
};
struct
addrinfo
*
res
,
hint
;
if
(
getaddrinfo
.
p
==
NULL
)
{
{
p
=
h
;
if
((
getaddrinfo
.
p
=
DSO_global_lookup
(
"getaddrinfo"
))
==
NULL
||
h
=
"*"
;
(
freeaddrinfo
.
p
=
DSO_global_lookup
(
"freeaddrinfo"
))
==
NULL
)
getaddrinfo
.
p
=
(
void
*
)
-
1
;
}
}
if
(
getaddrinfo
.
p
==
(
void
*
)
-
1
)
break
;
/* '::port' enforces IPv6 wildcard listener. Some OSes,
* e.g. Solaris, default to IPv6 without any hint. Also
* note that commonly IPv6 wildchard socket can service
* IPv4 connections just as well... */
memset
(
&
hint
,
0
,
sizeof
(
hint
));
if
(
h
&&
strchr
(
h
,
':'
))
hint
.
ai_family
=
AF_INET6
;
if
((
*
getaddrinfo
.
f
)(
h
,
p
,
&
hint
,
&
res
))
break
;
server
=
*
res
->
ai_addr
;
(
*
freeaddrinfo
.
f
)(
res
);
goto
again
;
}
while
(
0
);
#endif
if
(
!
BIO_get_port
(
p
,
&
port
))
goto
err
;
if
(
!
BIO_get_port
(
p
,
&
port
))
goto
err
;
memset
((
char
*
)
&
server
,
0
,
sizeof
(
server
));
memset
((
char
*
)
&
server
,
0
,
sizeof
(
server
));
server
.
sin_family
=
AF_INET
;
sin
=
(
struct
sockaddr_in
*
)
&
server
;
server
.
sin_port
=
htons
(
port
);
sin
->
sin_family
=
AF_INET
;
sin
->
sin_port
=
htons
(
port
);
if
(
strcmp
(
h
,
"*"
)
==
0
)
if
(
h
==
NULL
||
strcmp
(
h
,
"*"
)
==
0
)
s
erver
.
sin_addr
.
s_addr
=
INADDR_ANY
;
s
in
->
sin_addr
.
s_addr
=
INADDR_ANY
;
else
else
{
{
if
(
!
BIO_get_host_ip
(
h
,
&
(
ip
[
0
])))
goto
err
;
if
(
!
BIO_get_host_ip
(
h
,
&
(
ip
[
0
])))
goto
err
;
...
@@ -632,11 +665,11 @@ int BIO_get_accept_socket(char *host, int bind_mode)
...
@@ -632,11 +665,11 @@ int BIO_get_accept_socket(char *host, int bind_mode)
((
unsigned
long
)
ip
[
1
]
<<
16L
)
|
((
unsigned
long
)
ip
[
1
]
<<
16L
)
|
((
unsigned
long
)
ip
[
2
]
<<
8L
)
|
((
unsigned
long
)
ip
[
2
]
<<
8L
)
|
((
unsigned
long
)
ip
[
3
]);
((
unsigned
long
)
ip
[
3
]);
s
erver
.
sin_addr
.
s_addr
=
htonl
(
l
);
s
in
->
sin_addr
.
s_addr
=
htonl
(
l
);
}
}
again:
again:
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
SOCKET_PROTOCOL
);
s
=
socket
(
server
.
sa_family
,
SOCK_STREAM
,
SOCKET_PROTOCOL
);
if
(
s
==
INVALID_SOCKET
)
if
(
s
==
INVALID_SOCKET
)
{
{
SYSerr
(
SYS_F_SOCKET
,
get_last_socket_error
());
SYSerr
(
SYS_F_SOCKET
,
get_last_socket_error
());
...
@@ -654,17 +687,35 @@ again:
...
@@ -654,17 +687,35 @@ again:
bind_mode
=
BIO_BIND_NORMAL
;
bind_mode
=
BIO_BIND_NORMAL
;
}
}
#endif
#endif
if
(
bind
(
s
,
(
struct
sockaddr
*
)
&
server
,
sizeof
(
server
))
==
-
1
)
if
(
bind
(
s
,
&
server
,
sizeof
(
server
))
==
-
1
)
{
{
#ifdef SO_REUSEADDR
#ifdef SO_REUSEADDR
err_num
=
get_last_socket_error
();
err_num
=
get_last_socket_error
();
if
((
bind_mode
==
BIO_BIND_REUSEADDR_IF_UNUSED
)
&&
if
((
bind_mode
==
BIO_BIND_REUSEADDR_IF_UNUSED
)
&&
(
err_num
==
EADDRINUSE
))
(
err_num
==
EADDRINUSE
))
{
{
memcpy
((
char
*
)
&
client
,(
char
*
)
&
server
,
sizeof
(
server
));
client
=
server
;
if
(
strcmp
(
h
,
"*"
)
==
0
)
if
(
h
==
NULL
||
strcmp
(
h
,
"*"
)
==
0
)
client
.
sin_addr
.
s_addr
=
htonl
(
0x7F000001
);
{
cs
=
socket
(
AF_INET
,
SOCK_STREAM
,
SOCKET_PROTOCOL
);
#ifdef AF_INET6
if
(
client
.
sa_family
==
AF_INET6
)
{
struct
sockaddr_in6
*
sin
=
(
struct
sockaddr_in6
*
)
&
client
;
memset
(
&
sin
->
sin6_addr
,
0
,
sizeof
(
sin
->
sin6_addr
));
sin
->
sin6_addr
.
s6_addr
[
15
]
=
1
;
}
else
#endif
if
(
client
.
sa_family
==
AF_INET
)
{
struct
sockaddr_in
*
sin
=
(
struct
sockaddr_in
*
)
&
client
;
sin
->
sin_addr
.
s_addr
=
htonl
(
0x7F000001
);
}
else
goto
err
;
}
cs
=
socket
(
client
.
sa_family
,
SOCK_STREAM
,
SOCKET_PROTOCOL
);
if
(
cs
!=
INVALID_SOCKET
)
if
(
cs
!=
INVALID_SOCKET
)
{
{
int
ii
;
int
ii
;
...
@@ -708,20 +759,21 @@ err:
...
@@ -708,20 +759,21 @@ err:
int
BIO_accept
(
int
sock
,
char
**
addr
)
int
BIO_accept
(
int
sock
,
char
**
addr
)
{
{
int
ret
=
INVALID_SOCKET
;
int
ret
=
INVALID_SOCKET
;
static
struct
sockaddr_in
from
;
struct
sockaddr
from
;
struct
sockaddr_in
*
sin
;
unsigned
long
l
;
unsigned
long
l
;
unsigned
short
port
;
unsigned
short
port
;
int
len
;
int
len
;
char
*
p
;
char
*
p
;
memset
(
(
char
*
)
&
from
,
0
,
sizeof
(
from
));
memset
(
&
from
,
0
,
sizeof
(
from
));
len
=
sizeof
(
from
);
len
=
sizeof
(
from
);
/* Note: under VMS with SOCKETSHR the fourth parameter is currently
/* Note: under VMS with SOCKETSHR the fourth parameter is currently
* of type (int *) whereas under other systems it is (void *) if
* of type (int *) whereas under other systems it is (void *) if
* you don't have a cast it will choke the compiler: if you do
* you don't have a cast it will choke the compiler: if you do
* have a cast then you can either go for (int *) or (void *).
* have a cast then you can either go for (int *) or (void *).
*/
*/
ret
=
accept
(
sock
,
(
struct
sockaddr
*
)
&
from
,(
void
*
)
&
len
);
ret
=
accept
(
sock
,
&
from
,(
void
*
)
&
len
);
if
(
ret
==
INVALID_SOCKET
)
if
(
ret
==
INVALID_SOCKET
)
{
{
if
(
BIO_sock_should_retry
(
ret
))
return
-
2
;
if
(
BIO_sock_should_retry
(
ret
))
return
-
2
;
...
@@ -732,8 +784,42 @@ int BIO_accept(int sock, char **addr)
...
@@ -732,8 +784,42 @@ int BIO_accept(int sock, char **addr)
if
(
addr
==
NULL
)
goto
end
;
if
(
addr
==
NULL
)
goto
end
;
l
=
ntohl
(
from
.
sin_addr
.
s_addr
);
#ifdef EAI_FAMILY
port
=
ntohs
(
from
.
sin_port
);
do
{
char
h
[
NI_MAXHOST
],
s
[
NI_MAXSERV
];
size_t
l
;
static
union
{
void
*
p
;
int
(
*
f
)(
const
struct
sockaddr
*
,
socklen_t
,
char
*
,
size_t
,
char
*
,
size_t
,
int
);
}
getnameinfo
=
{
NULL
};
if
(
getnameinfo
.
p
==
NULL
)
{
if
((
getnameinfo
.
p
=
DSO_global_lookup
(
"getnameinfo"
))
==
NULL
)
getnameinfo
.
p
=
(
void
*
)
-
1
;
}
if
(
getnameinfo
.
p
==
(
void
*
)
-
1
)
break
;
if
((
*
getnameinfo
.
f
)(
&
from
,
sizeof
(
from
),
h
,
sizeof
(
h
),
s
,
sizeof
(
s
),
NI_NUMERICHOST
|
NI_NUMERICSERV
))
break
;
l
=
strlen
(
h
)
+
strlen
(
p
)
+
2
;
if
(
len
<
24
)
len
=
24
;
p
=
*
addr
;
if
(
p
)
p
=
OPENSSL_realloc
(
p
,
l
);
else
p
=
OPENSSL_malloc
(
l
);
if
(
p
==
NULL
)
{
BIOerr
(
BIO_F_BIO_ACCEPT
,
ERR_R_MALLOC_FAILURE
);
goto
end
;
}
*
addr
=
p
;
BIO_snprintf
(
*
addr
,
l
,
"%s:%s"
,
h
,
s
);
goto
end
;
}
while
(
0
);
#endif
if
(
from
.
sa_family
!=
AF_INET
)
goto
end
;
sin
=
(
struct
sockaddr_in
*
)
&
from
;
l
=
ntohl
(
sin
->
sin_addr
.
s_addr
);
port
=
ntohs
(
sin
->
sin_port
);
if
(
*
addr
==
NULL
)
if
(
*
addr
==
NULL
)
{
{
if
((
p
=
OPENSSL_malloc
(
24
))
==
NULL
)
if
((
p
=
OPENSSL_malloc
(
24
))
==
NULL
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录