[Gluster-devel] [PATCH BUG:393 10/10] transport/encryption: fix encryption when used with afr

Corentin Chary corentin.chary at gmail.com
Wed Nov 18 11:14:02 UTC 2009


afr (and others) use the same vector for each write,
this resulted in double encrypted messages, because the original
vector was modified.

Signed-off-by: Corentin Chary <corentin.chary at gmail.com>
---
 libglusterfs/src/transport.c |   40 +++++++++++++++++++++++++++++++---------
 1 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/libglusterfs/src/transport.c b/libglusterfs/src/transport.c
index b88de9f..ad557b4 100644
--- a/libglusterfs/src/transport.c
+++ b/libglusterfs/src/transport.c
@@ -319,7 +319,8 @@ transport_submit (transport_t *this, char *buf, int32_t len,
 {
 	int32_t               ret = -1;
         transport_t          *peer_trans = NULL;
-        struct iobuf         *iobuf = NULL;
+        struct iobuf         *iobuf  = NULL;
+        struct iobuf         *iobufc = NULL;
         struct transport_msg *msg = NULL;
 	gf_hdr_common_t      *hdr;
 
@@ -327,6 +328,21 @@ transport_submit (transport_t *this, char *buf, int32_t len,
 	hdr->crypto = hton32 (this->crypto.magic);
 
 	if (this->crypto.ops && this->crypto.ops->encrypt) {
+		if (vector) {
+			iobufc = iobuf_get (this->xl->ctx->iobuf_pool);
+			if (!iobufc)
+				return -ENOMEM;
+
+			vector = iov_dup (vector, count);
+			if (!vector) {
+				ret = -ENOMEM;
+				goto fail;
+			}
+
+			iov_unload (iobufc->ptr, vector, count);
+			iov_link (vector, count, iobufc->ptr);
+		}
+
 		ret = this->crypto.ops->encrypt (&this->crypto, buf,
 						 len, vector, count);
 		if (ret)
@@ -338,7 +354,8 @@ transport_submit (transport_t *this, char *buf, int32_t len,
 
                 msg = CALLOC (1, sizeof (*msg));
                 if (!msg) {
-                        return -ENOMEM;
+                        ret = -ENOMEM;
+			goto fail;
                 }
 
                 msg->hdr = buf;
@@ -349,7 +366,8 @@ transport_submit (transport_t *this, char *buf, int32_t len,
                         if (!iobuf) {
                                 FREE (msg->hdr);
                                 FREE (msg);
-                                return -ENOMEM;
+                                ret = -ENOMEM;
+				goto fail;
                         }
 
                         iov_unload (iobuf->ptr, vector, count);
@@ -364,14 +382,18 @@ transport_submit (transport_t *this, char *buf, int32_t len,
                 }
                 pthread_mutex_unlock (&peer_trans->handover.mutex);
 
-                return 0;
-        }
-
-	GF_VALIDATE_OR_GOTO("transport", this, fail);
-	GF_VALIDATE_OR_GOTO("transport", this->ops, fail);
+		ret = 0;
+        } else {
+		GF_VALIDATE_OR_GOTO("transport", this, fail);
+		GF_VALIDATE_OR_GOTO("transport", this->ops, fail);
 
-	ret = this->ops->submit (this, buf, len, vector, count, iobref);
+		ret = this->ops->submit (this, buf, len, vector, count, iobref);
+	}
 fail:
+	if (iobufc) {
+		iobuf_unref (iobufc);
+		FREE (vector);
+	}
 	return ret;
 }
 
-- 
1.6.4.4






More information about the Gluster-devel mailing list