diff options
Diffstat (limited to 'rpc/rpc-lib/src/rpcsvc.c')
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 55 | 
1 files changed, 35 insertions, 20 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index ffc6b763590..cd8e3f18b0a 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -46,10 +46,15 @@  struct rpcsvc_program gluster_dump_prog; -#define rpcsvc_alloc_request(svc, request)                              \ -        do {                                                            \ -                request = (rpcsvc_request_t *) mem_get ((svc)->rxpool); \ -                memset (request, 0, sizeof (rpcsvc_request_t));         \ +#define rpcsvc_alloc_request(svc, request)                                \ +        do {                                                              \ +                request = (rpcsvc_request_t *)mem_get ((svc)->rxpool);   \ +                if (request) {                                            \ +                        memset (request, 0, sizeof (rpcsvc_request_t));   \ +                } else {                                                  \ +                        gf_log ("rpcsvc", GF_LOG_ERROR,                   \ +                                "error getting memory for rpc request");  \ +                }                                                         \          } while (0)  rpcsvc_listener_t * @@ -1353,6 +1358,10 @@ rpcsvc_submit_generic (rpcsvc_request_t *req, struct iovec *proghdr,                                            proghdr, hdrcount,                                            payload, payloadcount);                  UNLOCK (&drc->lock); +                if (ret < 0) { +                        gf_log (GF_RPCSVC, GF_LOG_ERROR, +                                "failed to cache reply"); +                }          }          ret = rpcsvc_transport_submit (trans, &recordhdr, 1, proghdr, hdrcount, @@ -1665,11 +1674,6 @@ rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t *program)          }          pthread_rwlock_unlock (&svc->rpclock); -        if (prog == NULL) { -                ret = -1; -                goto out; -        } -          gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Program unregistered: %s, Num: %d,"                  " Ver: %d, Port: %d", prog->progname, prog->prognum,                  prog->progver, prog->progport); @@ -2046,9 +2050,13 @@ rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program,                  newprog->ownthread = _gf_false;          if (newprog->ownthread) { -                gf_thread_create (&newprog->thread, NULL, -                                  rpcsvc_request_handler, -                                  newprog, "rpcsvcrh"); +                ret = gf_thread_create (&newprog->thread, NULL, +                                        rpcsvc_request_handler, +                                        newprog, "rpcsvcrh"); +                if (ret != 0) { +                        gf_log (GF_RPCSVC, GF_LOG_ERROR, +                                "error creating request handler thread"); +                }          }          pthread_rwlock_wrlock (&svc->rpclock); @@ -2884,17 +2892,24 @@ rpcsvc_match_subnet_v4 (const char *addrtok, const char *ipaddr)                  goto out;          /* Find the network socket addr of subnet pattern */ -        slash = strchr (netaddr, '/'); -        *slash = '\0';          if (inet_pton (AF_INET, netaddr, &sin2.sin_addr) == 0)                  goto out; -        /* -         * Find the IPv4 network mask in network byte order. -         * IMP: String slash+1 is already validated, it cant have value -         * more than IPv4_ADDR_SIZE (32). -         */ -        prefixlen = (uint32_t) atoi (slash + 1); +        slash = strchr (netaddr, '/'); +        if (slash) { +                *slash = '\0'; +                /* +                 * Find the IPv4 network mask in network byte order. +                 * IMP: String slash+1 is already validated, it cant have value +                 * more than IPv4_ADDR_SIZE (32). +                 */ +                prefixlen = (uint32_t) atoi (slash + 1); +                if (prefixlen > 31) +                        goto out; +        } else { +                goto out; +        } +          shift = IPv4_ADDR_SIZE - prefixlen;          mask.sin_addr.s_addr = htonl ((uint32_t)~0 << shift);  | 
