iocinf.cpp: Hostnames may be longer than 32 bytes
Found here at ESS:
(all in one line)
EPICS_CA_ADDR_LIST=averylonghostname.mylabnetwork.technicalnetwork.example.com
EPICS_CA_AUTO_ADDR_LIST=NO
caget somePVnam
leads to something like this:
CA.Client.Exception...............................................
Warning: "Empty PV search address list"
Source File: ../udpiiu.cpp line 403
Current Time: Thu Jun 09 2022 10:10:47.804161447
Problem desription:
addAddrToChannelAccessAddressList() will collect what ever we specify in
EPICS_CA_ADDR_LIST for channel access.
That function will add IP-addresses to the search list.
hostnames are possible, but are ignored if longer than 32 bytes,
because buf is too short.
If a hostname can be resolved into an IP, that is fine,
if not that is "fine as well" (better say: silently ignored):
If, and only if, EPICS_CA_AUTO_ADDR_LIST=NO is given then the one
and only too long hostname will be ignored and lead to an
"Empty PV search address list".
If EPICS_CA_AUTO_ADDR_LIST=YES (or nothing) is specified, the search list
is not empty, and EPICS will search all broadcast addresses.
This will eventually lead into a timout.
Solution:
Increase the buf size in addAddrToChannelAccessAddressList() from 32 to 256
The maximum length for a hostname is 255:
https://www.ietf.org/rfc/rfc1034.txt
If we add one byte for the string terminating '\0', we need 256 bytes.
And yes, this patch neglets the fact that a user can specify HOSTNAME:PORT,
which may need another 6 bytes. To put it the other way around:
In this case the hostname length is limited to 250 bytes,
which is still long enough in practice.
This commit is contained in:
committed by
Michael Davidsaver
parent
c2df1c6fe5
commit
a8e8d22c31
@@ -79,7 +79,7 @@ extern "C" int epicsStdCall addAddrToChannelAccessAddressList
|
||||
const char *pStr;
|
||||
const char *pToken;
|
||||
struct sockaddr_in addr;
|
||||
char buf[32u]; /* large enough to hold an IP address */
|
||||
char buf[256u]; /* large enough to hold an IP address or hostname */
|
||||
int status, ret = -1;
|
||||
|
||||
pStr = envGetConfigParamPtr (pEnv);
|
||||
|
||||
Reference in New Issue
Block a user