@@ -177,31 +177,41 @@ int bt_audio_codec_cfg_set_val(struct bt_audio_codec_cfg *codec_cfg, uint8_t typ
177
177
}
178
178
179
179
for (uint16_t i = 0U ; i < codec_cfg -> data_len ;) {
180
- const uint8_t len = codec_cfg -> data [i ++ ];
180
+ uint8_t * len = & codec_cfg -> data [i ++ ];
181
181
const uint8_t data_type = codec_cfg -> data [i ++ ];
182
- const uint8_t value_len = len - sizeof (data_type );
182
+ const uint8_t value_len = * len - sizeof (data_type );
183
183
184
184
if (data_type == type ) {
185
185
uint8_t * value = & codec_cfg -> data [i ];
186
186
187
187
if (data_len == value_len ) {
188
188
memcpy (value , data , data_len );
189
189
} else {
190
- const uint8_t * old_next_data_start = value + value_len + 1 ;
191
- const uint8_t data_len_to_move =
192
- codec_cfg -> data_len -
193
- (old_next_data_start - codec_cfg -> data );
194
- uint8_t * new_next_data_start = value + data_len + 1 ;
195
190
const int16_t diff = data_len - value_len ;
191
+ uint8_t * old_next_data_start ;
192
+ uint8_t * new_next_data_start ;
193
+ uint8_t data_len_to_move ;
194
+
195
+ /* Check if this is the last value in the buffer */
196
+ if (value + value_len == codec_cfg -> data + codec_cfg -> data_len ) {
197
+ data_len_to_move = 0U ;
198
+ } else {
199
+ old_next_data_start = value + value_len + 1 ;
200
+ new_next_data_start = value + data_len + 1 ;
201
+ data_len_to_move = codec_cfg -> data_len -
202
+ (old_next_data_start - codec_cfg -> data );
203
+ }
196
204
197
205
if (diff < 0 ) {
198
206
/* In this case we need to move memory around after the copy
199
207
* to fit the new shorter data
200
208
*/
201
209
202
210
memcpy (value , data , data_len );
203
- memmove (new_next_data_start , old_next_data_start ,
204
- data_len_to_move );
211
+ if (data_len_to_move > 0U ) {
212
+ memmove (new_next_data_start , old_next_data_start ,
213
+ data_len_to_move );
214
+ }
205
215
} else {
206
216
/* In this case we need to move memory around before
207
217
* the copy to fit the new longer data
@@ -215,12 +225,16 @@ int bt_audio_codec_cfg_set_val(struct bt_audio_codec_cfg *codec_cfg, uint8_t typ
215
225
return - ENOMEM ;
216
226
}
217
227
218
- memmove (new_next_data_start , old_next_data_start ,
219
- data_len_to_move );
228
+ if (data_len_to_move > 0 ) {
229
+ memmove (new_next_data_start , old_next_data_start ,
230
+ data_len_to_move );
231
+ }
232
+
220
233
memcpy (value , data , data_len );
221
234
}
222
235
223
236
codec_cfg -> data_len += diff ;
237
+ * len += diff ;
224
238
}
225
239
226
240
return codec_cfg -> data_len ;
@@ -237,7 +251,9 @@ int bt_audio_codec_cfg_set_val(struct bt_audio_codec_cfg *codec_cfg, uint8_t typ
237
251
238
252
net_buf_simple_add_u8 (& buf , data_len + sizeof (type ));
239
253
net_buf_simple_add_u8 (& buf , type );
240
- net_buf_simple_add_mem (& buf , data , data_len );
254
+ if (data_len > 0 ) {
255
+ net_buf_simple_add_mem (& buf , data , data_len );
256
+ }
241
257
codec_cfg -> data_len = buf .len ;
242
258
} else {
243
259
LOG_DBG ("Cannot fit data_len %zu in codec_cfg with len %u and size %u" , data_len ,
0 commit comments