Skip to content

Commit

Permalink
ACE_INET_Addr::set errantly succeeds when ACE_LACKS_GETSERVBYNAME
Browse files Browse the repository at this point in the history
Problem
-------

Calling `set("1.2.3.4")` on an ACE_INET_Addr eventually tries to part
it as a port name.  When `ACE_LACKS_GETSERVBYNAME`, this succeeds
returning port number 0 with the reset address.

When port names are not expected, this breaks a useful idiom of
parsing addresses that may or may not contain port numbers:

    ACE_INET_Addr addr;
    if (addr.set(x) == 0) {
      // Success, address contained a port number
    } else if (addr.set(u_short(0), x) == 0) {
      // Success, address did not contain a port number.
    } else {
      // Fail
    }

Solution
--------

Return -1 for the port number when `ACE_LACKS_GETSERVBYNAME`.
  • Loading branch information
jrw972 committed Jun 22, 2023
1 parent ab6ab47 commit 395f5e5
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
3 changes: 1 addition & 2 deletions ACE/ace/INET_Addr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -468,12 +468,11 @@ static int get_port_number_from_name (const char port_name[],
}

// We try to resolve port number from its name.
port_number = -1;
#if defined (ACE_LACKS_GETSERVBYNAME)
port_number = 0;
ACE_UNUSED_ARG (port_name);
ACE_UNUSED_ARG (protocol);
#else
port_number = -1;
servent sentry;
ACE_SERVENT_DATA buf;
servent *sp = ACE_OS::getservbyname_r (port_name,
Expand Down
40 changes: 40 additions & 0 deletions ACE/tests/INET_Addr_Test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,43 @@ static bool test_multiple ()
return success;
}

static bool test_port_names()
{
bool success = true;

ACE_INET_Addr addr;

#if defined (ACE_LACKS_GETSERVBYNAME)
// Since we don't have getservbyname, the call to set should fail.
// Check that the call does in fact fail.
if (addr.set("telnet") == 0)
{
ACE_ERROR ((LM_ERROR, ACE_TEXT ("set with 'telnet' succeeded (expected failure)\n")));
success = false;
}
#else
if (addr.set("telnet") != 0)
{
ACE_ERROR ((LM_ERROR, ACE_TEXT ("set with 'telnet' failed (expected success)\n")));
success = false;
}

if (addr != ACE_INET_Addr("0.0.0.0:23"))
{
ACE_ERROR ((LM_ERROR, ACE_TEXT ("set with 'telnet' failed to yield correct address\n")));
success = false;
}
#endif /* ACE_LACKS_GETSERVBYNAME */

if (addr.set("not a port name") == 0)
{
ACE_ERROR ((LM_ERROR, ACE_TEXT ("set with 'not a port name' succeeded (expected failure)\n")));
success = false;
}

return success;
}

struct Address {
const char* name;
bool loopback;
Expand Down Expand Up @@ -561,6 +598,9 @@ int run_main (int, ACE_TCHAR *[])
status = 1;
}

if (!test_port_names ())
status = 1;

ACE_END_TEST;

return status;
Expand Down

0 comments on commit 395f5e5

Please sign in to comment.