ws2_32: Improved error handling in gethostname when name length is insufficient.
This commit is contained in:
parent
5061e3502e
commit
bed1525fa4
|
@ -6056,16 +6056,35 @@ struct WS_servent* WINAPI WS_getservbyport(int port, const char *proto)
|
||||||
*/
|
*/
|
||||||
int WINAPI WS_gethostname(char *name, int namelen)
|
int WINAPI WS_gethostname(char *name, int namelen)
|
||||||
{
|
{
|
||||||
|
char buf[256];
|
||||||
|
int len;
|
||||||
|
|
||||||
TRACE("name %p, len %d\n", name, namelen);
|
TRACE("name %p, len %d\n", name, namelen);
|
||||||
|
|
||||||
if (gethostname(name, namelen) == 0)
|
if (!name)
|
||||||
{
|
{
|
||||||
TRACE("<- '%s'\n", name);
|
SetLastError(WSAEFAULT);
|
||||||
return 0;
|
return SOCKET_ERROR;
|
||||||
}
|
}
|
||||||
SetLastError((errno == EINVAL) ? WSAEFAULT : wsaErrno());
|
|
||||||
TRACE("<- ERROR !\n");
|
if (gethostname(buf, sizeof(buf)) != 0)
|
||||||
return SOCKET_ERROR;
|
{
|
||||||
|
SetLastError(wsaErrno());
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("<- '%s'\n", buf);
|
||||||
|
len = strlen(buf);
|
||||||
|
if (len > 15)
|
||||||
|
WARN("Windows supports NetBIOS name length up to 15 bytes!\n");
|
||||||
|
if (namelen <= len)
|
||||||
|
{
|
||||||
|
SetLastError(WSAEFAULT);
|
||||||
|
WARN("<- not enough space for hostname, required %d, got %d!\n", len + 1, namelen);
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
strcpy(name, buf);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4215,6 +4215,39 @@ static void test_gethostbyname_hack(void)
|
||||||
* resolve nonexistent host names to addresses of the ISP's spam pages. */
|
* resolve nonexistent host names to addresses of the ISP's spam pages. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_gethostname(void)
|
||||||
|
{
|
||||||
|
struct hostent *he;
|
||||||
|
char name[256];
|
||||||
|
int ret, len;
|
||||||
|
|
||||||
|
WSASetLastError(0xdeadbeef);
|
||||||
|
ret = gethostname(NULL, 256);
|
||||||
|
ok(ret == -1, "gethostname() returned %d\n", ret);
|
||||||
|
ok(WSAGetLastError() == WSAEFAULT, "gethostname with null buffer "
|
||||||
|
"failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT);
|
||||||
|
|
||||||
|
ret = gethostname(name, sizeof(name));
|
||||||
|
ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
|
||||||
|
he = gethostbyname(name);
|
||||||
|
ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
|
||||||
|
|
||||||
|
len = strlen(name);
|
||||||
|
WSASetLastError(0xdeadbeef);
|
||||||
|
strcpy(name, "deadbeef");
|
||||||
|
ret = gethostname(name, len);
|
||||||
|
ok(ret == -1, "gethostname() returned %d\n", ret);
|
||||||
|
ok(!strcmp(name, "deadbeef"), "name changed unexpected!\n");
|
||||||
|
ok(WSAGetLastError() == WSAEFAULT, "gethostname with insufficient length "
|
||||||
|
"failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT);
|
||||||
|
|
||||||
|
len++;
|
||||||
|
ret = gethostname(name, len);
|
||||||
|
ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
|
||||||
|
he = gethostbyname(name);
|
||||||
|
ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
static void test_inet_addr(void)
|
static void test_inet_addr(void)
|
||||||
{
|
{
|
||||||
u_long addr;
|
u_long addr;
|
||||||
|
@ -8437,6 +8470,7 @@ START_TEST( sock )
|
||||||
test_ioctlsocket();
|
test_ioctlsocket();
|
||||||
test_dns();
|
test_dns();
|
||||||
test_gethostbyname_hack();
|
test_gethostbyname_hack();
|
||||||
|
test_gethostname();
|
||||||
|
|
||||||
test_WSASendMsg();
|
test_WSASendMsg();
|
||||||
test_WSASendTo();
|
test_WSASendTo();
|
||||||
|
|
Loading…
Reference in New Issue