|
|
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 |
|