From 169a64f7066a5d079c60e816a81325094ed8ad74 Mon Sep 17 00:00:00 2001 From: Gaurav Yadav Date: Mon, 22 May 2017 23:25:47 +0530 Subject: libglusterfs : Fix crash in glusterd while peer probing glusterd crashes when port is being set explcitly to a range which is outside greater than short data type range. Eg. sysctl net.ipv4.ip_local_reserved_ports="49152-49156" In above case glusterd crashes while parsing the port. With this fix glusterd will be able to handle port range between INT_MIN to INT_MAX > Reviewed-on: https://review.gluster.org/17359 > Smoke: Gluster Build System > NetBSD-regression: NetBSD Build System > CentOS-regression: Gluster Build System > Reviewed-by: Samikshan Bairagya > Reviewed-by: Atin Mukherjee > Reviewed-by: Niels de Vos > Reviewed-by: Jeff Darcy Change-Id: I7c75ee67937b0e3384502973d96b1c36c89e0fe1 BUG: 1459759 Signed-off-by: Gaurav Yadav Reviewed-on: https://review.gluster.org/17496 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Samikshan Bairagya CentOS-regression: Gluster Build System Reviewed-by: Shyamsundar Ranganathan --- libglusterfs/src/common-utils.c | 10 +++++----- tests/bugs/glusterd/bug-1454418-seg-fault.t | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 tests/bugs/glusterd/bug-1454418-seg-fault.t diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 6ea4fd14374..1b24d3ee6fe 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -3039,14 +3039,14 @@ gf_ports_reserved (char *blocked_port, unsigned char *ports, uint32_t ceiling) { gf_boolean_t result = _gf_false; char *range_port = NULL; - int16_t tmp_port1 = -1; - int16_t tmp_port2 = -1; + int32_t tmp_port1 = -1; + int32_t tmp_port2 = -1; if (strstr (blocked_port, "-") == NULL) { /* get rid of the new line character*/ if (blocked_port[strlen(blocked_port) -1] == '\n') blocked_port[strlen(blocked_port) -1] = '\0'; - if (gf_string2int16 (blocked_port, &tmp_port1) == 0) { + if (gf_string2int32 (blocked_port, &tmp_port1) == 0) { if (tmp_port1 > ceiling || tmp_port1 < 0) { gf_msg ("glusterfs-socket", GF_LOG_WARNING, 0, @@ -3072,7 +3072,7 @@ gf_ports_reserved (char *blocked_port, unsigned char *ports, uint32_t ceiling) result = _gf_true; goto out; } - if (gf_string2int16 (range_port, &tmp_port1) == 0) { + if (gf_string2int32 (range_port, &tmp_port1) == 0) { if (tmp_port1 > ceiling) tmp_port1 = ceiling; if (tmp_port1 < 0) @@ -3086,7 +3086,7 @@ gf_ports_reserved (char *blocked_port, unsigned char *ports, uint32_t ceiling) /* get rid of the new line character*/ if (range_port[strlen(range_port) -1] == '\n') range_port[strlen(range_port) - 1] = '\0'; - if (gf_string2int16 (range_port, &tmp_port2) == 0) { + if (gf_string2int32 (range_port, &tmp_port2) == 0) { if (tmp_port2 > ceiling) tmp_port2 = ceiling; if (tmp_port2 < 0) diff --git a/tests/bugs/glusterd/bug-1454418-seg-fault.t b/tests/bugs/glusterd/bug-1454418-seg-fault.t new file mode 100644 index 00000000000..eafaa55ede8 --- /dev/null +++ b/tests/bugs/glusterd/bug-1454418-seg-fault.t @@ -0,0 +1,25 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../cluster.rc + + +cleanup; + +## Setting Port number in specific range +sysctl net.ipv4.ip_local_reserved_ports="24007-24008,32765-32768,49152-49156" + +## Start a 2 node virtual cluster +TEST launch_cluster 2; + + +## Peer probe server 2 from server 1 cli +TEST $CLI_1 peer probe $H2; + +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count + +sysctl net.ipv4.ip_local_reserved_ports=" +" + +cleanup; + -- cgit