mirror of
https://github.com/moparisthebest/socat
synced 2024-12-22 06:58:47 -05:00
merged: compile problem caused by size_t/socklen_t mismatch; an invalid close() operation was performed
This commit is contained in:
parent
e0c0e66748
commit
448fa74706
6
CHANGES
6
CHANGES
@ -9,6 +9,12 @@ corrections:
|
|||||||
socat crashed on systems without setenv() (esp. SunOS up to Solaris 9);
|
socat crashed on systems without setenv() (esp. SunOS up to Solaris 9);
|
||||||
thanks to Todd Stansell for reporting this bug
|
thanks to Todd Stansell for reporting this bug
|
||||||
|
|
||||||
|
with unidirectional EXEC and SYSTEM a close() operation was performed
|
||||||
|
on a random number which could result in hanging e.a.
|
||||||
|
|
||||||
|
fixed a compile problem caused by size_t/socklen_t mismatch on 64bit
|
||||||
|
systems
|
||||||
|
|
||||||
####################### V 1.7.1.0:
|
####################### V 1.7.1.0:
|
||||||
|
|
||||||
new features:
|
new features:
|
||||||
|
2
VERSION
2
VERSION
@ -1 +1 @@
|
|||||||
"1.7.1.0+sigsegv+ftruncate64+fixsetenv"
|
"1.7.1.0+sigsegv+ftruncate64+fixsetenv+amd64+uniexec"
|
||||||
|
@ -554,8 +554,8 @@ int _xioopen_foxec(int xioflags, /* XIO_RDONLY etc. */
|
|||||||
} else
|
} else
|
||||||
#endif /* HAVE_PTY */
|
#endif /* HAVE_PTY */
|
||||||
if (usepipes) {
|
if (usepipes) {
|
||||||
Close(rdpip[1]);
|
if (rw == XIO_RDONLY) Close(rdpip[1]);
|
||||||
Close(wrpip[0]);
|
if (rw == XIO_WRONLY) Close(wrpip[0]);
|
||||||
} else {
|
} else {
|
||||||
Close(sv[1]);
|
Close(sv[1]);
|
||||||
}
|
}
|
||||||
|
62
xio-socket.c
62
xio-socket.c
@ -214,7 +214,7 @@ int xioopen_socket_connect(int argc, const char *argv[], struct opt *opts,
|
|||||||
int proto;
|
int proto;
|
||||||
int socktype = SOCK_STREAM;
|
int socktype = SOCK_STREAM;
|
||||||
int needbind = 0;
|
int needbind = 0;
|
||||||
union sockaddr_union them; socklen_t themlen;
|
union sockaddr_union them; socklen_t themlen; size_t themsize;
|
||||||
union sockaddr_union us; socklen_t uslen = sizeof(us);
|
union sockaddr_union us; socklen_t uslen = sizeof(us);
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@ -243,16 +243,16 @@ int xioopen_socket_connect(int argc, const char *argv[], struct opt *opts,
|
|||||||
applyopts(-1, opts, PH_INIT);
|
applyopts(-1, opts, PH_INIT);
|
||||||
applyopts(-1, opts, PH_EARLY);
|
applyopts(-1, opts, PH_EARLY);
|
||||||
|
|
||||||
themlen = 0;
|
themsize = 0;
|
||||||
if ((result =
|
if ((result =
|
||||||
dalan(address, (char *)&them.soa.sa_data, &themlen, sizeof(them)))
|
dalan(address, (char *)&them.soa.sa_data, &themsize, sizeof(them)))
|
||||||
< 0) {
|
< 0) {
|
||||||
Error1("data too long: \"%s\"", address);
|
Error1("data too long: \"%s\"", address);
|
||||||
} else if (result > 0) {
|
} else if (result > 0) {
|
||||||
Error1("syntax error in \"%s\"", address);
|
Error1("syntax error in \"%s\"", address);
|
||||||
}
|
}
|
||||||
them.soa.sa_family = pf;
|
them.soa.sa_family = pf;
|
||||||
themlen +=
|
themlen = themsize +
|
||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
sizeof(them.soa.sa_len) +
|
sizeof(them.soa.sa_len) +
|
||||||
#endif
|
#endif
|
||||||
@ -294,7 +294,7 @@ int xioopen_socket_listen(int argc, const char *argv[], struct opt *opts,
|
|||||||
int pf;
|
int pf;
|
||||||
int proto;
|
int proto;
|
||||||
int socktype = SOCK_STREAM;
|
int socktype = SOCK_STREAM;
|
||||||
union sockaddr_union us; socklen_t uslen;
|
union sockaddr_union us; socklen_t uslen; size_t ussize;
|
||||||
struct opt *opts0;
|
struct opt *opts0;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@ -320,15 +320,15 @@ int xioopen_socket_listen(int argc, const char *argv[], struct opt *opts,
|
|||||||
xfd->howtoend = END_SHUTDOWN;
|
xfd->howtoend = END_SHUTDOWN;
|
||||||
|
|
||||||
socket_init(0, &us);
|
socket_init(0, &us);
|
||||||
uslen = 0;
|
ussize = 0;
|
||||||
if ((result =
|
if ((result =
|
||||||
dalan(usname, (char *)&us.soa.sa_data, &uslen, sizeof(us)))
|
dalan(usname, (char *)&us.soa.sa_data, &ussize, sizeof(us)))
|
||||||
< 0) {
|
< 0) {
|
||||||
Error1("data too long: \"%s\"", usname);
|
Error1("data too long: \"%s\"", usname);
|
||||||
} else if (result > 0) {
|
} else if (result > 0) {
|
||||||
Error1("syntax error in \"%s\"", usname);
|
Error1("syntax error in \"%s\"", usname);
|
||||||
}
|
}
|
||||||
uslen += sizeof(us.soa.sa_family)
|
uslen = ussize + sizeof(us.soa.sa_family)
|
||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
+ sizeof(us.soa.sa_len)
|
+ sizeof(us.soa.sa_len)
|
||||||
#endif
|
#endif
|
||||||
@ -381,8 +381,8 @@ int _xioopen_socket_sendto(const char *pfname, const char *type,
|
|||||||
xiosingle_t *xfd = &xxfd->stream;
|
xiosingle_t *xfd = &xxfd->stream;
|
||||||
char *garbage;
|
char *garbage;
|
||||||
union sockaddr_union us = {{0}};
|
union sockaddr_union us = {{0}};
|
||||||
socklen_t uslen = 0;
|
socklen_t uslen = 0; size_t ussize;
|
||||||
socklen_t themlen = 0;
|
size_t themsize;
|
||||||
int pf;
|
int pf;
|
||||||
int socktype = SOCK_RAW;
|
int socktype = SOCK_RAW;
|
||||||
int proto;
|
int proto;
|
||||||
@ -411,16 +411,16 @@ int _xioopen_socket_sendto(const char *pfname, const char *type,
|
|||||||
xfd->howtoend = END_SHUTDOWN;
|
xfd->howtoend = END_SHUTDOWN;
|
||||||
|
|
||||||
xfd->peersa.soa.sa_family = pf;
|
xfd->peersa.soa.sa_family = pf;
|
||||||
themlen = 0;
|
themsize = 0;
|
||||||
if ((result =
|
if ((result =
|
||||||
dalan(address, (char *)&xfd->peersa.soa.sa_data, &themlen,
|
dalan(address, (char *)&xfd->peersa.soa.sa_data, &themsize,
|
||||||
sizeof(xfd->peersa)))
|
sizeof(xfd->peersa)))
|
||||||
< 0) {
|
< 0) {
|
||||||
Error1("data too long: \"%s\"", address);
|
Error1("data too long: \"%s\"", address);
|
||||||
} else if (result > 0) {
|
} else if (result > 0) {
|
||||||
Error1("syntax error in \"%s\"", address);
|
Error1("syntax error in \"%s\"", address);
|
||||||
}
|
}
|
||||||
xfd->salen = themlen + sizeof(sa_family_t)
|
xfd->salen = themsize + sizeof(sa_family_t)
|
||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
+ sizeof(xfd->peersa.soa.sa_len)
|
+ sizeof(xfd->peersa.soa.sa_len)
|
||||||
#endif
|
#endif
|
||||||
@ -428,7 +428,7 @@ int _xioopen_socket_sendto(const char *pfname, const char *type,
|
|||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
xfd->peersa.soa.sa_len =
|
xfd->peersa.soa.sa_len =
|
||||||
sizeof(xfd->peersa.soa.sa_len) + sizeof(xfd->peersa.soa.sa_family) +
|
sizeof(xfd->peersa.soa.sa_len) + sizeof(xfd->peersa.soa.sa_family) +
|
||||||
themlen;
|
themsize;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ...res_opts[] */
|
/* ...res_opts[] */
|
||||||
@ -442,16 +442,16 @@ int _xioopen_socket_sendto(const char *pfname, const char *type,
|
|||||||
xfd->dtype = XIODATA_RECVFROM;
|
xfd->dtype = XIODATA_RECVFROM;
|
||||||
|
|
||||||
if (retropt_string(opts, OPT_BIND, &bindstring) == 0) {
|
if (retropt_string(opts, OPT_BIND, &bindstring) == 0) {
|
||||||
uslen = 0;
|
ussize = 0;
|
||||||
if ((result =
|
if ((result =
|
||||||
dalan(bindstring, (char *)&us.soa.sa_data, &uslen, sizeof(us)))
|
dalan(bindstring, (char *)&us.soa.sa_data, &ussize, sizeof(us)))
|
||||||
< 0) {
|
< 0) {
|
||||||
Error1("data too long: \"%s\"", bindstring);
|
Error1("data too long: \"%s\"", bindstring);
|
||||||
} else if (result > 0) {
|
} else if (result > 0) {
|
||||||
Error1("syntax error in \"%s\"", bindstring);
|
Error1("syntax error in \"%s\"", bindstring);
|
||||||
}
|
}
|
||||||
us.soa.sa_family = pf;
|
us.soa.sa_family = pf;
|
||||||
uslen += sizeof(sa_family_t)
|
uslen = ussize + sizeof(sa_family_t)
|
||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
+ sizeof(us.soa.sa_len)
|
+ sizeof(us.soa.sa_len)
|
||||||
#endif
|
#endif
|
||||||
@ -477,7 +477,7 @@ int xioopen_socket_recvfrom(int argc, const char *argv[], struct opt *opts,
|
|||||||
const char *address = argv[4];
|
const char *address = argv[4];
|
||||||
char *garbage;
|
char *garbage;
|
||||||
union sockaddr_union *us = &xfd->para.socket.la;
|
union sockaddr_union *us = &xfd->para.socket.la;
|
||||||
socklen_t uslen = sizeof(*us);
|
socklen_t uslen; size_t ussize;
|
||||||
int pf, socktype, proto;
|
int pf, socktype, proto;
|
||||||
char *rangename;
|
char *rangename;
|
||||||
int result;
|
int result;
|
||||||
@ -508,16 +508,16 @@ int xioopen_socket_recvfrom(int argc, const char *argv[], struct opt *opts,
|
|||||||
/*retropt_int(opts, OPT_IP_PROTOCOL, &proto);*/
|
/*retropt_int(opts, OPT_IP_PROTOCOL, &proto);*/
|
||||||
xfd->howtoend = END_NONE;
|
xfd->howtoend = END_NONE;
|
||||||
|
|
||||||
uslen = 0;
|
ussize = 0;
|
||||||
if ((result =
|
if ((result =
|
||||||
dalan(address, (char *)&us->soa.sa_data, &uslen, sizeof(*us)))
|
dalan(address, (char *)&us->soa.sa_data, &ussize, sizeof(*us)))
|
||||||
< 0) {
|
< 0) {
|
||||||
Error1("data too long: \"%s\"", address);
|
Error1("data too long: \"%s\"", address);
|
||||||
} else if (result > 0) {
|
} else if (result > 0) {
|
||||||
Error1("syntax error in \"%s\"", address);
|
Error1("syntax error in \"%s\"", address);
|
||||||
}
|
}
|
||||||
us->soa.sa_family = pf;
|
us->soa.sa_family = pf;
|
||||||
uslen += sizeof(us->soa.sa_family)
|
uslen = ussize + sizeof(us->soa.sa_family)
|
||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
+ sizeof(us->soa.sa_len);
|
+ sizeof(us->soa.sa_len);
|
||||||
#endif
|
#endif
|
||||||
@ -554,7 +554,7 @@ int xioopen_socket_recv(int argc, const char *argv[], struct opt *opts,
|
|||||||
const char *address = argv[4];
|
const char *address = argv[4];
|
||||||
char *garbage;
|
char *garbage;
|
||||||
union sockaddr_union us;
|
union sockaddr_union us;
|
||||||
socklen_t uslen = sizeof(us);
|
socklen_t uslen; size_t ussize;
|
||||||
int pf, socktype, proto;
|
int pf, socktype, proto;
|
||||||
char *rangename;
|
char *rangename;
|
||||||
int result;
|
int result;
|
||||||
@ -585,16 +585,16 @@ int xioopen_socket_recv(int argc, const char *argv[], struct opt *opts,
|
|||||||
/*retropt_int(opts, OPT_IP_PROTOCOL, &proto);*/
|
/*retropt_int(opts, OPT_IP_PROTOCOL, &proto);*/
|
||||||
xfd->howtoend = END_NONE;
|
xfd->howtoend = END_NONE;
|
||||||
|
|
||||||
uslen = 0;
|
ussize = 0;
|
||||||
if ((result =
|
if ((result =
|
||||||
dalan(address, (char *)&us.soa.sa_data, &uslen, sizeof(us)))
|
dalan(address, (char *)&us.soa.sa_data, &ussize, sizeof(us)))
|
||||||
< 0) {
|
< 0) {
|
||||||
Error1("data too long: \"%s\"", address);
|
Error1("data too long: \"%s\"", address);
|
||||||
} else if (result > 0) {
|
} else if (result > 0) {
|
||||||
Error1("syntax error in \"%s\"", address);
|
Error1("syntax error in \"%s\"", address);
|
||||||
}
|
}
|
||||||
us.soa.sa_family = pf;
|
us.soa.sa_family = pf;
|
||||||
uslen += sizeof(sa_family_t)
|
uslen = ussize + sizeof(sa_family_t)
|
||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
+sizeof(us.soa.sa_len)
|
+sizeof(us.soa.sa_len)
|
||||||
#endif
|
#endif
|
||||||
@ -633,7 +633,7 @@ int xioopen_socket_datagram(int argc, const char *argv[], struct opt *opts,
|
|||||||
const char *address = argv[4];
|
const char *address = argv[4];
|
||||||
char *garbage;
|
char *garbage;
|
||||||
char *rangename;
|
char *rangename;
|
||||||
socklen_t themlen;
|
size_t themsize;
|
||||||
int pf;
|
int pf;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@ -653,20 +653,20 @@ int xioopen_socket_datagram(int argc, const char *argv[], struct opt *opts,
|
|||||||
xfd->howtoend = END_SHUTDOWN;
|
xfd->howtoend = END_SHUTDOWN;
|
||||||
|
|
||||||
xfd->peersa.soa.sa_family = pf;
|
xfd->peersa.soa.sa_family = pf;
|
||||||
themlen = 0;
|
themsize = 0;
|
||||||
if ((result =
|
if ((result =
|
||||||
dalan(address, (char *)&xfd->peersa.soa.sa_data, &themlen,
|
dalan(address, (char *)&xfd->peersa.soa.sa_data, &themsize,
|
||||||
sizeof(xfd->peersa)))
|
sizeof(xfd->peersa)))
|
||||||
< 0) {
|
< 0) {
|
||||||
Error1("data too long: \"%s\"", address);
|
Error1("data too long: \"%s\"", address);
|
||||||
} else if (result > 0) {
|
} else if (result > 0) {
|
||||||
Error1("syntax error in \"%s\"", address);
|
Error1("syntax error in \"%s\"", address);
|
||||||
}
|
}
|
||||||
xfd->salen = themlen + sizeof(sa_family_t);
|
xfd->salen = themsize + sizeof(sa_family_t);
|
||||||
#if HAVE_STRUCT_SOCKADDR_SALEN
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
xfd->peersa.soa.sa_len =
|
xfd->peersa.soa.sa_len =
|
||||||
sizeof(xfd->peersa.soa.sa_len) + sizeof(xfd->peersa.soa.sa_family) +
|
sizeof(xfd->peersa.soa.sa_len) + sizeof(xfd->peersa.soa.sa_family) +
|
||||||
themlen;
|
themsize;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((result =
|
if ((result =
|
||||||
|
Loading…
Reference in New Issue
Block a user