| 305 | } |
| 306 | |
| 307 | static inline int validate_string(AVTextFormatContext *tctx, char **dstp, const char *src) |
| 308 | { |
| 309 | const uint8_t *p, *endp, *srcp = (const uint8_t *)src; |
| 310 | AVBPrint dstbuf; |
| 311 | AVBPrint invalid_seq; |
| 312 | int invalid_chars_nb = 0, ret = 0; |
| 313 | |
| 314 | *dstp = NULL; |
| 315 | av_bprint_init(&dstbuf, 0, AV_BPRINT_SIZE_UNLIMITED); |
| 316 | av_bprint_init(&invalid_seq, 0, AV_BPRINT_SIZE_UNLIMITED); |
| 317 | |
| 318 | endp = srcp + strlen(src); |
| 319 | for (p = srcp; *p;) { |
| 320 | int32_t code; |
| 321 | int invalid = 0; |
| 322 | const uint8_t *p0 = p; |
| 323 | |
| 324 | if (av_utf8_decode(&code, &p, endp, tctx->string_validation_utf8_flags) < 0) { |
| 325 | |
| 326 | av_bprint_clear(&invalid_seq); |
| 327 | |
| 328 | bprint_bytes(&invalid_seq, p0, p - p0); |
| 329 | |
| 330 | av_log(tctx, AV_LOG_DEBUG, "Invalid UTF-8 sequence '%s' found in string '%s'\n", invalid_seq.str, src); |
| 331 | invalid = 1; |
| 332 | } |
| 333 | |
| 334 | if (invalid) { |
| 335 | invalid_chars_nb++; |
| 336 | |
| 337 | switch (tctx->string_validation) { |
| 338 | case AV_TEXTFORMAT_STRING_VALIDATION_FAIL: |
| 339 | av_log(tctx, AV_LOG_ERROR, "Invalid UTF-8 sequence found in string '%s'\n", src); |
| 340 | ret = AVERROR_INVALIDDATA; |
| 341 | goto end; |
| 342 | |
| 343 | case AV_TEXTFORMAT_STRING_VALIDATION_REPLACE: |
| 344 | av_bprintf(&dstbuf, "%s", tctx->string_validation_replacement); |
| 345 | break; |
| 346 | } |
| 347 | } |
| 348 | |
| 349 | if (!invalid || tctx->string_validation == AV_TEXTFORMAT_STRING_VALIDATION_IGNORE) |
| 350 | av_bprint_append_data(&dstbuf, p0, p-p0); |
| 351 | } |
| 352 | |
| 353 | if (invalid_chars_nb && tctx->string_validation == AV_TEXTFORMAT_STRING_VALIDATION_REPLACE) |
| 354 | av_log(tctx, AV_LOG_WARNING, |
| 355 | "%d invalid UTF-8 sequence(s) found in string '%s', replaced with '%s'\n", |
| 356 | invalid_chars_nb, src, tctx->string_validation_replacement); |
| 357 | |
| 358 | end: |
| 359 | av_bprint_finalize(&dstbuf, dstp); |
| 360 | av_bprint_finalize(&invalid_seq, NULL); |
| 361 | return ret; |
| 362 | } |
| 363 | |
| 364 | struct unit_value { |
no test coverage detected