ctdb-protocol: Fix marshalling for a string with length
authorAmitay Isaacs <amitay@gmail.com>
Thu, 20 Apr 2017 02:45:24 +0000 (12:45 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:22 +0000 (14:59 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_basic.c
ctdb/protocol/protocol_control.c
ctdb/protocol/protocol_event.c
ctdb/protocol/protocol_private.h
ctdb/tests/src/protocol_basic_test.c
ctdb/tests/src/protocol_common.c
ctdb/tests/src/protocol_common.h

index e112c5bb8878fe8e7d6a1bb0a7b60a349e68c22b..10824cf4ed7808446ccc1b8a60b8916bfa010c5a 100644 (file)
@@ -271,55 +271,51 @@ int ctdb_string_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
        return 0;
 }
 
-struct stringn_wire {
-       uint32_t length;
-       uint8_t str[1];
-};
-
-size_t ctdb_stringn_len(const char *str)
+size_t ctdb_stringn_len(const char **in)
 {
-       return sizeof(uint32_t) + ctdb_string_len(&str);
+       uint32_t u32 = ctdb_string_len(in);
+
+       return ctdb_uint32_len(&u32) + u32;
 }
 
-void ctdb_stringn_push(const char *str, uint8_t *buf)
+void ctdb_stringn_push(const char **in, uint8_t *buf, size_t *npush)
 {
-       struct stringn_wire *wire = (struct stringn_wire *)buf;
-       size_t np;
+       size_t offset = 0, np;
+       uint32_t u32 = ctdb_string_len(in);
 
-       wire->length = ctdb_string_len(&str);
-       ctdb_string_push(&str, wire->str, &np);
+       ctdb_uint32_push(&u32, buf+offset, &np);
+       offset += np;
+
+       ctdb_string_push(in, buf+offset, &np);
+       offset += np;
+
+       *npush = offset;
 }
 
 int ctdb_stringn_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                     const char **out)
