From 201c15489c5e4d50b8167aa671757f77ed6f2c8f Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 2 Oct 2024 10:51:04 -0400 Subject: [PATCH] MT#55283 initialise str objects with macros Use provided macros for initrialise str objects everywhere instead of manually setting .s and .len. This allows for flexibility to extend str objects. Change-Id: I5ebca0bc82b348301c2c8e94b974c7acbf249b82 --- daemon/janus.c | 3 +-- daemon/main.c | 3 +-- daemon/media_socket.c | 3 +-- daemon/sdp.c | 6 ++---- daemon/stun.c | 3 +-- include/bencode.h | 6 ++++-- lib/codeclib.c | 3 +-- recording-daemon/db.c | 6 ++---- t/aead-aes-crypt.c | 24 ++++++++---------------- t/aes-crypt.c | 18 ++++++------------ t/test-amr-decode.c | 2 +- t/test-amr-encode.c | 2 +- t/test-transcode.c | 3 +-- 13 files changed, 30 insertions(+), 52 deletions(-) diff --git a/daemon/janus.c b/daemon/janus.c index 0d838839f..689fad2bf 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -227,8 +227,7 @@ static const char *janus_videoroom_create(struct janus_session *session, struct room->id = room_id; if (t_hash_table_lookup(janus_rooms, &room->id)) continue; - room->call_id.s = janus_call_id(room_id); - room->call_id.len = strlen(room->call_id.s); + room->call_id = STR(janus_call_id(room_id)); call_t *call = call_get_or_create(&room->call_id, true); if (!call) { ilog(LOG_WARN, "Call with reserved Janus ID '" STR_FORMAT diff --git a/daemon/main.c b/daemon/main.c index b616790c0..65314fb7f 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -774,8 +774,7 @@ static void options(int *argc, char ***argv) { if (ks_a) { for (iter = ks_a; *iter; iter++) { - str_keyspace_db.s = *iter; - str_keyspace_db.len = strlen(*iter); + str_keyspace_db = STR(*iter); uint_keyspace_db = strtoul(str_keyspace_db.s, &endptr, 10); if ((errno == ERANGE && (uint_keyspace_db == ULONG_MAX)) || diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 73125e071..86ae0fbdd 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2267,8 +2267,7 @@ int media_packet_encrypt(rewrite_func encrypt_func, struct packet_stream *out, s for (__auto_type l = mp->packets_out.head; l; l = l->next) { struct codec_packet *p = l->data; if (mp->call->recording && rtpe_config.rec_egress) { - p->plain.len = p->s.len; - p->plain.s = bufferpool_alloc(media_bufferpool, p->s.len); + p->plain = STR_LEN(bufferpool_alloc(media_bufferpool, p->s.len), p->s.len); memcpy(p->plain.s, p->s.s, p->s.len); p->plain_free_func = bufferpool_unref; } diff --git a/daemon/sdp.c b/daemon/sdp.c index 3d4f4f0ee..1851b9da0 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -634,10 +634,8 @@ static int parse_attribute_crypto(struct sdp_attribute *output) { if (ret != salt_key_len) goto error; - c->master_key.s = c->key_salt_buf; - c->master_key.len = c->crypto_suite->master_key_len; - c->salt.s = c->master_key.s + c->master_key.len; - c->salt.len = c->crypto_suite->master_salt_len; + c->master_key = STR_LEN(c->key_salt_buf, c->crypto_suite->master_key_len); + c->salt = STR_LEN(c->master_key.s + c->master_key.len, c->crypto_suite->master_salt_len); c->lifetime_str = c->key_params_str; str_shift(&c->lifetime_str, 7 + enc_salt_key_len); diff --git a/daemon/stun.c b/daemon/stun.c index 0fca7bcc6..9046b48f9 100644 --- a/daemon/stun.c +++ b/daemon/stun.c @@ -599,8 +599,7 @@ int stun(const str *b, stream_fd *sfd, const endpoint_t *sin) { if (class == STUN_CLASS_INDICATION) return 0; - attr_str.s = &b->s[20]; - attr_str.len = b->len - 20; + attr_str = STR_LEN(&b->s[20], b->len - 20); if (stun_attributes(&attrs, &attr_str, unknowns, req)) { err = "failed to parse attributes"; if (unknowns[0] == 0xffff) diff --git a/include/bencode.h b/include/bencode.h index f3c7f2beb..3c3efb575 100644 --- a/include/bencode.h +++ b/include/bencode.h @@ -367,6 +367,7 @@ INLINE char *bencode_strdup(bencode_buffer_t *buf, const char *s) { } INLINE void bencode_strdup_str(bencode_buffer_t *buf, str *o, const char *s) { + *o = STR_NULL; o->len = strlen(s); o->s = bencode_buffer_alloc(buf, o->len); memcpy(o->s, s, o->len); @@ -453,6 +454,7 @@ INLINE char *bencode_dictionary_get_string(bencode_item_t *dict, const char *key } INLINE char *bencode_dictionary_get_str(bencode_item_t *dict, const char *key, str *s) { + *s = STR_NULL; s->s = bencode_dictionary_get_string(dict, key, &s->len); if (!s->s) s->len = 0; @@ -473,6 +475,7 @@ INLINE char *bencode_dictionary_get_string_dup(bencode_item_t *dict, const char } INLINE char *bencode_dictionary_get_str_dup(bencode_item_t *dict, const char *key, str *s) { + *s = STR_NULL; s->s = bencode_dictionary_get_string_dup(dict, key, &s->len); return s->s; } @@ -559,8 +562,7 @@ INLINE int bencode_dictionary_get_strcmp(bencode_item_t *dict, const char *key, INLINE str *bencode_get_str(bencode_item_t *in, str *out) { if (!in || in->type != BENCODE_STRING) return NULL; - out->s = in->iov[1].iov_base; - out->len = in->iov[1].iov_len; + *out = STR_LEN(in->iov[1].iov_base, in->iov[1].iov_len); return out; } diff --git a/lib/codeclib.c b/lib/codeclib.c index c9dd53fc7..43761c0d2 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -4818,8 +4818,7 @@ static int evs_decoder_input(decoder_t *dec, const str *data, GQueue *out) { // consume and shift toc++; int bytes = (bits + 7) / 8; - frame_data.s = input.s; - frame_data.len = bytes; + frame_data = STR_LEN(input.s, bytes); err = "speech frame truncated"; if (str_shift(&input, bytes)) goto err; diff --git a/recording-daemon/db.c b/recording-daemon/db.c index fcfce500e..7b60c091c 100644 --- a/recording-daemon/db.c +++ b/recording-daemon/db.c @@ -377,10 +377,8 @@ void db_close_stream(output_t *op) { double now = now_double(); - str stream; - MYSQL_BIND b[3]; - stream.s = 0; - stream.len = 0; + str stream = STR_NULL; + MYSQL_BIND b[3]; if ((output_storage & OUTPUT_STORAGE_DB)) { FILE *f = fopen(op->filename, "rb"); diff --git a/t/aead-aes-crypt.c b/t/aead-aes-crypt.c index 5c41faa26..0970c9fab 100644 --- a/t/aead-aes-crypt.c +++ b/t/aead-aes-crypt.c @@ -121,8 +121,7 @@ int main(void) memcpy(ctx.session_salt, (uint8_t *)test_key + 32, 12); memcpy(working, srtp_pt, 50); - payload.len = 38; - payload.s = (char *) working + 12; + payload = STR_LEN((char *) working + 12, 38); rc = crypto_encrypt_rtp(&ctx, (struct rtp_header *)working, &payload, @@ -131,8 +130,7 @@ int main(void) assert(memcmp(working, answer128, 66) == 0); printf("RTP/AEAD-AES-128-GCM Encrypt - PASS\n"); - payload.len = 54; - payload.s = (char *) working + 12; + payload = STR_LEN((char *) working + 12, 54); rc = crypto_decrypt_rtp(&ctx, (struct rtp_header *)working, &payload, @@ -144,8 +142,7 @@ int main(void) // RTCP memcpy(working, srtcp_pt, 52); - payload.len = 44; - payload.s = (char *) working + 8; + payload = STR_LEN((char *) working + 8, 44); rc = crypto_encrypt_rtcp(&ctx, (struct rtcp_packet *)working, &payload, @@ -154,8 +151,7 @@ int main(void) assert(memcmp(working, answer128_srtcp, 68) == 0); printf("RTCP/AEAD-AES-128-GCM Encrypt - PASS\n"); - payload.len = 60; - payload.s = (char *) working + 8; + payload = STR_LEN((char *) working + 8, 60); rc = crypto_decrypt_rtcp(&ctx, (struct rtcp_packet *)working, &payload, @@ -180,8 +176,7 @@ int main(void) memcpy(ctx.session_salt, (uint8_t *)test_key + 32, 12); memcpy(working, srtp_pt, 50); - payload.len = 38; - payload.s = (char *) working + 12; + payload = STR_LEN((char *) working + 12, 38); rc = crypto_encrypt_rtp(&ctx, (struct rtp_header *)working, &payload, @@ -190,8 +185,7 @@ int main(void) assert(memcmp(working, answer256, 66) == 0); printf("RTP/AEAD-AES-256-GCM Encrypt - PASS\n"); - payload.len = 54; - payload.s = (char *) working + 12; + payload = STR_LEN((char *) working + 12, 54); rc = crypto_decrypt_rtp(&ctx, (struct rtp_header *)working, &payload, @@ -202,8 +196,7 @@ int main(void) // RTCP memcpy(working, srtcp_pt, 52); - payload.len = 44; - payload.s = (char *) working + 8; + payload = STR_LEN((char *) working + 8, 44); rc = crypto_encrypt_rtcp(&ctx, (struct rtcp_packet *)working, &payload, @@ -212,8 +205,7 @@ int main(void) assert(memcmp(working, answer256_srtcp, 68) == 0); printf("RTCP/AEAD-AES-256-GCM Encrypt - PASS\n"); - payload.len = 60; - payload.s = (char *) working + 8; + payload = STR_LEN((char *) working + 8, 60); rc = crypto_decrypt_rtcp(&ctx, (struct rtcp_packet *)working, &payload, diff --git a/t/aes-crypt.c b/t/aes-crypt.c index 9f8be4c5a..5466b5627 100644 --- a/t/aes-crypt.c +++ b/t/aes-crypt.c @@ -131,12 +131,10 @@ void srtp_validate (struct crypto_context *c, struct crypto_context *c2, char* m memcpy(srtp_plaintext, plaintext, 28); memcpy(srtp_ciphertext, ciphertext, 38); // in-place crypto so we must encrypt first - payload.len = 16; - payload.s = srtp_plaintext+RTP_HEADER_LEN; + payload = STR_LEN(srtp_plaintext+RTP_HEADER_LEN, 16); crypto_encrypt_rtp(c, (struct rtp_header *)srtp_plaintext, &payload, ntohs(((struct rtp_header *)srtp_plaintext)->seq_num)); - hash.len = 28; - hash.s = srtp_plaintext; + hash = STR_LEN(srtp_plaintext, 28); c->params.crypto_suite->hash_rtp(c, srtp_plaintext+28, &hash, ntohs(((struct rtp_header *)srtp_plaintext)->seq_num)); assert( memcmp(payload.s, srtp_ciphertext+RTP_HEADER_LEN, 26) == 0 ); @@ -144,8 +142,7 @@ void srtp_validate (struct crypto_context *c, struct crypto_context *c2, char* m hash.s = srtp_ciphertext; c->params.crypto_suite->hash_rtp(c, o_hash, &hash, ntohs(((struct rtp_header *)srtp_plaintext)->seq_num)); - payload.len = 16; - payload.s = srtp_ciphertext+RTP_HEADER_LEN; + payload = STR_LEN(srtp_ciphertext+RTP_HEADER_LEN, 16); crypto_decrypt_rtp(c, (struct rtp_header *)srtp_ciphertext, &payload, ntohs(((struct rtp_header *)srtp_ciphertext)->seq_num)); assert( memcmp(payload.s, rtp_plaintext_ref+RTP_HEADER_LEN, 16) == 0 ); assert( memcmp(o_hash, srtp_ciphertext+RTP_HEADER_LEN+16, 10) == 0 ); @@ -157,12 +154,10 @@ void srtp_validate (struct crypto_context *c, struct crypto_context *c2, char* m memcpy(srtcp_plaintext, rtcp_plaintext, 24); memcpy(srtcp_ciphertext, rtcp_ciphertext, 38); memcpy(srtcp_plaintext+24, srtcp_ciphertext+24, 4); - payload.len = 16; - payload.s = srtcp_plaintext+RTCP_HEADER_LEN; + payload = STR_LEN(srtcp_plaintext+RTCP_HEADER_LEN, 16); crypto_encrypt_rtcp(c2, (struct rtcp_packet *)srtcp_plaintext, &payload, 1); - hash.len = 28; - hash.s = srtcp_plaintext; + hash = STR_LEN(srtcp_plaintext, 28); c->params.crypto_suite->hash_rtcp(c2, srtcp_plaintext+28, &hash); assert( memcmp(payload.s, srtcp_ciphertext+RTCP_HEADER_LEN, 30) == 0 ); @@ -170,8 +165,7 @@ void srtp_validate (struct crypto_context *c, struct crypto_context *c2, char* m hash.s = srtcp_ciphertext; c->params.crypto_suite->hash_rtcp(c2, o_hash, &hash); - payload.len = 16; - payload.s = srtcp_ciphertext+RTCP_HEADER_LEN; + payload = STR_LEN(srtcp_ciphertext+RTCP_HEADER_LEN, 16); crypto_decrypt_rtcp(c2, (struct rtcp_packet *)srtcp_ciphertext, &payload, 1); assert( memcmp(payload.s, rtcp_plaintext_ref+RTCP_HEADER_LEN, 16) == 0 ); assert( memcmp(o_hash, srtcp_ciphertext+RTCP_HEADER_LEN+16+4, 10) == 0 ); diff --git a/t/test-amr-decode.c b/t/test-amr-decode.c index c9f77f9b5..fe1605b6b 100644 --- a/t/test-amr-decode.c +++ b/t/test-amr-decode.c @@ -66,7 +66,7 @@ static void do_test_amr_xx(const char *file, int line, fmtp = STR(fmtp_s); decoder_t *d = decoder_new_fmtp(def, clockrate, 1, 0, &fmt, NULL, NULL, &fmtp); assert(d); - const str data = { data_s, data_len }; + const str data = STR_LEN(data_s, data_len); int ret = decoder_input_data(d, &data, 1, frame_cb, &args, NULL); assert(!ret); assert(args.done == true); diff --git a/t/test-amr-encode.c b/t/test-amr-encode.c index d60edf235..4653e688b 100644 --- a/t/test-amr-encode.c +++ b/t/test-amr-encode.c @@ -23,7 +23,7 @@ static int dec_cb(encoder_t *e, void *u1, void *u2) { GString *buf = g_string_new(""); int plen = 256; char payload[plen]; - str inout = { payload, plen }; + str inout = STR_LEN(payload, plen); e->def->packetizer(e->avpkt, buf, &inout, e); if (inout.len != *expect_len diff --git a/t/test-transcode.c b/t/test-transcode.c index 1385b33f2..cbb44fb08 100644 --- a/t/test-transcode.c +++ b/t/test-transcode.c @@ -282,8 +282,7 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media mp.payload = pl; mp.payload.s = (packet + sizeof(struct rtp_header)); memcpy(mp.payload.s, pl.s, pl.len); - mp.raw.s = packet; - mp.raw.len = packet_len; + mp.raw = STR_LEN(packet, packet_len); printf("send RTP SSRC %x seq %u TS %u PT %u\n", (unsigned int) ssrc, (unsigned int) rtp_seq, (unsigned int) rtp_ts, (unsigned int) pt_in); printf("send packet contents: ");