Skip to content

Commit d5a8136

Browse files
committed
Avoiding leaks when opus_demo exits with an error
This gets rid of false positives in static analysis (see https://trac.webkit.org/changeset/232236/webkit)
1 parent d6ae25a commit d5a8136

File tree

1 file changed

+36
-46
lines changed

1 file changed

+36
-46
lines changed

src/opus_demo.c

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,7 @@ static opus_uint32 char_to_int(unsigned char ch[4])
7979
| ((opus_uint32)ch[2]<< 8) | (opus_uint32)ch[3];
8080
}
8181

82-
static void check_encoder_option(int decode_only, const char *opt)
83-
{
84-
if (decode_only)
85-
{
86-
fprintf(stderr, "option %s is only for encoding\n", opt);
87-
exit(EXIT_FAILURE);
88-
}
89-
}
82+
#define check_encoder_option(decode_only, opt) do {if (decode_only) {fprintf(stderr, "option %s is only for encoding\n", opt); goto failure;}} while(0)
9083

9184
static const int silk8_test[][4] = {
9285
{MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 1},
@@ -218,15 +211,16 @@ int main(int argc, char *argv[])
218211
{
219212
int err;
220213
char *inFile, *outFile;
221-
FILE *fin, *fout;
214+
FILE *fin=NULL;
215+
FILE *fout=NULL;
222216
OpusEncoder *enc=NULL;
223217
OpusDecoder *dec=NULL;
224218
int args;
225219
int len[2];
226220
int frame_size, channels;
227221
opus_int32 bitrate_bps=0;
228-
unsigned char *data[2];
229-
unsigned char *fbytes;
222+
unsigned char *data[2] = {NULL, NULL};
223+
unsigned char *fbytes=NULL;
230224
opus_int32 sampling_rate;
231225
int use_vbr;
232226
int max_payload_bytes;
@@ -240,7 +234,8 @@ int main(int argc, char *argv[])
240234
int k;
241235
opus_int32 skip=0;
242236
int stop=0;
243-
short *in, *out;
237+
short *in=NULL;
238+
short *out=NULL;
244239
int application=OPUS_APPLICATION_AUDIO;
245240
double bits=0.0, bits_max=0.0, bits_act=0.0, bits2=0.0, nrg;
246241
double tot_samples=0;
@@ -268,11 +263,12 @@ int main(int argc, char *argv[])
268263
int remaining=0;
269264
int variable_duration=OPUS_FRAMESIZE_ARG;
270265
int delayed_decision=0;
266+
int ret = EXIT_FAILURE;
271267

272268
if (argc < 5 )
273269
{
274270
print_usage( argv );
275-
return EXIT_FAILURE;
271+
goto failure;
276272
}
277273

278274
tot_in=tot_out=0;
@@ -291,7 +287,7 @@ int main(int argc, char *argv[])
291287
if (!decode_only && argc < 7 )
292288
{
293289
print_usage( argv );
294-
return EXIT_FAILURE;
290+
goto failure;
295291
}
296292

297293
if (!decode_only)
@@ -303,7 +299,7 @@ int main(int argc, char *argv[])
303299
else if (strcmp(argv[args], "audio")!=0) {
304300
fprintf(stderr, "unknown application: %s\n", argv[args]);
305301
print_usage(argv);
306-
return EXIT_FAILURE;
302+
goto failure;
307303
}
308304
args++;
309305
}
@@ -316,7 +312,7 @@ int main(int argc, char *argv[])
316312
{
317313
fprintf(stderr, "Supported sampling rates are 8000, 12000, "
318314
"16000, 24000 and 48000.\n");
319-
return EXIT_FAILURE;
315+
goto failure;
320316
}
321317
frame_size = sampling_rate/50;
322318

@@ -326,7 +322,7 @@ int main(int argc, char *argv[])
326322
if (channels < 1 || channels > 2)
327323
{
328324
fprintf(stderr, "Opus_demo supports only 1 or 2 channels.\n");
329-
return EXIT_FAILURE;
325+
goto failure;
330326
}
331327

332328
if (!decode_only)
@@ -366,7 +362,7 @@ int main(int argc, char *argv[])
366362
fprintf(stderr, "Unknown bandwidth %s. "
367363
"Supported are NB, MB, WB, SWB, FB.\n",
368364
argv[ args + 1 ]);
369-
return EXIT_FAILURE;
365+
goto failure;
370366
}
371367
args += 2;
372368
} else if( strcmp( argv[ args ], "-framesize" ) == 0 ) {
@@ -393,7 +389,7 @@ int main(int argc, char *argv[])
393389
fprintf(stderr, "Unsupported frame size: %s ms. "
394390
"Supported are 2.5, 5, 10, 20, 40, 60, 80, 100, 120.\n",
395391
argv[ args + 1 ]);
396-
return EXIT_FAILURE;
392+
goto failure;
397393
}
398394
args += 2;
399395
} else if( strcmp( argv[ args ], "-max_payload" ) == 0 ) {
@@ -480,7 +476,7 @@ int main(int argc, char *argv[])
480476
} else {
481477
printf( "Error: unrecognized setting: %s\n\n", argv[ args ] );
482478
print_usage( argv );
483-
return EXIT_FAILURE;
479+
goto failure;
484480
}
485481
}
486482