+                     const char **out, size_t *npull)
 {
-       char *str;
-       struct stringn_wire *wire = (struct stringn_wire *)buf;
+       size_t offset = 0, np;
+       uint32_t u32;
+       int ret;
 
-       if (buflen < sizeof(uint32_t)) {
-               return EMSGSIZE;
-       }
-       if (wire->length > buflen) {
-               return EMSGSIZE;
-       }
-       if (sizeof(uint32_t) + wire->length < sizeof(uint32_t)) {
-               return EMSGSIZE;
-       }
-       if (buflen < sizeof(uint32_t) + wire->length) {
-               return EMSGSIZE;
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
+       if (ret != 0) {
+               return ret;
        }
+       offset += np;
 
-       if (wire->length == 0) {
-               *out = NULL;
-               return 0;
+       if (buflen-offset < u32) {
+               return EMSGSIZE;
        }
 
-       str = talloc_strndup(mem_ctx, (char *)wire->str, wire->length);
-       if (str == NULL) {
-               return ENOMEM;
+       ret = ctdb_string_pull(buf+offset, u32, mem_ctx, out, &np);
+       if (ret != 0) {
+               return ret;
        }
+       offset += np;
 
-       *out = str;
+       *npull = offset;
        return 0;
 }
 
index 6acbcc35d1dfe1147a44ee619cabaf1b479c600f..848399041d30f361890141538f0396b84fa0aedf 100644 (file)
@@ -187,7 +187,7 @@ static size_t ctdb_req_control_data_len(struct ctdb_req_control_data *cd)
                break;
 
        case CTDB_CONTROL_GET_TUNABLE:
-               len = ctdb_stringn_len(cd->data.tun_var);
+               len = ctdb_stringn_len(&cd->data.tun_var);
                break;
 
        case CTDB_CONTROL_LIST_TUNABLES:
@@ -527,7 +527,7 @@ static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
                break;
 
        case CTDB_CONTROL_GET_TUNABLE:
-               ctdb_stringn_push(cd->data.tun_var, buf);
+               ctdb_stringn_push(&cd->data.tun_var, buf, &np);
                break;
 
        case CTDB_CONTROL_MODIFY_FLAGS:
@@ -822,7 +822,7 @@ static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
 
        case CTDB_CONTROL_GET_TUNABLE:
                ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
-                                       &cd->data.tun_var);
+                                       &cd->data.tun_var, &np);
                break;
 
        case CTDB_CONTROL_MODIFY_FLAGS:
index 92b8a6ed2726398d746013b627cb3112641c7690..26e514aefed519c40ed3e368e40d06f2bf301128 100644 (file)
@@ -232,7 +232,7 @@ static size_t ctdb_event_request_run_len(struct ctdb_event_request_run *in)
 {
        return ctdb_event_len(in->event) +
               ctdb_uint32_len(&in->timeout) +
-              ctdb_stringn_len(in->arg_str);
+              ctdb_stringn_len(&in->arg_str);
 }
 
 static void ctdb_event_request_run_push(struct ctdb_event_request_run *in,
@@ -246,7 +246,7 @@ static void ctdb_event_request_run_push(struct ctdb_event_request_run *in,
        ctdb_uint32_push(&in->timeout, buf+offset, &np);
        offset += np;
 
-       ctdb_stringn_push(in->arg_str, buf+offset);
+       ctdb_stringn_push(&in->arg_str, buf+offset, &np);
 }
 
 static int ctdb_event_request_run_pull(uint8_t *buf, size_t buflen,
@@ -276,7 +276,7 @@ static int ctdb_event_request_run_pull(uint8_t *buf, size_t buflen,
        offset += np;
 
        ret = ctdb_stringn_pull(buf+offset, buflen-offset,
-                               rdata, &rdata->arg_str);
+                               rdata, &rdata->arg_str, &np);
        if (ret != 0) {
                goto fail;
        }
@@ -343,14 +343,16 @@ static int ctdb_event_request_status_pull(
 static size_t ctdb_event_request_script_enable_len(
                                struct ctdb_event_request_script_enable *in)
 {
-       return ctdb_stringn_len(in->script_name);
+       return ctdb_stringn_len(&in->script_name);
 }
 
 static void ctdb_event_request_script_enable_push(
                                struct ctdb_event_request_script_enable *in,
                                uint8_t *buf)
 {
-       ctdb_stringn_push(in->script_name, buf);
+       size_t np;
+
+       ctdb_stringn_push(&in->script_name, buf, &np);
 }
 
 static int ctdb_event_request_script_enable_pull(
@@ -359,6 +361,7 @@ static int ctdb_event_request_script_enable_pull(
                                struct ctdb_event_request_script_enable **out)
 {
        struct ctdb_event_request_script_enable *rdata;
+       size_t np;
        int ret;
 
        rdata = talloc(mem_ctx, struct ctdb_event_request_script_enable);
@@ -366,7 +369,7 @@ static int ctdb_event_request_script_enable_pull(
                return ENOMEM;
        }
 
-       ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name);
+       ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name, &np);
        if (ret != 0) {
                talloc_free(rdata);
                return ret;
@@ -379,14 +382,16 @@ static int ctdb_event_request_script_enable_pull(
 static size_t ctdb_event_request_script_disable_len(
                                struct ctdb_event_request_script_disable *in)
 {
-       return ctdb_stringn_len(in->script_name);
+       return ctdb_stringn_len(&in->script_name);
 }
 
 static void ctdb_event_request_script_disable_push(
                                struct ctdb_event_request_script_disable *in,
                                uint8_t *buf)
 {
-       ctdb_stringn_push(in->script_name, buf);
+       size_t np;
+
+       ctdb_stringn_push(&in->script_name, buf, &np);
 }
 
 static int ctdb_event_request_script_disable_pull(
@@ -395,6 +400,7 @@ static int ctdb_event_request_script_disable_pull(
                                struct ctdb_event_request_script_disable **out)
 {
        struct ctdb_event_request_script_disable *rdata;
+       size_t np;
        int ret;
 
        rdata = talloc(mem_ctx, struct ctdb_event_request_script_disable);
@@ -402,7 +408,7 @@ static int ctdb_event_request_script_disable_pull(
                return ENOMEM;
        }
 
-       ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name);
+       ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name, &np);
        if (ret != 0) {
                talloc_free(rdata);
                return ret;
index f94da4b2a2395eefda81f05a0c5686cd7897b2a2..07a7ab5595e1821c64c3d943068380f09bbd0c56 100644 (file)
@@ -67,10 +67,10 @@ void ctdb_string_push(const char **in, uint8_t *buf, size_t *npush);
 int ctdb_string_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
                     const char **out, size_t *npull);
 
-size_t ctdb_stringn_len(const char *str);
-void ctdb_stringn_push(const char *str, uint8_t *buf);
+size_t ctdb_stringn_len(const char **in);
+void ctdb_stringn_push(const char **in, uint8_t *buf, size_t *npush);
 int ctdb_stringn_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                     const char **out);
+                     const char **out, size_t *npull);
 
 size_t ctdb_pid_len(pid_t pid);
 void ctdb_pid_push(pid_t pid, uint8_t *buf);
index 7271c0efc9c15bf5f57c37004da96b085254aa22..ee350d62fce4ec2259bec5c3183a8fe46ce2fa6e 100644 (file)
@@ -56,22 +56,7 @@ static void test_ctdb_chararray(void)
 }
 
 PROTOCOL_TYPE2_TEST(const char *, ctdb_string);
-
-static void test_ctdb_stringn(void)
-{
-       TALLOC_CTX *mem_ctx = talloc_new(NULL);
-       const char *p1, *p2;
-       size_t buflen;
-       int ret;
-
-       fill_ctdb_string(mem_ctx, &p1);
-       buflen = ctdb_stringn_len(p1);
-       ctdb_stringn_push(p1, BUFFER);
-       ret = ctdb_stringn_pull(BUFFER, buflen, mem_ctx, &p2);
-       assert(ret == 0);
-       verify_ctdb_string(&p1, &p2);
-       talloc_free(mem_ctx);
-}
+PROTOCOL_TYPE2_TEST(const char *, ctdb_stringn);
 
 static void test_ctdb_pid(void)
 {
@@ -105,7 +90,7 @@ int main(int argc, char *argv[])
        test_ctdb_chararray();
 
        TEST_FUNC(ctdb_string)();
-       test_ctdb_stringn();
+       TEST_FUNC(ctdb_stringn)();
 
        test_ctdb_pid();
 
index 841cf29e5c15d2b896ec5b7d258c830a54644031..c6f7159f165b6d8ac30c766d4f4318f4e6d58018 100644 (file)
@@ -200,6 +200,16 @@ void verify_ctdb_string(const char **p1, const char **p2)
        }
 }
 
+void fill_ctdb_stringn(TALLOC_CTX *mem_ctx, const char **p)
+{
+       fill_ctdb_string(mem_ctx, p);
+}
+
+void verify_ctdb_stringn(const char **p1, const char **p2)
+{
+       verify_ctdb_string(p1, p2);
+}
+
 void fill_tdb_data_nonnull(TALLOC_CTX *mem_ctx, TDB_DATA *p)
 {
        p->dsize = rand_int(1024) + 1;
index 80c98072ee0563d4523012b9bbae673c13abebab..fc2575a2139015cccaf02e95b92bbeddd0c3277a 100644 (file)
@@ -176,6 +176,9 @@ void verify_ctdb_bool(bool *p1, bool *p2);
 void fill_ctdb_string(TALLOC_CTX *mem_ctx, const char **p);
 void verify_ctdb_string(const char **p1, const char **p2);
 
+void fill_ctdb_stringn(TALLOC_CTX *mem_ctx, const char **p);
+void verify_ctdb_stringn(const char **p1, const char **p2);
+
 void fill_tdb_data_nonnull(TALLOC_CTX *mem_ctx, TDB_DATA *p);
 void fill_tdb_data(TALLOC_CTX *mem_ctx, TDB_DATA *p);
 void verify_tdb_data(TDB_DATA *p1, TDB_DATA *p2);