1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avformat/rtmpproto: guard usage of undefined functions with preprocessor

The asumption is that DCE will remove references to those functions.
However some compilers with certain instrumentation enabled doesn't DCE
those at all, resulting in linking failure. Tested with cl.exe -RTCu -RTCs.

Signed-off-by: Kacper Michajłow <kasper93@gmail.com>
This commit is contained in:
Kacper Michajłow
2025-07-21 01:45:23 +02:00
parent 40b56c6536
commit d12863a693

View File

@ -1256,7 +1256,10 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
int i; int i;
int server_pos, client_pos; int server_pos, client_pos;
uint8_t digest[32], signature[32]; uint8_t digest[32], signature[32];
int ret, type = 0; int ret;
#if CONFIG_FFRTMPCRYPT_PROTOCOL
int type = 0;
#endif
av_log(s, AV_LOG_DEBUG, "Handshaking...\n"); av_log(s, AV_LOG_DEBUG, "Handshaking...\n");
@ -1265,7 +1268,8 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
for (i = 9; i <= RTMP_HANDSHAKE_PACKET_SIZE; i++) for (i = 9; i <= RTMP_HANDSHAKE_PACKET_SIZE; i++)
tosend[i] = av_lfg_get(&rnd) >> 24; tosend[i] = av_lfg_get(&rnd) >> 24;
if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) { #if CONFIG_FFRTMPCRYPT_PROTOCOL
if (rt->encrypted) {
/* When the client wants to use RTMPE, we have to change the command /* When the client wants to use RTMPE, we have to change the command
* byte to 0x06 which means to use encrypted data and we have to set * byte to 0x06 which means to use encrypted data and we have to set
* the flash version to at least 9.0.115.0. */ * the flash version to at least 9.0.115.0. */
@ -1280,6 +1284,7 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
if ((ret = ff_rtmpe_gen_pub_key(rt->stream, tosend + 1)) < 0) if ((ret = ff_rtmpe_gen_pub_key(rt->stream, tosend + 1)) < 0)
return ret; return ret;
} }
#endif
client_pos = rtmp_handshake_imprint_with_digest(tosend + 1, rt->encrypted); client_pos = rtmp_handshake_imprint_with_digest(tosend + 1, rt->encrypted);
if (client_pos < 0) if (client_pos < 0)
@ -1313,7 +1318,9 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
return server_pos; return server_pos;
if (!server_pos) { if (!server_pos) {
#if CONFIG_FFRTMPCRYPT_PROTOCOL
type = 1; type = 1;
#endif
server_pos = rtmp_validate_digest(serverdata + 1, 8); server_pos = rtmp_validate_digest(serverdata + 1, 8);
if (server_pos < 0) if (server_pos < 0)
return server_pos; return server_pos;
@ -1343,7 +1350,8 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
if (ret < 0) if (ret < 0)
return ret; return ret;
if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) { #if CONFIG_FFRTMPCRYPT_PROTOCOL
if (rt->encrypted) {
/* Compute the shared secret key sent by the server and initialize /* Compute the shared secret key sent by the server and initialize
* the RC4 encryption. */ * the RC4 encryption. */
if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1, if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1,
@ -1353,6 +1361,7 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
/* Encrypt the signature received by the server. */ /* Encrypt the signature received by the server. */
ff_rtmpe_encrypt_sig(rt->stream, signature, digest, serverdata[0]); ff_rtmpe_encrypt_sig(rt->stream, signature, digest, serverdata[0]);
} }
#endif
if (memcmp(signature, clientdata + RTMP_HANDSHAKE_PACKET_SIZE - 32, 32)) { if (memcmp(signature, clientdata + RTMP_HANDSHAKE_PACKET_SIZE - 32, 32)) {
av_log(s, AV_LOG_ERROR, "Signature mismatch\n"); av_log(s, AV_LOG_ERROR, "Signature mismatch\n");
@ -1373,25 +1382,30 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
if (ret < 0) if (ret < 0)
return ret; return ret;
if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) { #if CONFIG_FFRTMPCRYPT_PROTOCOL
if (rt->encrypted) {
/* Encrypt the signature to be send to the server. */ /* Encrypt the signature to be send to the server. */
ff_rtmpe_encrypt_sig(rt->stream, tosend + ff_rtmpe_encrypt_sig(rt->stream, tosend +
RTMP_HANDSHAKE_PACKET_SIZE - 32, digest, RTMP_HANDSHAKE_PACKET_SIZE - 32, digest,
serverdata[0]); serverdata[0]);
} }
#endif
// write reply back to the server // write reply back to the server
if ((ret = ffurl_write(rt->stream, tosend, if ((ret = ffurl_write(rt->stream, tosend,
RTMP_HANDSHAKE_PACKET_SIZE)) < 0) RTMP_HANDSHAKE_PACKET_SIZE)) < 0)
return ret; return ret;
if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) { #if CONFIG_FFRTMPCRYPT_PROTOCOL
if (rt->encrypted) {
/* Set RC4 keys for encryption and update the keystreams. */ /* Set RC4 keys for encryption and update the keystreams. */
if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0) if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0)
return ret; return ret;
} }
#endif
} else { } else {
if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) { #if CONFIG_FFRTMPCRYPT_PROTOCOL
if (rt->encrypted) {
/* Compute the shared secret key sent by the server and initialize /* Compute the shared secret key sent by the server and initialize
* the RC4 encryption. */ * the RC4 encryption. */
if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1, if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1,
@ -1404,16 +1418,19 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
serverdata[0]); serverdata[0]);
} }
} }
#endif
if ((ret = ffurl_write(rt->stream, serverdata + 1, if ((ret = ffurl_write(rt->stream, serverdata + 1,
RTMP_HANDSHAKE_PACKET_SIZE)) < 0) RTMP_HANDSHAKE_PACKET_SIZE)) < 0)
return ret; return ret;
if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) { #if CONFIG_FFRTMPCRYPT_PROTOCOL
if (rt->encrypted) {
/* Set RC4 keys for encryption and update the keystreams. */ /* Set RC4 keys for encryption and update the keystreams. */
if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0) if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0)
return ret; return ret;
} }
#endif
} }
return 0; return 0;