aboutsummaryrefslogtreecommitdiffstats
path: root/meta-networking/recipes-daemons/autofs/autofs-5.0.7/autofs-5.0.7-use-numeric-protocol-ids-instead-of-protoent-structs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-networking/recipes-daemons/autofs/autofs-5.0.7/autofs-5.0.7-use-numeric-protocol-ids-instead-of-protoent-structs.patch')
-rw-r--r--meta-networking/recipes-daemons/autofs/autofs-5.0.7/autofs-5.0.7-use-numeric-protocol-ids-instead-of-protoent-structs.patch471
1 files changed, 471 insertions, 0 deletions
diff --git a/meta-networking/recipes-daemons/autofs/autofs-5.0.7/autofs-5.0.7-use-numeric-protocol-ids-instead-of-protoent-structs.patch b/meta-networking/recipes-daemons/autofs/autofs-5.0.7/autofs-5.0.7-use-numeric-protocol-ids-instead-of-protoent-structs.patch
new file mode 100644
index 0000000000..113b0a06ef
--- /dev/null
+++ b/meta-networking/recipes-daemons/autofs/autofs-5.0.7/autofs-5.0.7-use-numeric-protocol-ids-instead-of-protoent-structs.patch
@@ -0,0 +1,471 @@
+autofs-5.0.7 - use numeric protocol ids instead of protoent structs
+
+From: Leonardo Chiquitto <leonardo.lists@gmail.com>
+
+The function getprotobyname() is not reentrant, so we can't call
+it simultaneously from multiple threads. Instead of switching to
+the reentrant version which adds more complexity to the code,
+lets use numeric protocol IDs instead of protoent structures.
+---
+
+ CHANGELOG | 1 +
+ include/rpc_subs.h | 4 +--
+ lib/rpc_subs.c | 80 ++++++++++++++++++--------------------------------
+ modules/replicated.c | 42 +++++++++++---------------
+ 4 files changed, 50 insertions(+), 77 deletions(-)
+
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 4cf5621..ba1d65b 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -23,6 +23,7 @@
+ - fix use get_proximity() without libtirpc.
+ - don't use dirent d_type to filter out files in scandir()
+ - don't schedule new alarms after readmap.
++- use numeric protocol ids instead of protoent structs.
+
+ 25/07/2012 autofs-5.0.7
+ =======================
+diff --git a/include/rpc_subs.h b/include/rpc_subs.h
+index ca474d9..b6d59f9 100644
+--- a/include/rpc_subs.h
++++ b/include/rpc_subs.h
+@@ -54,7 +54,7 @@ struct conn_info {
+ unsigned short port;
+ unsigned long program;
+ unsigned long version;
+- struct protoent *proto;
++ int proto;
+ unsigned int send_sz;
+ unsigned int recv_sz;
+ struct timeval timeout;
+@@ -66,7 +66,7 @@ int rpc_udp_getclient(struct conn_info *, unsigned int, unsigned int);
+ void rpc_destroy_udp_client(struct conn_info *);
+ int rpc_tcp_getclient(struct conn_info *, unsigned int, unsigned int);
+ void rpc_destroy_tcp_client(struct conn_info *);
+-int rpc_portmap_getclient(struct conn_info *, const char *, struct sockaddr *, size_t, const char *, unsigned int);
++int rpc_portmap_getclient(struct conn_info *, const char *, struct sockaddr *, size_t, int, unsigned int);
+ int rpc_portmap_getport(struct conn_info *, struct pmap *, unsigned short *);
+ int rpc_ping_proto(struct conn_info *);
+ int rpc_ping(const char *, long, long, unsigned int);
+diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
+index d33a3c4..ad1d557 100644
+--- a/lib/rpc_subs.c
++++ b/lib/rpc_subs.c
+@@ -170,7 +170,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i
+
+ *client = NULL;
+
+- proto = info->proto->p_proto;
++ proto = info->proto;
+ if (proto == IPPROTO_UDP)
+ type = SOCK_DGRAM;
+ else
+@@ -201,7 +201,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i
+ in4_raddr = (struct sockaddr_in *) addr;
+ in4_raddr->sin_port = htons(info->port);
+
+- switch (info->proto->p_proto) {
++ switch (info->proto) {
+ case IPPROTO_UDP:
+ clnt = clntudp_bufcreate(in4_raddr,
+ info->program, info->version,
+@@ -241,7 +241,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i
+
+ *client = NULL;
+
+- proto = info->proto->p_proto;
++ proto = info->proto;
+ if (proto == IPPROTO_UDP)
+ type = SOCK_DGRAM;
+ else
+@@ -292,11 +292,11 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i
+ nb_addr.maxlen = nb_addr.len = slen;
+ nb_addr.buf = addr;
+
+- if (info->proto->p_proto == IPPROTO_UDP)
++ if (info->proto == IPPROTO_UDP)
+ clnt = clnt_dg_create(*fd, &nb_addr,
+ info->program, info->version,
+ info->send_sz, info->recv_sz);
+- else if (info->proto->p_proto == IPPROTO_TCP) {
++ else if (info->proto == IPPROTO_TCP) {
+ ret = connect_nb(*fd, addr, slen, &info->timeout);
+ if (ret < 0)
+ return ret;
+@@ -355,7 +355,7 @@ static int create_client(struct conn_info *info, CLIENT **client)
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_ADDRCONFIG;
+ hints.ai_family = AF_UNSPEC;
+- if (info->proto->p_proto == IPPROTO_UDP)
++ if (info->proto == IPPROTO_UDP)
+ hints.ai_socktype = SOCK_DGRAM;
+ else
+ hints.ai_socktype = SOCK_STREAM;
+@@ -370,7 +370,7 @@ static int create_client(struct conn_info *info, CLIENT **client)
+
+ haddr = ai;
+ while (haddr) {
+- if (haddr->ai_protocol != info->proto->p_proto) {
++ if (haddr->ai_protocol != info->proto) {
+ haddr = haddr->ai_next;
+ continue;
+ }
+@@ -417,16 +417,11 @@ out_close:
+ int rpc_udp_getclient(struct conn_info *info,
+ unsigned int program, unsigned int version)
+ {
+- struct protoent *pe_proto;
+ CLIENT *client;
+ int ret;
+
+ if (!info->client) {
+- pe_proto = getprotobyname("udp");
+- if (!pe_proto)
+- return -ENOENT;
+-
+- info->proto = pe_proto;
++ info->proto = IPPROTO_UDP;
+ info->timeout.tv_sec = RPC_TOUT_UDP;
+ info->timeout.tv_usec = 0;
+ info->send_sz = UDPMSGSIZE;
+@@ -458,16 +453,11 @@ void rpc_destroy_udp_client(struct conn_info *info)
+ int rpc_tcp_getclient(struct conn_info *info,
+ unsigned int program, unsigned int version)
+ {
+- struct protoent *pe_proto;
+ CLIENT *client;
+ int ret;
+
+ if (!info->client) {
+- pe_proto = getprotobyname("tcp");
+- if (!pe_proto)
+- return -ENOENT;
+-
+- info->proto = pe_proto;
++ info->proto = IPPROTO_TCP;
+ info->timeout.tv_sec = RPC_TOUT_TCP;
+ info->timeout.tv_usec = 0;
+ info->send_sz = 0;
+@@ -513,23 +503,18 @@ void rpc_destroy_tcp_client(struct conn_info *info)
+
+ int rpc_portmap_getclient(struct conn_info *info,
+ const char *host, struct sockaddr *addr, size_t addr_len,
+- const char *proto, unsigned int option)
++ int proto, unsigned int option)
+ {
+- struct protoent *pe_proto;
+ CLIENT *client;
+ int ret;
+
+- pe_proto = getprotobyname(proto);
+- if (!pe_proto)
+- return -ENOENT;
+-
+ info->host = host;
+ info->addr = addr;
+ info->addr_len = addr_len;
+ info->program = PMAPPROG;
+ info->port = PMAPPORT;
+ info->version = PMAPVERS;
+- info->proto = pe_proto;
++ info->proto = proto;
+ info->send_sz = RPCSMALLMSGSIZE;
+ info->recv_sz = RPCSMALLMSGSIZE;
+ info->timeout.tv_sec = PMAP_TOUT_UDP;
+@@ -537,7 +522,7 @@ int rpc_portmap_getclient(struct conn_info *info,
+ info->close_option = option;
+ info->client = NULL;
+
+- if (pe_proto->p_proto == IPPROTO_TCP)
++ if (info->proto == IPPROTO_TCP)
+ info->timeout.tv_sec = PMAP_TOUT_TCP;
+
+ ret = create_client(info, &client);
+@@ -555,7 +540,7 @@ int rpc_portmap_getport(struct conn_info *info,
+ struct conn_info pmap_info;
+ CLIENT *client;
+ enum clnt_stat status;
+- int proto = info->proto->p_proto;
++ int proto = info->proto;
+ int ret;
+
+ memset(&pmap_info, 0, sizeof(struct conn_info));
+@@ -633,13 +618,13 @@ int rpc_ping_proto(struct conn_info *info)
+ {
+ CLIENT *client;
+ enum clnt_stat status;
+- int proto = info->proto->p_proto;
++ int proto = info->proto;
+ int ret;
+
+ if (info->client)
+ client = info->client;
+ else {
+- if (info->proto->p_proto == IPPROTO_UDP) {
++ if (info->proto == IPPROTO_UDP) {
+ info->send_sz = UDPMSGSIZE;
+ info->recv_sz = UDPMSGSIZE;
+ }
+@@ -688,7 +673,7 @@ int rpc_ping_proto(struct conn_info *info)
+
+ static unsigned int __rpc_ping(const char *host,
+ unsigned long version,
+- char *proto,
++ int proto,
+ long seconds, long micros,
+ unsigned int option)
+ {
+@@ -696,6 +681,7 @@ static unsigned int __rpc_ping(const char *host,
+ struct conn_info info;
+ struct pmap parms;
+
++ info.proto = proto;
+ info.host = host;
+ info.addr = NULL;
+ info.addr_len = 0;
+@@ -710,13 +696,9 @@ static unsigned int __rpc_ping(const char *host,
+
+ status = RPC_PING_FAIL;
+
+- info.proto = getprotobyname(proto);
+- if (!info.proto)
+- return status;
+-
+ parms.pm_prog = NFS_PROGRAM;
+ parms.pm_vers = version;
+- parms.pm_prot = info.proto->p_proto;
++ parms.pm_prot = info.proto;
+ parms.pm_port = 0;
+
+ status = rpc_portmap_getport(&info, &parms, &info.port);
+@@ -734,19 +716,19 @@ int rpc_ping(const char *host, long seconds, long micros, unsigned int option)
+ unsigned long vers2 = NFS2_VERSION;
+ unsigned int status;
+
+- status = __rpc_ping(host, vers2, "udp", seconds, micros, option);
++ status = __rpc_ping(host, vers2, IPPROTO_UDP, seconds, micros, option);
+ if (status > 0)
+ return RPC_PING_V2 | RPC_PING_UDP;
+
+- status = __rpc_ping(host, vers3, "udp", seconds, micros, option);
++ status = __rpc_ping(host, vers3, IPPROTO_UDP, seconds, micros, option);
+ if (status > 0)
+ return RPC_PING_V3 | RPC_PING_UDP;
+
+- status = __rpc_ping(host, vers2, "tcp", seconds, micros, option);
++ status = __rpc_ping(host, vers2, IPPROTO_TCP, seconds, micros, option);
+ if (status > 0)
+ return RPC_PING_V2 | RPC_PING_TCP;
+
+- status = __rpc_ping(host, vers3, "tcp", seconds, micros, option);
++ status = __rpc_ping(host, vers3, IPPROTO_TCP, seconds, micros, option);
+ if (status > 0)
+ return RPC_PING_V3 | RPC_PING_TCP;
+
+@@ -769,7 +751,7 @@ int rpc_time(const char *host,
+ double taken;
+ struct timeval start, end;
+ struct timezone tz;
+- char *proto = (ping_proto & RPC_PING_UDP) ? "udp" : "tcp";
++ int proto = (ping_proto & RPC_PING_UDP) ? IPPROTO_UDP : IPPROTO_TCP;
+ unsigned long vers = ping_vers;
+
+ gettimeofday(&start, &tz);
+@@ -791,12 +773,12 @@ static int rpc_get_exports_proto(struct conn_info *info, exports *exp)
+ {
+ CLIENT *client;
+ enum clnt_stat status;
+- int proto = info->proto->p_proto;
++ int proto = info->proto;
+ unsigned int option = info->close_option;
+ int vers_entry;
+ int ret;
+
+- if (info->proto->p_proto == IPPROTO_UDP) {
++ if (info->proto == IPPROTO_UDP) {
+ info->send_sz = UDPMSGSIZE;
+ info->recv_sz = UDPMSGSIZE;
+ }
+@@ -903,11 +885,9 @@ exports rpc_get_exports(const char *host, long seconds, long micros, unsigned in
+ parms.pm_port = 0;
+
+ /* Try UDP first */
+- info.proto = getprotobyname("udp");
+- if (!info.proto)
+- goto try_tcp;
++ info.proto = IPPROTO_UDP;
+
+- parms.pm_prot = info.proto->p_proto;
++ parms.pm_prot = info.proto;
+
+ status = rpc_portmap_getport(&info, &parms, &info.port);
+ if (status < 0)
+@@ -920,11 +900,9 @@ exports rpc_get_exports(const char *host, long seconds, long micros, unsigned in
+ return exportlist;
+
+ try_tcp:
+- info.proto = getprotobyname("tcp");
+- if (!info.proto)
+- return NULL;
++ info.proto = IPPROTO_TCP;
+
+- parms.pm_prot = info.proto->p_proto;
++ parms.pm_prot = info.proto;
+
+ status = rpc_portmap_getport(&info, &parms, &info.port);
+ if (status < 0)
+diff --git a/modules/replicated.c b/modules/replicated.c
+index 6b96320..dbd5513 100644
+--- a/modules/replicated.c
++++ b/modules/replicated.c
+@@ -419,7 +419,7 @@ void free_host_list(struct host **list)
+
+ static unsigned int get_nfs_info(unsigned logopt, struct host *host,
+ struct conn_info *pm_info, struct conn_info *rpc_info,
+- const char *proto, unsigned int version, int port)
++ int proto, unsigned int version, int port)
+ {
+ unsigned int random_selection = host->options & MOUNT_FLAG_RANDOM_SELECT;
+ unsigned int use_weight_only = host->options & MOUNT_FLAG_USE_WEIGHT_ONLY;
+@@ -433,22 +433,18 @@ static unsigned int get_nfs_info(unsigned logopt, struct host *host,
+ int status, count = 0;
+
+ if (host->addr)
+- debug(logopt, "called with host %s(%s) proto %s version 0x%x",
++ debug(logopt, "called with host %s(%s) proto %d version 0x%x",
+ host->name, get_addr_string(host->addr, buf, len),
+ proto, version);
+ else
+ debug(logopt,
+- "called for host %s proto %s version 0x%x",
++ "called for host %s proto %d version 0x%x",
+ host->name, proto, version);
+
+- rpc_info->proto = getprotobyname(proto);
+- if (!rpc_info->proto)
+- return 0;
+-
++ rpc_info->proto = proto;
+ memset(&parms, 0, sizeof(struct pmap));
+-
+ parms.pm_prog = NFS_PROGRAM;
+- parms.pm_prot = rpc_info->proto->p_proto;
++ parms.pm_prot = proto;
+
+ if (!(version & NFS4_REQUESTED))
+ goto v3_ver;
+@@ -479,7 +475,7 @@ static unsigned int get_nfs_info(unsigned logopt, struct host *host,
+ }
+ }
+
+- if (rpc_info->proto->p_proto == IPPROTO_UDP)
++ if (rpc_info->proto == IPPROTO_UDP)
+ status = rpc_udp_getclient(rpc_info, NFS_PROGRAM, NFS4_VERSION);
+ else
+ status = rpc_tcp_getclient(rpc_info, NFS_PROGRAM, NFS4_VERSION);
+@@ -540,7 +536,7 @@ v3_ver:
+ goto v2_ver;
+ }
+
+- if (rpc_info->proto->p_proto == IPPROTO_UDP)
++ if (rpc_info->proto == IPPROTO_UDP)
+ status = rpc_udp_getclient(rpc_info, NFS_PROGRAM, NFS3_VERSION);
+ else
+ status = rpc_tcp_getclient(rpc_info, NFS_PROGRAM, NFS3_VERSION);
+@@ -587,7 +583,7 @@ v2_ver:
+ goto done_ver;
+ }
+
+- if (rpc_info->proto->p_proto == IPPROTO_UDP)
++ if (rpc_info->proto == IPPROTO_UDP)
+ status = rpc_udp_getclient(rpc_info, NFS_PROGRAM, NFS2_VERSION);
+ else
+ status = rpc_tcp_getclient(rpc_info, NFS_PROGRAM, NFS2_VERSION);
+@@ -618,7 +614,7 @@ v2_ver:
+ }
+
+ done_ver:
+- if (rpc_info->proto->p_proto == IPPROTO_UDP) {
++ if (rpc_info->proto == IPPROTO_UDP) {
+ rpc_destroy_udp_client(rpc_info);
+ rpc_destroy_udp_client(pm_info);
+ } else {
+@@ -675,7 +671,7 @@ static int get_vers_and_cost(unsigned logopt, struct host *host,
+
+ if (version & TCP_REQUESTED) {
+ supported = get_nfs_info(logopt, host,
+- &pm_info, &rpc_info, "tcp", vers, port);
++ &pm_info, &rpc_info, IPPROTO_TCP, vers, port);
+ if (IS_ERR(supported)) {
+ if (ERR(supported) == EHOSTUNREACH ||
+ ERR(supported) == ETIMEDOUT)
+@@ -688,7 +684,7 @@ static int get_vers_and_cost(unsigned logopt, struct host *host,
+
+ if (version & UDP_REQUESTED) {
+ supported = get_nfs_info(logopt, host,
+- &pm_info, &rpc_info, "udp", vers, port);
++ &pm_info, &rpc_info, IPPROTO_UDP, vers, port);
+ if (IS_ERR(supported)) {
+ if (!ret && ERR(supported) == ETIMEDOUT)
+ return ret;
+@@ -709,7 +705,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host,
+ socklen_t len = INET6_ADDRSTRLEN;
+ char buf[len + 1];
+ struct conn_info pm_info, rpc_info;
+- const char *proto;
++ int proto;
+ unsigned int vers;
+ struct timeval start, end;
+ struct timezone tz;
+@@ -748,10 +744,10 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host,
+ * So, we do the conversion here.
+ */
+ if (version & UDP_SELECTED_MASK) {
+- proto = "udp";
++ proto = IPPROTO_UDP;
+ version >>= 8;
+ } else
+- proto = "tcp";
++ proto = IPPROTO_TCP;
+
+ switch (version) {
+ case NFS2_SUPPORTED:
+@@ -768,9 +764,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host,
+ return 0;
+ }
+
+- rpc_info.proto = getprotobyname(proto);
+- if (!rpc_info.proto)
+- return 0;
++ rpc_info.proto = proto;
+
+ if (port > 0)
+ rpc_info.port = port;
+@@ -786,14 +780,14 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host,
+
+ memset(&parms, 0, sizeof(struct pmap));
+ parms.pm_prog = NFS_PROGRAM;
+- parms.pm_prot = rpc_info.proto->p_proto;
++ parms.pm_prot = rpc_info.proto;
+ parms.pm_vers = vers;
+ ret = rpc_portmap_getport(&pm_info, &parms, &rpc_info.port);
+ if (ret < 0)
+ goto done;
+ }
+
+- if (rpc_info.proto->p_proto == IPPROTO_UDP)
++ if (rpc_info.proto == IPPROTO_UDP)
+ status = rpc_udp_getclient(&rpc_info, NFS_PROGRAM, vers);
+ else
+ status = rpc_tcp_getclient(&rpc_info, NFS_PROGRAM, vers);
+@@ -815,7 +809,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host,
+ }
+ }
+ done:
+- if (rpc_info.proto->p_proto == IPPROTO_UDP) {
++ if (rpc_info.proto == IPPROTO_UDP) {
+ rpc_destroy_udp_client(&rpc_info);
+ rpc_destroy_udp_client(&pm_info);
+ } else {