@@ -491,15 +487,15 @@ int main(int argc, char *argv[])
491487
{
492488
fprintf (stderr, "max_payload_bytes must be between 0 and %d\n",
493489
MAX_PACKET);
494-
return EXIT_FAILURE;
490+
goto failure;
495491
}
496492

497493
inFile = argv[argc-2];
498494
fin = fopen(inFile, "rb");
499495
if (!fin)
500496
{
501497
fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
502-
return EXIT_FAILURE;
498+
goto failure;
503499
}
504500
if (mode_list)
505501
{
@@ -517,8 +513,7 @@ int main(int argc, char *argv[])
517513
if (!fout)
518514
{
519515
fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
520-
fclose(fin);
521-
return EXIT_FAILURE;
516+
goto failure;
522517
}
523518

524519
if (!decode_only)
@@ -527,9 +522,7 @@ int main(int argc, char *argv[])
527522
if (err != OPUS_OK)
528523
{
529524
fprintf(stderr, "Cannot create encoder: %s\n", opus_strerror(err));
530-
fclose(fin);
531-
fclose(fout);
532-
return EXIT_FAILURE;
525+
goto failure;
533526
}
534527
opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
535528
opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth));
@@ -551,9 +544,7 @@ int main(int argc, char *argv[])
551544
if (err != OPUS_OK)
552545
{
553546
fprintf(stderr, "Cannot create decoder: %s\n", opus_strerror(err));
554-
fclose(fin);
555-
fclose(fout);
556-
return EXIT_FAILURE;
547+
goto failure;
557548
}
558549
}
559550

@@ -729,9 +720,7 @@ int main(int argc, char *argv[])
729720
if (len[toggle] < 0)
730721
{
731722
fprintf (stderr, "opus_encode() returned %d\n", len[toggle]);
732-
fclose(fin);
733-
fclose(fout);
734-
return EXIT_FAILURE;
723+
goto failure;
735724
}
736725
curr_mode_count += frame_size;
737726
if (curr_mode_count > mode_switch_time && curr_mode < nb_modes_in_list-1)
@@ -748,7 +737,7 @@ int main(int argc, char *argv[])
748737
if ((err = opus_packet_pad(data[toggle], len[toggle], new_len)) != OPUS_OK)
749738
{
750739
fprintf(stderr, "padding failed: %s\n", opus_strerror(err));
751-
return EXIT_FAILURE;
740+
goto failure;
752741
}
753742
len[toggle] = new_len;
754743
}
@@ -759,16 +748,16 @@ int main(int argc, char *argv[])
759748
int_to_char(len[toggle], int_field);
760749
if (fwrite(int_field, 1, 4, fout) != 4) {
761750
fprintf(stderr, "Error writing.\n");
762-
return EXIT_FAILURE;
751+
goto failure;
763752
}
764753
int_to_char(enc_final_range[toggle], int_field);
765754
if (fwrite(int_field, 1, 4, fout) != 4) {
766755
fprintf(stderr, "Error writing.\n");
767-
return EXIT_FAILURE;
756+
goto failure;
768757
}
769758
if (fwrite(data[toggle], 1, len[toggle], fout) != (unsigned)len[toggle]) {
770759
fprintf(stderr, "Error writing.\n");
771-
return EXIT_FAILURE;
760+
goto failure;
772761
}
773762
tot_samples += nb_encoded;
774763
} else {
@@ -811,7 +800,7 @@ int main(int argc, char *argv[])
811800
}
812801
if (fwrite(fbytes, sizeof(short)*channels, output_samples-skip, fout) != (unsigned)(output_samples-skip)){
813802
fprintf(stderr, "Error writing.\n");
814-
return EXIT_FAILURE;
803+
goto failure;
815804
}
816805
tot_out += output_samples-skip;
817806
}
@@ -837,9 +826,7 @@ int main(int argc, char *argv[])
837826
(long)count,
838827
(unsigned long)enc_final_range[toggle^use_inbandfec],
839828
(unsigned long)dec_final_range);
840-
fclose(fin);
841-
fclose(fout);
842-
return EXIT_FAILURE;
829+
goto failure;
843830
}
844831

845832
lost_prev = lost;
@@ -888,15 +875,18 @@ int main(int argc, char *argv[])
888875
fprintf(stderr, "bitrate statistics are undefined\n");
889876
}
890877
silk_TimerSave("opus_timing.txt");
878+
ret = EXIT_SUCCESS;
879+
failure:
891880
opus_encoder_destroy(enc);
892881
opus_decoder_destroy(dec);
893882
free(data[0]);
894-
if (use_inbandfec)
895-
free(data[1]);
896-
fclose(fin);
897-
fclose(fout);
883+
free(data[1]);
884+
if (fin)
885+
fclose(fin);
886+
if (fout)
887+
fclose(fout);
898888
free(in);
899889
free(out);
900890
free(fbytes);
901-
return EXIT_SUCCESS;
891+
return ret;
902892
}

0 commit comments

Comments
 (0)