3604df
From 375b3a315620ea71e44a0534f8f302deb1cce64a Mon Sep 17 00:00:00 2001
3604df
From: Kotresh HR <khiremat@redhat.com>
3604df
Date: Wed, 7 Dec 2016 07:36:19 -0500
3604df
Subject: [PATCH 233/235] glusterd/geo-rep: Fix glusterd crash
3604df
3604df
Problem:
3604df
glusterd crashes when geo-rep mountbroker setup is
3604df
created if the slave user length is more than
3604df
8 characters.
3604df
3604df
Cause:
3604df
_POSIX_LOGIN_NAME_MAX is used which is 9 including
3604df
NULL byte.
3604df
3604df
Analysis:
3604df
While the man page says it sufficient for portability, but
3604df
acutally it's not. Linux allows the creation of username
3604df
upto 32 characters by default where the max length is 256.
3604df
And NetBSD's max is 17.
3604df
3604df
Linux:
3604df
  #getconf LOGIN_NAME_MAX
3604df
   256
3604df
NetBSD:
3604df
  #getconf LOGIN_NAME_MAX
3604df
   17
3604df
3604df
Fix:
3604df
Use LOGIN_NAME_MAX instead of _POSIX_LOGIN_NAME_MAX
3604df
3604df
>Reviewed-on: http://review.gluster.org/16053
3604df
>Smoke: Gluster Build System <jenkins@build.gluster.org>
3604df
>NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
3604df
>CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
3604df
>Reviewed-by: Aravinda VK <avishwan@redhat.com>
3604df
>Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
3604df
3604df
Change-Id: I26b7230433ecbbed6e6914ed39221a478c0266a8
3604df
BUG: 1400365
3604df
Signed-off-by: Kotresh HR <khiremat@redhat.com>
3604df
Reviewed-on: https://code.engineering.redhat.com/gerrit/92554
3604df
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
3604df
Tested-by: Atin Mukherjee <amukherj@redhat.com>
3604df
---
3604df
 libglusterfs/src/compat.h                    |  4 ++++
3604df
 xlators/mgmt/glusterd/src/glusterd-geo-rep.c | 13 +++++++++++--
3604df
 xlators/mgmt/glusterd/src/glusterd-geo-rep.h |  2 +-
3604df
 3 files changed, 16 insertions(+), 3 deletions(-)
3604df
3604df
diff --git a/libglusterfs/src/compat.h b/libglusterfs/src/compat.h
3604df
index 69adfbc..ea72202 100644
3604df
--- a/libglusterfs/src/compat.h
3604df
+++ b/libglusterfs/src/compat.h
3604df
@@ -158,6 +158,10 @@ enum {
3604df
 #define s6_addr32 __u6_addr.__u6_addr32
3604df
 #endif
3604df
 
3604df
+#ifndef LOGIN_NAME_MAX
3604df
+#define LOGIN_NAME_MAX 256
3604df
+#endif
3604df
+
3604df
 /* Posix dictates NAME_MAX to be used */
3604df
 # ifndef NAME_MAX
3604df
 #  ifdef  MAXNAMLEN
3604df
diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c
3604df
index e7afb9b..a67dea1 100644
3604df
--- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c
3604df
+++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c
3604df
@@ -583,7 +583,7 @@ struct dictidxmark {
3604df
 
3604df
 struct slave_vol_config {
3604df
        char      old_slvhost[_POSIX_HOST_NAME_MAX+1];
3604df
-       char      old_slvuser[_POSIX_LOGIN_NAME_MAX];
3604df
+       char      old_slvuser[LOGIN_NAME_MAX];
3604df
        unsigned  old_slvidx;
3604df
        char      slave_voluuid[GF_UUID_BUF_SIZE];
3604df
 };
3604df
@@ -2914,6 +2914,14 @@ get_slavehost_from_voluuid (dict_t *dict, char *key, data_t *value, void *data)
3604df
                         /* To go past username in non-root geo-rep session */
3604df
                         tmp = strchr (slave_host, '@');
3604df
                         if (tmp) {
3604df
+                                if ((tmp - slave_host) >= LOGIN_NAME_MAX) {
3604df
+                                        gf_msg (this->name, GF_LOG_ERROR, 0,
3604df
+                                                GD_MSG_SLAVE_VOL_PARSE_FAIL,
3604df
+                                                "Invalid slave user length in %s",
3604df
+                                                slave_host);
3604df
+                                        ret = -2;
3604df
+                                        goto out;
3604df
+                                }
3604df
                                 strncpy (slave_vol->old_slvuser, slave_host,
3604df
                                                  (tmp - slave_host));
3604df
                                 slave_vol->old_slvuser[(tmp - slave_host) + 1]
3604df
@@ -3336,7 +3344,8 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr)
3604df
                 }
3604df
         } else if (ret == -2) {
3604df
                 snprintf (errmsg, sizeof (errmsg), "get_slavehost_from_voluuid"
3604df
-                          " failed %s %s!!", slave_host, slave_vol);
3604df
+                          " failed for %s::%s. Please check the glusterd logs.",
3604df
+                          slave_host, slave_vol);
3604df
                 gf_msg (this->name, GF_LOG_INFO, 0, GD_MSG_FORCE_CREATE_SESSION,
3604df
                         "get_slavehost_from_voluuid failed %s %s!!",
3604df
                          slave_host, slave_vol);
3604df
diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.h b/xlators/mgmt/glusterd/src/glusterd-geo-rep.h
3604df
index 0524ec4..045bc2e 100644
3604df
--- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.h
3604df
+++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.h
3604df
@@ -20,7 +20,7 @@
3604df
 /* slave info format:
3604df
  * <master host uuid>:ssh://{<slave_user>@}<slave host>::<slave volume> \
3604df
  * :<slave volume uuid> */
3604df
-#define VOLINFO_SLAVE_URL_MAX (_POSIX_LOGIN_NAME_MAX + (2*GF_UUID_BUF_SIZE) \
3604df
+#define VOLINFO_SLAVE_URL_MAX (LOGIN_NAME_MAX + (2*GF_UUID_BUF_SIZE) \
3604df
                                  + SLAVE_URL_INFO_MAX + 10)
3604df
 
3604df
 typedef struct glusterd_gsync_status_temp {
3604df
-- 
3604df
2.9.3
3604df