From patchwork Thu May 6 05:11:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 27626 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:49c5:0:0:0:0:0 with SMTP id w188csp902076yba; Wed, 5 May 2021 22:14:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKuBgRB3mAIT/z5xA7ocXIXAIPEKNlyBRdKkx6ViiF/APMLdw9f1uyy1YZIJuYAZOJ0rpe X-Received: by 2002:a17:906:27c3:: with SMTP id k3mr2362432ejc.519.1620278044402; Wed, 05 May 2021 22:14:04 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y15si1602624edv.431.2021.05.05.22.14.04; Wed, 05 May 2021 22:14:04 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=IDHC4zrM; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 32282680CF6; Thu, 6 May 2021 08:12:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075108.outbound.protection.outlook.com [40.92.75.108]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B16D2680C5A for ; Thu, 6 May 2021 08:11:59 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=D3+22PYRUIRvpFzfUQWvBvozGSn1vuoRGtdbK3sqrO+fxpZc7NEzirzx73GX7cZhS4VSMjGZver+6FCn5C4Al/zUmlFQyYxIK7e8Te+/ewNbQ64YhZ1coJ9gUeHYNpBn89XegUcf2AUgEohv37azWRTfl3tEQoNvlJTSYWyyzyxuYXeBWIeuIaBMwBIdEavMezrwGE63CNysiLJ46f4qz2S2gntFaYJWD4xa2wTtjc7yoH/ggEyMvigy+mxZJVaqozBxPvAhBwmzdkLBxlMfDjkJ6Hka2HHFNYXth/us7Chj6hbv4Ad41povBhdss2Dzo2+qocgHLZ63/I+maWLfsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aZO8PawU/dDi4Hx2CxbhbwQWkPfwvax029IZQaU44nA=; b=fwasnHGrli7CFq63qaBRy1SyTMISbThRUAhiCvwk3VGobe2ntqgufaNbiREcd5xcGngmNV7QOIdZmBTa2UXBsCEj0zQnQpYkoEcE+GfE31x5Vv0fRlLA0UUHEED3BAWG7dUvNx1K4IkuDWZlfybxM4DgjOBs1FbCz8DC+fujNeez6uxKWv6EezTGey6nW5PNqVx7KZvhDNcbj+SMEMDptrm+QQBAYHTHQeLW5SdA7a0o2NlrfD9qrZW+DE4DFrkkPgXEKnCqNuGUBTfQRdu03R3f3arAYlfqLkY4fY2fYM63RpBDUuJNNZN6HMKl5Cz+GqCnsZEL0LiWIAH6HxCloA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aZO8PawU/dDi4Hx2CxbhbwQWkPfwvax029IZQaU44nA=; b=IDHC4zrMa+LStI++izUaTmA9mLAR5ftZbsvBxUh9rQ8m4JEEy1gXUX4jsosZcS6Tw4LF/5mc9MBfndYA/dwDoygsm3A496Emu1NTepO6I/DaMvG08GqOg+A3ztuR4ZZ6L4E5qU1q4cZBUqlgTsf9Nu/sm+rXXxvTMhyiFe0fAqJlhSA4BgiDvXnR3MaTMEG3To41nLRa8QEuFZbeHZCfzNY+p9CvUG4H8NHso+wA7n07f1rLhEOLb5tsliiBgqYn8t1PfcjI4JOMwIu+BZ4nxKZHa4QS8VCC0g/8c73cZA3cZVamAiKGuEJOOmquuTqqOQtQz5S5KOX0dJIGDvWrMQ== Received: from DB3EUR04FT056.eop-eur04.prod.protection.outlook.com (2a01:111:e400:7e0c::43) by DB3EUR04HT192.eop-eur04.prod.protection.outlook.com (2a01:111:e400:7e0c::381) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4108.25; Thu, 6 May 2021 05:11:58 +0000 Received: from VI1PR0301MB2159.eurprd03.prod.outlook.com (2a01:111:e400:7e0c::45) by DB3EUR04FT056.mail.protection.outlook.com (2a01:111:e400:7e0c::69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4108.25 via Frontend Transport; Thu, 6 May 2021 05:11:58 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:F41C9A2AEECEB12451A62E555B9D281FFE379BD8DA30D7B05EBDF8A83FAADE45; UpperCasedChecksum:BC8D20C215C4E0D5A8DFCAFB9CD79F30FD74AEB52A7BD352FA1DC53AE1AE5E54; SizeAsReceived:7603; Count:48 Received: from VI1PR0301MB2159.eurprd03.prod.outlook.com ([fe80::d9b:66ba:63ad:967b]) by VI1PR0301MB2159.eurprd03.prod.outlook.com ([fe80::d9b:66ba:63ad:967b%5]) with mapi id 15.20.4108.026; Thu, 6 May 2021 05:11:58 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 6 May 2021 07:11:15 +0200 Message-ID: X-Mailer: git-send-email 2.27.0 In-Reply-To: References: X-TMN: [tZkG0ookUTdPUxi7KC4+qIyk0jfLQe0A9LENTXot9eM=] X-ClientProxiedBy: ZR0P278CA0145.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:41::15) To VI1PR0301MB2159.eurprd03.prod.outlook.com (2603:10a6:800:26::20) X-Microsoft-Original-Message-ID: <20210506051121.832886-16-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.193.170.150) by ZR0P278CA0145.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:41::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4108.24 via Frontend Transport; Thu, 6 May 2021 05:11:58 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 48 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 1b3d11f1-29cf-44b5-b79d-08d9104d794f X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQ2WpFcKeHQard1uCGdQvPTIt1mUYdi7H/v565yEWvnh8vw5/WmSxgjj93KUsN+CBtym/O5uJg0a4KbfIYLVFZD4YbfGFQ58ENqSHGWkUWJBFlrh5kTuD9RR5FeFyFFenGzAWYXE+lBXgN2Lq4cq8ZB3zVnWl8oAJb03lB9F1bicNK62yW40jR5izAJwyuFd059sD/JuAe30AKIQXg1JE3MBnlBa34nkJKczaTV82q82WDiatrt5UXzFEhPdPFkapUADdNs3J+50POyuBhoN5ETbbESxON2UB7kr7CwUVbLPMgRLKQFugzVtCfgO3ybf6zkB7/fsgQ1S15/E7iR4px7zbXrJBhGB0pZcYGonnMcOCcI3SCL8PllVtMaldSqKcYo6AAKNy+kjKMGz7UGpHmX/Jjlz8ldgPjNUgBHmv0N9AZz1rW+fBt0LCR3zwVxDsYFdmQ2WGzjKi+ImkI2Fx8f52zZpNKDMn0ALFUkGjJIq1hhMTyO+yHalv2pSupkhoXnxCaO1EAknvHBdVedg7kDkqcenWZrb4mEKU0diL+aWVxwqIYkUyYgs7D7j/V0XqameWDwNoQjewNtB+Jiv2Z65GJ8jYn7GFBiPIhPXBbhFqW1rr94xJNhFl5hRF81UkobrQl+gDy65g1BzwhAqiNxBHiL1zw1SbEW7J+GuEtrwn4oVEW2eGunamw9jgyPkW6zcy4h7Enn1PgNX9QJVaRyFhVxkq114ldyLhzy/Ny/S9IveuJEd4sDh882dkN7DCU= X-MS-TrafficTypeDiagnostic: DB3EUR04HT192: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Q0/axhbIaOVlQ47aAYN7A9QBBJ/oUfycRwpn4kutHigm9xpNQgO2Ud+VQEiLqc0VgsDk84W0avSimsE4Nu7mzfyUPoQrsaL9dN9FwjdqLd6PxfZxKm+IEVZ4OBjMwCcwYxWWrp++vJH/kDqRg5ncQf8R8CVGN63aA14yijdi03pGiRLWA9czHbFtE2Ene8mO6W/Zb03dLVYuYhKrgKhv/h82gALRy7qZyHKLjq9s/1Zrsbdz+IbEeCsk3Gg/n8fo5WYDjdLRRUB+PVRfXPjQ72FP+aPUjDmzASLJrTDx+G0fq31+F0B0WUtKcHc4ELH8muP8R3Twg7iKJ3jHSNsGDsnGNDn4TQkCtlt31/3RubMdgc4oquRHBkYJyKDgxVLPJk49OxLx765T1OqcYk3i6Q== X-MS-Exchange-AntiSpam-MessageData: H8MEmy9lli4JMERCyqBuU4C7I+fl4LDGsqHnHAXslYIqQ0MxYM4vzRUiDs1Q6rZxRudm029e9czm6ZpiYLALCnfFhzHjHdf/ZHyp5tHdwWQ5HRZjd9qVqZPGWMbl2BIKB22xunCxHTu7MJFHKQPnAQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1b3d11f1-29cf-44b5-b79d-08d9104d794f X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 May 2021 05:11:58.5098 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: DB3EUR04FT056.eop-eur04.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3EUR04HT192 Subject: [FFmpeg-devel] [PATCH 17/23] avcodec/wmaprodec: Make decoders init-threadsafe X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: gK0YXTSY/wUW Content-Length: 7115 In this case this actually fixes a potential data race: The static VLC tables were reinitialized every time an AVCodecContext has been initialized; while the mutex in avcodec_open2() ensured that the VLCs could not be initialized concurrently by multiple threads, nothing guaranteed that these VLCs are not read concurrently (when decoding a packet with an already initialized AVCodecContext) while another thread initializes them. This is undefined behaviour despite the values being written coinciding with the earlier values. Signed-off-by: Andreas Rheinhardt --- libavcodec/wmaprodec.c | 75 ++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/libavcodec/wmaprodec.c b/libavcodec/wmaprodec.c index 4b2dceb5bc..e0d00d2d37 100644 --- a/libavcodec/wmaprodec.c +++ b/libavcodec/wmaprodec.c @@ -93,6 +93,7 @@ #include "libavutil/intfloat.h" #include "libavutil/intreadwrite.h" #include "libavutil/mem_internal.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "internal.h" @@ -309,6 +310,38 @@ static av_cold int get_rate(AVCodecContext *avctx) return avctx->sample_rate; } +static av_cold void decode_init_static(void) +{ + INIT_VLC_STATIC(&sf_vlc, SCALEVLCBITS, HUFF_SCALE_SIZE, + scale_huffbits, 1, 1, + scale_huffcodes, 2, 2, 616); + INIT_VLC_STATIC(&sf_rl_vlc, VLCBITS, HUFF_SCALE_RL_SIZE, + scale_rl_huffbits, 1, 1, + scale_rl_huffcodes, 4, 4, 1406); + INIT_VLC_STATIC(&coef_vlc[0], VLCBITS, HUFF_COEF0_SIZE, + coef0_huffbits, 1, 1, + coef0_huffcodes, 4, 4, 2108); + INIT_VLC_STATIC(&coef_vlc[1], VLCBITS, HUFF_COEF1_SIZE, + coef1_huffbits, 1, 1, + coef1_huffcodes, 4, 4, 3912); + INIT_VLC_STATIC(&vec4_vlc, VLCBITS, HUFF_VEC4_SIZE, + vec4_huffbits, 1, 1, + vec4_huffcodes, 2, 2, 604); + INIT_VLC_STATIC(&vec2_vlc, VLCBITS, HUFF_VEC2_SIZE, + vec2_huffbits, 1, 1, + vec2_huffcodes, 2, 2, 562); + INIT_VLC_STATIC(&vec1_vlc, VLCBITS, HUFF_VEC1_SIZE, + vec1_huffbits, 1, 1, + vec1_huffcodes, 2, 2, 562); + + /** calculate sine values for the decorrelation matrix */ + for (int i = 0; i < 33; i++) + sin64[i] = sin(i * M_PI / 64.0); + + for (int i = WMAPRO_BLOCK_MIN_BITS; i <= WMAPRO_BLOCK_MAX_BITS; i++) + ff_init_ff_sine_windows(i); +} + /** *@brief Initialize the decoder. *@param avctx codec context @@ -316,6 +349,7 @@ static av_cold int get_rate(AVCodecContext *avctx) */ static av_cold int decode_init(WMAProDecodeCtx *s, AVCodecContext *avctx, int num_stream) { + static AVOnce init_static_once = AV_ONCE_INIT; uint8_t *edata_ptr = avctx->extradata; unsigned int channel_mask; int i, bits, ret; @@ -460,34 +494,6 @@ static av_cold int decode_init(WMAProDecodeCtx *s, AVCodecContext *avctx, int nu } } - INIT_VLC_STATIC(&sf_vlc, SCALEVLCBITS, HUFF_SCALE_SIZE, - scale_huffbits, 1, 1, - scale_huffcodes, 2, 2, 616); - - INIT_VLC_STATIC(&sf_rl_vlc, VLCBITS, HUFF_SCALE_RL_SIZE, - scale_rl_huffbits, 1, 1, - scale_rl_huffcodes, 4, 4, 1406); - - INIT_VLC_STATIC(&coef_vlc[0], VLCBITS, HUFF_COEF0_SIZE, - coef0_huffbits, 1, 1, - coef0_huffcodes, 4, 4, 2108); - - INIT_VLC_STATIC(&coef_vlc[1], VLCBITS, HUFF_COEF1_SIZE, - coef1_huffbits, 1, 1, - coef1_huffcodes, 4, 4, 3912); - - INIT_VLC_STATIC(&vec4_vlc, VLCBITS, HUFF_VEC4_SIZE, - vec4_huffbits, 1, 1, - vec4_huffcodes, 2, 2, 604); - - INIT_VLC_STATIC(&vec2_vlc, VLCBITS, HUFF_VEC2_SIZE, - vec2_huffbits, 1, 1, - vec2_huffcodes, 2, 2, 562); - - INIT_VLC_STATIC(&vec1_vlc, VLCBITS, HUFF_VEC1_SIZE, - vec1_huffbits, 1, 1, - vec1_huffcodes, 2, 2, 562); - /** calculate number of scale factor bands and their offsets for every possible block size */ for (i = 0; i < num_possible_block_sizes; i++) { @@ -554,7 +560,6 @@ static av_cold int decode_init(WMAProDecodeCtx *s, AVCodecContext *avctx, int nu /** init MDCT windows: simple sine window */ for (i = 0; i < WMAPRO_BLOCK_SIZES; i++) { const int win_idx = WMAPRO_BLOCK_MAX_BITS - i; - ff_init_ff_sine_windows(win_idx); s->windows[WMAPRO_BLOCK_SIZES - i - 1] = ff_sine_windows[win_idx]; } @@ -566,15 +571,13 @@ static av_cold int decode_init(WMAProDecodeCtx *s, AVCodecContext *avctx, int nu s->subwoofer_cutoffs[i] = av_clip(cutoff, 4, block_size); } - /** calculate sine values for the decorrelation matrix */ - for (i = 0; i < 33; i++) - sin64[i] = sin(i*M_PI / 64.0); - if (avctx->debug & FF_DEBUG_BITSTREAM) dump_context(s); avctx->channel_layout = channel_mask; + ff_thread_once(&init_static_once, decode_init_static); + return 0; } @@ -2018,10 +2021,10 @@ const AVCodec ff_wmapro_decoder = { .close = wmapro_decode_end, .decode = wmapro_decode_packet, .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .flush = wmapro_flush, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, }; const AVCodec ff_xma1_decoder = { @@ -2034,9 +2037,9 @@ const AVCodec ff_xma1_decoder = { .close = xma_decode_end, .decode = xma_decode_packet, .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, }; const AVCodec ff_xma2_decoder = { @@ -2050,7 +2053,7 @@ const AVCodec ff_xma2_decoder = { .decode = xma_decode_packet, .flush = xma_flush, .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, };