diff --git a/include/libp2p/record/record.h b/include/libp2p/record/record.h index 0a36b85..b29003f 100644 --- a/include/libp2p/record/record.h +++ b/include/libp2p/record/record.h @@ -3,5 +3,5 @@ #define RECORD_BUFSIZE 1024 - int libp2p_record_make_put_record (char* record, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign); + int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign); #endif // LIBP2P_RECORD_H diff --git a/record/record.c b/record/record.c index 1d81bac..3cd8af2 100644 --- a/record/record.c +++ b/record/record.c @@ -8,51 +8,60 @@ #include "mh/multihash.h" // libp2p_record_make_put_record creates and signs a dht record for the given key/value pair -int libp2p_record_make_put_record (char* record, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign) +int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign) { - char *pkh; + char *pkh, *p; int pkh_len; size_t len = 0, l; - record = malloc(RECORD_BUFSIZE); + *record = NULL; *rec_size = 0; + p = malloc(RECORD_BUFSIZE); - if (record) { - memset (record, '\0', len); - if (!protobuf_encode_string (1, WIRETYPE_LENGTH_DELIMITED, key, record, RECORD_BUFSIZE, &l)) { - free (record); + if (p) { + memset (p, '\0', len); + if (!protobuf_encode_string (1, WIRETYPE_LENGTH_DELIMITED, key, p, RECORD_BUFSIZE, &l)) { + free (p); return -1; } len += l; - if (!protobuf_encode_length_delimited (2, WIRETYPE_LENGTH_DELIMITED, value, vlen, record+len, RECORD_BUFSIZE-len, &l)) { - free (record); + if (!protobuf_encode_length_delimited (2, WIRETYPE_LENGTH_DELIMITED, value, vlen, p+len, RECORD_BUFSIZE-len, &l)) { + free (p); return -1; } len += l; pkh_len = mh_new_length(MH_H_SHA2_256, sk->public_key_length); pkh = malloc(pkh_len); if (!pkh) { - free (record); + free (p); return -1; } if (mh_new(pkh, MH_H_SHA2_256, sk->public_key_der, sk->public_key_length)) { free (pkh); - free (record); + free (p); return -1; } - if (!protobuf_encode_length_delimited (3, WIRETYPE_LENGTH_DELIMITED, pkh, pkh_len, record+len, RECORD_BUFSIZE-len, &l)) { + if (!protobuf_encode_length_delimited (3, WIRETYPE_LENGTH_DELIMITED, pkh, pkh_len, p+len, RECORD_BUFSIZE-len, &l)) { free (pkh); - free (record); + free (p); return -1; } + free (pkh); len += l; if (sign) { //TODO: missing signature function at libp2p-crypto ? - //sign(sk, signature, record, len); + //sign(sk, signature, p, len); //proto encode signature. free (pkh); - free (record); + free (p); return -1; // not implemented. } } + *record = realloc(p, len); // Reduces memory used for just what is needed. + if (*record) { + *rec_size = len; + } else { + free (p); + return -1; + } return 0; // sucess. }