From a8e8d22c31aaa2bfff6511017e883b5e751a3e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Wed, 24 Aug 2022 06:00:04 +0200 Subject: [PATCH] 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. --- modules/ca/src/client/iocinf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ca/src/client/iocinf.cpp b/modules/ca/src/client/iocinf.cpp index b2c30f7f9..c760a0d34 100644 --- a/modules/ca/src/client/iocinf.cpp +++ b/modules/ca/src/client/iocinf.cpp @@ -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);