multipathd: fix memory allocation logic error for polls in uxsock_listen()
authortang.junhui <tang.junhui@zte.com.cn>
Wed, 10 Aug 2016 09:32:40 +0000 (17:32 +0800)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 10 Aug 2016 09:48:00 +0000 (11:48 +0200)
logic error exists in memory allocation for polls in uxsock_listen(), even if the allocated memory size meet the needs, it is still to realloc memory, which is not up to expectations.

Signed-off-by: tang.junhui <tang.junhui@zte.com.cn>
multipathd/uxlsnr.c

index f114e59..fa29b2a 100644 (file)
@@ -145,7 +145,7 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
        pthread_cleanup_push(uxsock_cleanup, NULL);
 
        condlog(3, "uxsock: startup listener");
-       polls = (struct pollfd *)MALLOC(MIN_POLLS + 1);
+       polls = (struct pollfd *)MALLOC((MIN_POLLS + 1) * sizeof(struct pollfd));
        if (!polls) {
                condlog(0, "uxsock: failed to allocate poll fds");
                return NULL;
@@ -167,9 +167,11 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
                }
                if (num_clients != old_clients) {
                        struct pollfd *new;
-                       if (num_clients < MIN_POLLS) {
+                       if (num_clients <= MIN_POLLS && old_clients > MIN_POLLS) {
                                new = REALLOC(polls, (1 + MIN_POLLS) *
                                                sizeof(struct pollfd));
+                       } else if (num_clients <= MIN_POLLS && old_clients <= MIN_POLLS) {
+                               new = polls;
                        } else {
                                new = REALLOC(polls, (1+num_clients) *
                                                sizeof(struct pollfd));
@@ -181,7 +183,7 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
                                pthread_yield();
                                continue;
                        }
-                       num_clients = old_clients;
+                       old_clients = num_clients;
                        polls = new;
                }
                polls[0].fd = ux_sock;