[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] branch master updated: -fix serialization
From: |
gnunet |
Subject: |
[gnunet] branch master updated: -fix serialization |
Date: |
Thu, 06 Aug 2020 16:58:47 +0200 |
This is an automated email from the git hooks/post-receive script.
martin-schanzenbach pushed a commit to branch master
in repository gnunet.
The following commit(s) were added to refs/heads/master by this push:
new 079beb884 -fix serialization
079beb884 is described below
commit 079beb884ac4236f993736c664660c3892560c9b
Author: Martin Schanzenbach <mschanzenbach@posteo.de>
AuthorDate: Thu Aug 6 16:52:39 2020 +0200
-fix serialization
---
src/include/gnunet_reclaim_lib.h | 11 ++++--
src/reclaim/Makefile.am | 11 +++++-
src/reclaim/gnunet-service-reclaim.c | 15 +++++---
src/reclaim/gnunet-service-reclaim_tickets.c | 12 ++++---
src/reclaim/plugin_rest_openid_connect.c | 10 ++++--
src/reclaim/reclaim_api.c | 5 +--
src/reclaim/reclaim_attribute.c | 51 +++++++++++++++-------------
src/reclaim/reclaim_attribute.h | 20 ++++++-----
src/reclaim/test_reclaim_attribute.c | 51 ++++++++++++++++++++++++++++
9 files changed, 138 insertions(+), 48 deletions(-)
diff --git a/src/include/gnunet_reclaim_lib.h b/src/include/gnunet_reclaim_lib.h
index 4f2d6dba5..7d521ffa8 100644
--- a/src/include/gnunet_reclaim_lib.h
+++ b/src/include/gnunet_reclaim_lib.h
@@ -65,6 +65,7 @@ extern "C" {
*/
#define GNUNET_RECLAIM_ID_LENGTH (256 / 8)
+GNUNET_NETWORK_STRUCT_BEGIN
/**
* A reclaim identifier
* FIXME maybe put this in a different namespace
@@ -74,6 +75,8 @@ struct GNUNET_RECLAIM_Identifier
char id[GNUNET_RECLAIM_ID_LENGTH];
};
+GNUNET_NETWORK_STRUCT_END
+
static const struct GNUNET_RECLAIM_Identifier GNUNET_RECLAIM_ID_ZERO;
#define GNUNET_RECLAIM_id_is_equal(a,b) ((0 == \
@@ -361,11 +364,13 @@ GNUNET_RECLAIM_attribute_serialize (const struct
GNUNET_RECLAIM_Attribute *attr,
*
* @param data the serialized attribute
* @param data_size the length of the serialized data
+ * @param attr deserialized attribute. Will be allocated. Must be free'd
*
- * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
+ * @return number of bytes read or -1 for error
*/
-struct GNUNET_RECLAIM_Attribute *
-GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size);
+ssize_t
+GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size,
+ struct GNUNET_RECLAIM_Attribute **attr);
/**
diff --git a/src/reclaim/Makefile.am b/src/reclaim/Makefile.am
index a9829c47e..9b75c11aa 100644
--- a/src/reclaim/Makefile.am
+++ b/src/reclaim/Makefile.am
@@ -152,11 +152,20 @@ gnunet_reclaim_LDADD = \
$(top_builddir)/src/identity/libgnunetidentity.la \
$(GN_LIBINTL)
+test_reclaim_attribute_SOURCES = \
+ test_reclaim_attribute.c
+test_reclaim_attribute_LDADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ libgnunetreclaim.la \
+ $(GN_LIBINTL)
+
check_SCRIPTS = \
test_reclaim_attribute.sh \
test_reclaim_issue.sh \
test_reclaim_consume.sh
-# test_reclaim_revoke.sh
+
+check_PROGRAMS = \
+ test_reclaim_attribute
if ENABLE_TEST_RUN
AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset
XDG_CONFIG_HOME;
diff --git a/src/reclaim/gnunet-service-reclaim.c
b/src/reclaim/gnunet-service-reclaim.c
index 0cd8c10a5..84afd482e 100644
--- a/src/reclaim/gnunet-service-reclaim.c
+++ b/src/reclaim/gnunet-service-reclaim.c
@@ -732,6 +732,7 @@ handle_issue_ticket_message (void *cls, const struct
IssueTicketMessage *im)
struct TicketIssueOperation *tio;
struct IdpClient *idp = cls;
struct GNUNET_RECLAIM_AttributeList *attrs;
+ struct GNUNET_RECLAIM_AttributeListEntry *le;
size_t attrs_len;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ISSUE_TICKET message\n");
@@ -739,6 +740,10 @@ handle_issue_ticket_message (void *cls, const struct
IssueTicketMessage *im)
attrs_len = ntohs (im->attr_len);
attrs = GNUNET_RECLAIM_attribute_list_deserialize ((char *) &im[1],
attrs_len);
+ for (le = attrs->list_head; NULL != le; le = le->next)
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "List entry: %s\n", le->attribute->name);
+
tio->r_id = ntohl (im->id);
tio->client = idp;
GNUNET_CONTAINER_DLL_insert (idp->issue_op_head, idp->issue_op_tail, tio);
@@ -1053,8 +1058,9 @@ handle_attribute_store_message (void *cls,
data_len = ntohs (sam->attr_len);
ash = GNUNET_new (struct AttributeStoreHandle);
- ash->claim = GNUNET_RECLAIM_attribute_deserialize ((char *) &sam[1],
- data_len);
+ GNUNET_RECLAIM_attribute_deserialize ((char *) &sam[1],
+ data_len,
+ &ash->claim);
ash->r_id = ntohl (sam->id);
ash->identity = sam->identity;
@@ -1548,8 +1554,9 @@ handle_attribute_delete_message (void *cls,
data_len = ntohs (dam->attr_len);
adh = GNUNET_new (struct AttributeDeleteHandle);
- adh->claim = GNUNET_RECLAIM_attribute_deserialize ((char *) &dam[1],
- data_len);
+ GNUNET_RECLAIM_attribute_deserialize ((char *) &dam[1],
+ data_len,
+ &adh->claim);
adh->attest = NULL;
adh->r_id = ntohl (dam->id);
diff --git a/src/reclaim/gnunet-service-reclaim_tickets.c
b/src/reclaim/gnunet-service-reclaim_tickets.c
index 7e6b07514..af01d8ec7 100644
--- a/src/reclaim/gnunet-service-reclaim_tickets.c
+++ b/src/reclaim/gnunet-service-reclaim_tickets.c
@@ -694,8 +694,9 @@ rvk_move_attr_cb (void *cls,
{
/** find a new place for this attribute **/
struct GNUNET_RECLAIM_Attribute *claim;
- claim = GNUNET_RECLAIM_attribute_deserialize (rd[i].data,
- rd[i].data_size);
+ GNUNET_RECLAIM_attribute_deserialize (rd[i].data,
+ rd[i].data_size,
+ &claim);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Attribute to update: Name=%s\n",
claim->name);
@@ -1029,8 +1030,8 @@ process_parallel_lookup_result (void *cls,
if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE == rd[i].record_type)
{
attr_le = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
- attr_le->attribute =
- GNUNET_RECLAIM_attribute_deserialize (rd[i].data, rd[i].data_size);
+ GNUNET_RECLAIM_attribute_deserialize (rd[i].data, rd[i].data_size,
+ &attr_le->attribute);
GNUNET_CONTAINER_DLL_insert (cth->attrs->list_head,
cth->attrs->list_tail,
attr_le);
@@ -1298,6 +1299,9 @@ issue_ticket (struct TicketIssueHandle *ih)
i = 0;
for (le = ih->attrs->list_head; NULL != le; le = le->next)
{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Adding list entry: %s\n", le->attribute->name);
+
attrs_record[i].data = &le->attribute->id;
attrs_record[i].data_size = sizeof(le->attribute->id);
attrs_record[i].expiration_time = ticket_refresh_interval.rel_value_us;
diff --git a/src/reclaim/plugin_rest_openid_connect.c
b/src/reclaim/plugin_rest_openid_connect.c
index 06e1b0061..3221c1cce 100644
--- a/src/reclaim/plugin_rest_openid_connect.c
+++ b/src/reclaim/plugin_rest_openid_connect.c
@@ -1041,10 +1041,15 @@ oidc_attest_collect_finished_cb (void *cls)
{
struct RequestHandle *handle = cls;
struct GNUNET_RECLAIM_AttributeList *merged_list;
+ struct GNUNET_RECLAIM_AttributeListEntry *le_m;
handle->attest_it = NULL;
merged_list = attribute_list_merge (handle->attr_idtoken_list,
handle->attr_userinfo_list);
+ for (le_m = merged_list->list_head; NULL != le_m; le_m = le_m->next)
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "List Attibute in ticket to issue: %s\n",
+ le_m->attribute->name);
handle->idp_op = GNUNET_RECLAIM_ticket_issue (idp,
&handle->priv_key,
&handle->oidc->client_pkey,
@@ -2131,13 +2136,12 @@ consume_ticket (void *cls,
char *result_str;
handle->idp_op = NULL;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Attr: %s\n", attr->name);
if (NULL == identity)
{
result_str = OIDC_generate_userinfo (&handle->ticket.identity,
handle->attr_userinfo_list,
handle->attests_list);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Userinfo: %s\n", result_str);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Userinfo: %s\n", result_str);
resp = GNUNET_REST_create_response (result_str);
handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
GNUNET_free (result_str);
@@ -2156,6 +2160,8 @@ consume_ticket (void *cls,
GNUNET_CONTAINER_DLL_insert (handle->attr_userinfo_list->list_head,
handle->attr_userinfo_list->list_tail,
ale);
+ if (NULL == attest)
+ return;
for (atle = handle->attests_list->list_head; NULL != atle; atle = atle->next)
{
if (GNUNET_NO == GNUNET_RECLAIM_id_is_equal (&atle->attestation->id,
diff --git a/src/reclaim/reclaim_api.c b/src/reclaim/reclaim_api.c
index d73241a6f..b432b4f2a 100644
--- a/src/reclaim/reclaim_api.c
+++ b/src/reclaim/reclaim_api.c
@@ -747,7 +747,8 @@ handle_attribute_result (void *cls, const struct
AttributeResultMessage *msg)
{
struct GNUNET_RECLAIM_Attribute *attr;
- attr = GNUNET_RECLAIM_attribute_deserialize ((char *) &msg[1], attr_len);
+ GNUNET_RECLAIM_attribute_deserialize ((char *) &msg[1], attr_len,
+ &attr);
if (NULL != it)
{
if (NULL != it->proc)
@@ -1573,7 +1574,7 @@ GNUNET_RECLAIM_ticket_consume (
if (NULL != h->mq)
GNUNET_MQ_send_copy (h->mq, op->env);
else
- reconnect(h);
+ reconnect (h);
return op;
}
diff --git a/src/reclaim/reclaim_attribute.c b/src/reclaim/reclaim_attribute.c
index 05bdc1ac6..971bfce23 100644
--- a/src/reclaim/reclaim_attribute.c
+++ b/src/reclaim/reclaim_attribute.c
@@ -306,7 +306,6 @@ GNUNET_RECLAIM_attribute_list_serialize_get_size (
{
GNUNET_assert (NULL != ale->attribute);
len += GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
- len += sizeof(struct GNUNET_RECLAIM_AttributeListEntry);
}
return len;
}
@@ -355,27 +354,28 @@ GNUNET_RECLAIM_attribute_list_deserialize (const char
*data, size_t data_size)
struct GNUNET_RECLAIM_AttributeListEntry *ale;
size_t attr_len;
const char *read_ptr;
+ size_t left = data_size;
al = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
- if (data_size < sizeof(struct Attribute) + sizeof(struct
-
GNUNET_RECLAIM_AttributeListEntry))
+ if (data_size < sizeof(struct Attribute))
return al;
read_ptr = data;
- while (((data + data_size) - read_ptr) >= sizeof(struct Attribute))
+ while (left >= sizeof(struct Attribute))
{
ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
- ale->attribute =
+ attr_len =
GNUNET_RECLAIM_attribute_deserialize (read_ptr,
- data_size - (read_ptr - data));
- if (NULL == ale->attribute)
+ left,
+ &ale->attribute);
+ if (-1 == attr_len)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Failed to deserialize malformed attribute.\n");
GNUNET_free (ale);
return al;
}
+ left -= attr_len;
GNUNET_CONTAINER_DLL_insert (al->list_head, al->list_tail, ale);
- attr_len = GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
read_ptr += attr_len;
}
return al;
@@ -503,17 +503,18 @@ GNUNET_RECLAIM_attribute_serialize (
*
* @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
*/
-struct GNUNET_RECLAIM_Attribute *
-GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size)
+ssize_t
+GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size,
+ struct GNUNET_RECLAIM_Attribute **attr)
{
- struct GNUNET_RECLAIM_Attribute *attr;
struct Attribute *attr_ser;
+ struct GNUNET_RECLAIM_Attribute *attribute;
size_t data_len;
size_t name_len;
char *write_ptr;
if (data_size < sizeof(struct Attribute))
- return NULL;
+ return -1;
attr_ser = (struct Attribute *) data;
data_len = ntohs (attr_ser->data_size);
@@ -522,25 +523,27 @@ GNUNET_RECLAIM_attribute_deserialize (const char *data,
size_t data_size)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Buffer too small to deserialize\n");
- return NULL;
+ return -1;
}
- attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
+ attribute = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
+ data_len + name_len + 1);
- attr->type = ntohs (attr_ser->attribute_type);
- attr->flag = ntohl (attr_ser->attribute_flag);
- attr->id = attr_ser->attribute_id;
- attr->attestation = attr_ser->attestation_id;
- attr->data_size = data_len;
+ attribute->type = ntohs (attr_ser->attribute_type);
+ attribute->flag = ntohl (attr_ser->attribute_flag);
+ attribute->id = attr_ser->attribute_id;
+ attribute->attestation = attr_ser->attestation_id;
+ attribute->data_size = data_len;
- write_ptr = (char *) &attr[1];
+ write_ptr = (char *) &attribute[1];
GNUNET_memcpy (write_ptr, &attr_ser[1], name_len);
write_ptr[name_len] = '\0';
- attr->name = write_ptr;
+ attribute->name = write_ptr;
write_ptr += name_len + 1;
- GNUNET_memcpy (write_ptr, (char *) &attr_ser[1] + name_len, attr->data_size);
- attr->data = write_ptr;
- return attr;
+ GNUNET_memcpy (write_ptr, (char *) &attr_ser[1] + name_len,
+ attribute->data_size);
+ *attr = attribute;
+ attribute->data = write_ptr;
+ return sizeof(struct Attribute) + data_len + name_len;
}
diff --git a/src/reclaim/reclaim_attribute.h b/src/reclaim/reclaim_attribute.h
index e54b210b9..203c88a34 100644
--- a/src/reclaim/reclaim_attribute.h
+++ b/src/reclaim/reclaim_attribute.h
@@ -28,6 +28,8 @@
#include "gnunet_reclaim_service.h"
+GNUNET_NETWORK_STRUCT_BEGIN
+
/**
* Serialized claim
*/
@@ -36,12 +38,12 @@ struct Attribute
/**
* Attribute type
*/
- uint32_t attribute_type;
+ uint32_t attribute_type GNUNET_PACKED;
/**
* Attribute flag
*/
- uint32_t attribute_flag;
+ uint32_t attribute_flag GNUNET_PACKED;
/**
* Attribute ID
@@ -56,12 +58,12 @@ struct Attribute
/**
* Name length
*/
- uint32_t name_len;
+ uint32_t name_len GNUNET_PACKED;
/**
* Data size
*/
- uint32_t data_size;
+ uint32_t data_size GNUNET_PACKED;
// followed by data_size Attribute value data
};
@@ -74,12 +76,12 @@ struct Attestation
/**
* Attestation type
*/
- uint32_t attestation_type;
+ uint32_t attestation_type GNUNET_PACKED;
/**
* Attestation flag
*/
- uint32_t attestation_flag;
+ uint32_t attestation_flag GNUNET_PACKED;
/**
* Attestation ID
@@ -89,14 +91,16 @@ struct Attestation
/**
* Name length
*/
- uint32_t name_len;
+ uint32_t name_len GNUNET_PACKED;
/**
* Data size
*/
- uint32_t data_size;
+ uint32_t data_size GNUNET_PACKED;
// followed by data_size Attestation value data
};
+GNUNET_NETWORK_STRUCT_BEGIN
+
#endif
diff --git a/src/reclaim/test_reclaim_attribute.c
b/src/reclaim/test_reclaim_attribute.c
new file mode 100644
index 000000000..f71d86b56
--- /dev/null
+++ b/src/reclaim/test_reclaim_attribute.c
@@ -0,0 +1,51 @@
+#include "platform.h"
+#include "gnunet_common.h"
+#include "gnunet_reclaim_lib.h"
+#include "gnunet_container_lib.h"
+
+int
+main (int argc, char *argv[])
+{
+ struct GNUNET_RECLAIM_AttributeList *al;
+ struct GNUNET_RECLAIM_AttributeList *al_two;
+ struct GNUNET_RECLAIM_AttributeListEntry *ale;
+ struct GNUNET_RECLAIM_Attribute *attr;
+ char attrname[100];
+ char attrdata[100];
+ size_t ser_len_claimed;
+ size_t ser_len_actual;
+ ssize_t deser_len;
+ char *ser_data;
+ int count = 0;
+
+ al = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
+ for (int i = 0; i < 12; i++)
+ {
+ memset (attrname, 0, 100);
+ memset (attrdata, 0, 100);
+ sprintf (attrname, "attr%d", i);
+ sprintf (attrdata, "%d", i);
+ ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
+ ale->attribute = GNUNET_RECLAIM_attribute_new (attrname,
+ &GNUNET_RECLAIM_ID_ZERO,
+
GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING,
+ attrdata,
+ strlen (attrdata));
+ GNUNET_CONTAINER_DLL_insert (al->list_head,
+ al->list_tail,
+ ale);
+ }
+ ser_len_claimed = GNUNET_RECLAIM_attribute_list_serialize_get_size (al);
+ ser_data = GNUNET_malloc (ser_len_claimed);
+ ser_len_actual = GNUNET_RECLAIM_attribute_list_serialize (al,
+ ser_data);
+ GNUNET_assert (ser_len_claimed == ser_len_actual);
+ al_two = GNUNET_RECLAIM_attribute_list_deserialize (ser_data,
+ ser_len_actual);
+ for (ale = al_two->list_head; NULL != ale; ale = ale->next)
+ count++;
+ GNUNET_assert (12 == count);
+ //GNUNET_assert (-1 != deser_len);
+ GNUNET_free (ser_data);
+ GNUNET_RECLAIM_attribute_list_destroy (al);
+}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnunet] branch master updated: -fix serialization,
gnunet <=