From 06d89598fa448bd85836b0533edf61017d933b96 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Wed, 3 Sep 2014 16:36:19 +0200 Subject: [PATCH] Fixed some Coverity reported errors These Coverity errors should be fixed (mostly classified as High Impact Outstanding by Coverity): 53922, 53923, 53935, 53938, 53945, 53963, 53974, 53976, 53978, 53979, 53980, 53981, 53982, 53988, 53990, 53991, 53993, 53994, 53995, 53998, 54000, 54002, 54004, 54008, 54010, 54013, 54016, 54018, 54020, 54022, 54024, 54025, 54027, 54028, 54030, 54031, 54032, 54033, 54034, 54035, 54036, 54038, 54039, 54041, 54043, 54047, 54048, 54050, 54053, 54054, 54055, 54056, 54062, 54064, 54065, 54067, 54071, 54072, 54074, 54075, 54076, 54081, 54087, 54088, 54089, 54091, 54093, 54096, 54097, 54103, 54104, 54106, 54109, 54111, 54112, 54114, 54117, 54119, 54120, 54121, 54125, 54126, 54129, 54130, 54132, 54133, 54136, 54137, 54140, 54145, 54146, 54149, 54150, 54151, 54153, 54154, 54156, 54157 --- dxt_compress/dxt_decoder.c | 5 +- dxt_compress/dxt_encoder.c | 5 +- dxt_compress/dxt_util.c | 1 + src/audio/audio.cpp | 1 + src/audio/capture/portaudio.c | 1 + src/audio/capture/testcard.c | 2 + src/audio/codec/libavcodec.cpp | 2 + src/audio/export.c | 12 ++- src/audio/playback/decklink.cpp | 51 +++++++----- src/audio/resampler.cpp | 2 + src/capture_filter.cpp | 4 +- src/capture_filter/blank.c | 2 +- src/capture_filter/logo.cpp | 10 ++- src/config_unix.h | 2 + src/control_socket.cpp | 15 +++- src/glx_common.c | 2 +- src/hd-rum-translator/hd-rum-decompress.cpp | 2 +- src/hd-rum-translator/hd-rum-translator.c | 4 +- src/messaging.cpp | 7 +- src/messaging.h | 6 +- src/module.c | 9 ++- src/rtp/audio_decoders.cpp | 19 +++-- src/rtp/fec.cpp | 13 ++-- src/rtp/net_udp.c | 38 ++++----- src/rtp/pbuf.c | 8 +- src/rtp/rtp.c | 3 + src/rtp/rtp_callback.c | 9 ++- src/rtp/video_decoders.cpp | 22 +++--- src/transmit.cpp | 8 +- src/utils/config_file.c | 1 + src/utils/vf_split.cpp | 2 +- src/video_capture/aggregate.c | 1 + src/video_capture/bluefish444.cpp | 2 +- src/video_capture/decklink.cpp | 86 +++++++++++---------- src/video_capture/deltacast.cpp | 49 +++++++----- src/video_capture/deltacast_dvi.cpp | 22 +++--- src/video_capture/import.c | 80 ++++++++++++------- src/video_capture/screen_x11.c | 1 + src/video_capture/switcher.c | 11 ++- src/video_capture/swmix.cpp | 10 ++- src/video_capture/testcard.c | 34 ++++---- src/video_capture/v4l2.c | 50 ++++++------ src/video_compress.cpp | 1 + src/video_compress/cuda_dxt.cpp | 2 + src/video_compress/dxt_glsl.cpp | 45 +++++------ src/video_compress/jpeg.cpp | 33 ++++---- src/video_compress/libavcodec.c | 5 +- src/video_decompress/jpeg_to_dxt.cpp | 8 +- src/video_display/aggregate.c | 44 +++++------ src/video_display/decklink.cpp | 13 ++-- src/video_display/deltacast.cpp | 1 + src/video_display/dvs.c | 47 +++++++---- src/video_display/gl.cpp | 9 ++- src/video_display/sage.cpp | 13 ++-- src/video_display/sdl.cpp | 3 +- src/video_export.c | 2 + src/video_frame.c | 7 +- 57 files changed, 498 insertions(+), 349 deletions(-) diff --git a/dxt_compress/dxt_decoder.c b/dxt_compress/dxt_decoder.c index 2ef6694fa..8c97b02ed 100644 --- a/dxt_compress/dxt_decoder.c +++ b/dxt_compress/dxt_decoder.c @@ -194,8 +194,11 @@ dxt_decoder_create(enum dxt_type type, int width, int height, enum dxt_format ou } else { decoder->shader_vertex_display = dxt_shader_create_from_source(vp_compress, GL_VERTEX_SHADER); } - if ( decoder->shader_fragment_display == 0 || decoder->shader_vertex_display == 0 ) + if ( decoder->shader_fragment_display == 0 || decoder->shader_vertex_display == 0 ) { + /// @todo Free other stuff as well + free(decoder); return NULL; + } // Attach shader to program and link the program glAttachShader(decoder->program_display, decoder->shader_fragment_display); glAttachShader(decoder->program_display, decoder->shader_vertex_display); diff --git a/dxt_compress/dxt_encoder.c b/dxt_compress/dxt_encoder.c index 542d33e06..354404ab1 100644 --- a/dxt_compress/dxt_encoder.c +++ b/dxt_compress/dxt_encoder.c @@ -362,8 +362,11 @@ dxt_encoder_create(enum dxt_type type, int width, int height, enum dxt_format fo //glActiveTexture(GL_TEXTURE0); if(format == DXT_FORMAT_YUV422) { - if(!dxt_prepare_yuv422_shader(encoder)) + if(!dxt_prepare_yuv422_shader(encoder)) { + /// @todo What about generated textures etc. ? + free(encoder); return NULL; + } } glBindTexture(GL_TEXTURE_2D, encoder->texture_id); diff --git a/dxt_compress/dxt_util.c b/dxt_compress/dxt_util.c index 830629560..ee5aaa252 100644 --- a/dxt_compress/dxt_util.c +++ b/dxt_compress/dxt_util.c @@ -68,6 +68,7 @@ dxt_shader_create_from_file(const char* filename, GLenum type) char* program = (char*)malloc((data_size + 1) * sizeof(char)); if ( (size_t) data_size != fread(program, sizeof(char), data_size, file) ) { fprintf(stderr, "Failed to load program [%d bytes] from file %s!\n", data_size, filename); + fclose(file); return 0; } fclose(file); diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 7df8d4dfa..6fd6a5195 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -323,6 +323,7 @@ struct state_audio * audio_cfg_init(struct module *parent, const char *addrs, in &s->audio_network_parameters)) == NULL) { printf("Unable to open audio network\n"); + free(tmp); goto error; } free(tmp); diff --git a/src/audio/capture/portaudio.c b/src/audio/capture/portaudio.c index 4bd1c298f..4a733516a 100644 --- a/src/audio/capture/portaudio.c +++ b/src/audio/capture/portaudio.c @@ -226,6 +226,7 @@ void * portaudio_capture_init(char *cfg) { printf("error initializing portaudio\n"); printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) ); + free(s); return NULL; } diff --git a/src/audio/capture/testcard.c b/src/audio/capture/testcard.c index ce57665e4..7a9fc89cf 100644 --- a/src/audio/capture/testcard.c +++ b/src/audio/capture/testcard.c @@ -189,6 +189,8 @@ void * audio_cap_testcard_init(char *cfg) int ret = read_wav_header(wav, &metadata); if(ret != WAV_HDR_PARSE_OK) { print_wav_error(ret); + fclose(wav); + free(s); return NULL; } s->audio.bps = metadata.bits_per_sample / 8; diff --git a/src/audio/codec/libavcodec.cpp b/src/audio/codec/libavcodec.cpp index d1b20cffb..bb938c32f 100644 --- a/src/audio/codec/libavcodec.cpp +++ b/src/audio/codec/libavcodec.cpp @@ -168,6 +168,7 @@ static void *libavcodec_init(audio_codec_t audio_codec, audio_codec_direction_t fprintf(stderr, "Your Libavcodec build doesn't contain codec \"%s\".\n", get_name_to_audio_codec(audio_codec)); } + free(s); return NULL; } @@ -178,6 +179,7 @@ static void *libavcodec_init(audio_codec_t audio_codec, audio_codec_direction_t if (!try_init) { fprintf(stderr, "Could not allocate audio codec context\n"); } + free(s); return NULL; } diff --git a/src/audio/export.c b/src/audio/export.c index 76f3d33c5..2cc771662 100644 --- a/src/audio/export.c +++ b/src/audio/export.c @@ -250,13 +250,16 @@ static void finalize(struct audio_export *s) { int padding_byte_len = 0; if((s->saved_format.ch_count * s->saved_format.bps * s->total) % 2 == 1) { - char padding_byte; + char padding_byte = '\0'; padding_byte_len = 1; fwrite(&padding_byte, sizeof(padding_byte), 1, s->output); } - fseek(s->output, CK_MASTER_SIZE_OFFSET, SEEK_SET); + int ret = fseek(s->output, CK_MASTER_SIZE_OFFSET, SEEK_SET); + if (ret != 0) { + goto error; + } uint32_t ck_master_size = 4 + 24 + (8 + s->saved_format.bps * s->saved_format.ch_count * s->total + padding_byte_len); size_t res; @@ -265,7 +268,10 @@ static void finalize(struct audio_export *s) goto error; } - fseek(s->output, CK_DATA_SIZE_OFFSET, SEEK_SET); + ret = fseek(s->output, CK_DATA_SIZE_OFFSET, SEEK_SET); + if (ret != 0) { + goto error; + } uint32_t ck_data_size = s->saved_format.bps * s->saved_format.ch_count * s->total; res = fwrite(&ck_data_size, sizeof(ck_data_size), 1, s->output); diff --git a/src/audio/playback/decklink.cpp b/src/audio/playback/decklink.cpp index 846c3a411..187063363 100644 --- a/src/audio/playback/decklink.cpp +++ b/src/audio/playback/decklink.cpp @@ -248,7 +248,7 @@ void decklink_playback_help(const char *driver_name) void *decklink_playback_init(char *cfg) { - struct state_decklink *s; + struct state_decklink *s = NULL; IDeckLinkIterator* deckLinkIterator; HRESULT result; IDeckLinkConfiguration* deckLinkConfiguration = NULL; @@ -256,6 +256,11 @@ void *decklink_playback_init(char *cfg) //BMDAudioOutputAnalogAESSwitch audioConnection = (BMDAudioOutputAnalogAESSwitch) 0; int cardIdx = 0; int dnum = 0; + IDeckLink *deckLink; + IDeckLinkDisplayModeIterator *displayModeIterator = NULL; + IDeckLinkDisplayMode *deckLinkDisplayMode = NULL; + //BMDDisplayMode displayMode = bmdModeUnknown; + int width, height; #ifdef WIN32 // Initialize COM on this thread @@ -350,14 +355,10 @@ void *decklink_playback_init(char *cfg) fprintf(stderr, "\nA DeckLink iterator could not be created. The DeckLink drivers may not be installed or are outdated.\n"); fprintf(stderr, "This UltraGrid version was compiled with DeckLink drivers %s. You should have at least this version.\n\n", BLACKMAGIC_DECKLINK_API_VERSION_STRING); - return NULL; + goto error; } - s->deckLink = NULL; - s->deckLinkOutput = NULL; - // Connect to the first DeckLink instance - IDeckLink *deckLink; while (deckLinkIterator->Next(&deckLink) == S_OK) { if (dnum == cardIdx){ @@ -370,15 +371,12 @@ void *decklink_playback_init(char *cfg) if(s->deckLink == NULL) { fprintf(stderr, "No DeckLink PCI card #%d found\n", cardIdx); - return NULL; + goto error; } // Obtain the audio/video output interface (IDeckLinkOutput) if (s->deckLink->QueryInterface(IID_IDeckLinkOutput, (void**)&s->deckLinkOutput) != S_OK) { - if(s->deckLinkOutput != NULL) - s->deckLinkOutput->Release(); - s->deckLink->Release(); - return NULL; + goto error; } // Query the DeckLink for its configuration interface @@ -386,7 +384,7 @@ void *decklink_playback_init(char *cfg) if (result != S_OK) { printf("Could not obtain the IDeckLinkConfiguration interface: %08x\n", (int) result); - return NULL; + goto error; } if (s->audio_consumer_levels != -1) { @@ -396,17 +394,14 @@ void *decklink_playback_init(char *cfg) fprintf(stderr, "[DeckLink capture] Unable set input audio consumer levels.\n"); } } - - IDeckLinkDisplayModeIterator *displayModeIterator; - IDeckLinkDisplayMode* deckLinkDisplayMode; - //BMDDisplayMode displayMode = bmdModeUnknown; - int width, height; + deckLinkConfiguration->Release(); + deckLinkConfiguration = NULL; // Populate the display mode combo with a list of display modes supported by the installed DeckLink card if (FAILED(s->deckLinkOutput->GetDisplayModeIterator(&displayModeIterator))) { fprintf(stderr, "Fatal: cannot create display mode iterator [decklink].\n"); - return NULL; + goto error; } // pick first display mode, no matter which it is @@ -417,13 +412,11 @@ void *decklink_playback_init(char *cfg) deckLinkDisplayMode->GetFrameRate(&s->frameRateDuration, &s->frameRateScale); } else { fprintf(stderr, "[decklink] Fatal: cannot get any display mode.\n"); - return NULL; + goto error; } s->frames = 0; - - s->deckLinkOutput->CreateVideoFrame(width, height, width*2, bmdFormat8BitYUV, bmdFrameFlagDefault, &s->deckLinkFrame); s->delegate = new PlaybackDelegate(s); @@ -434,10 +427,26 @@ void *decklink_playback_init(char *cfg) s->deckLinkOutput->EnableVideoOutput(deckLinkDisplayMode->GetDisplayMode(), bmdVideoOutputFlagDefault); displayModeIterator->Release(); + displayModeIterator = NULL; deckLinkDisplayMode->Release(); + deckLinkDisplayMode = NULL; return (void *)s; + +error: + if (displayModeIterator) + displayModeIterator->Release(); + if (deckLinkDisplayMode) + deckLinkDisplayMode->Release(); + if (deckLinkConfiguration) + deckLinkConfiguration->Release(); + if (s->deckLinkOutput != NULL) + s->deckLinkOutput->Release(); + if (s->deckLink != NULL) + s->deckLink->Release(); + free(s); + return NULL; } void decklink_put_frame(void *state, struct audio_frame *frame) diff --git a/src/audio/resampler.cpp b/src/audio/resampler.cpp index 61a552ecb..cca0f5bec 100644 --- a/src/audio/resampler.cpp +++ b/src/audio/resampler.cpp @@ -28,6 +28,8 @@ struct resampler *resampler_init(int dst_sample_rate) void resampler_done(struct resampler *s) { + if (!s) + return; free(s->resample_buffer); free(s->muxed); delete s->resampled; diff --git a/src/capture_filter.cpp b/src/capture_filter.cpp index d4b859f19..8fa97a7ae 100644 --- a/src/capture_filter.cpp +++ b/src/capture_filter.cpp @@ -130,6 +130,7 @@ static int create_filter(struct capture_filter *s, char *cfg) filter_name); } if(ret != 0) { + free(instance); return ret; } simple_linked_list_append(s->filters, instance); @@ -177,11 +178,12 @@ int capture_filter_init(struct module *parent, const char *cfg, struct capture_f while((item = strtok_r(filter_list_str, ",", &save_ptr))) { char filter_name[128]; - strncpy(filter_name, item, sizeof(filter_name)); + strncpy(filter_name, item, sizeof filter_name - 1); int ret = create_filter(s, filter_name); if (ret != 0) { module_done(&s->mod); + free(tmp); free(s); return ret; } diff --git a/src/capture_filter/blank.c b/src/capture_filter/blank.c index 206112d0b..bdefa4942 100644 --- a/src/capture_filter/blank.c +++ b/src/capture_filter/blank.c @@ -90,7 +90,7 @@ static bool parse(struct state_blank *s, char *cfg) s->in_relative_units = false; } - char *item, *save_ptr; + char *item, *save_ptr = NULL; while ((item = strtok_r(cfg, ":", &save_ptr))) { if (s->in_relative_units) { vals_relative[counter] = atof(item) / 100.0; diff --git a/src/capture_filter/logo.cpp b/src/capture_filter/logo.cpp index 2cb250ef0..88ad2d9ed 100644 --- a/src/capture_filter/logo.cpp +++ b/src/capture_filter/logo.cpp @@ -138,12 +138,11 @@ static int init(struct module *parent, const char *cfg, void **state) char *item; if ((item = strtok_r(tmp, ":", &save_ptr)) == NULL) { fprintf(stderr, "File name with logo required!\n"); - return -1; + goto error; } if (!load_logo_data_from_file(s, item)) { - free(s); - return -1; + goto error; } if ((item = strtok_r(tmp, ":", &save_ptr))) { @@ -153,9 +152,14 @@ static int init(struct module *parent, const char *cfg, void **state) } } free(tmp); + tmp = nullptr; *state = s; return 0; +error: + free(tmp); + free(s); + return -1; } static void done(void *state) diff --git a/src/config_unix.h b/src/config_unix.h index 1918bdfaa..158c8e0a0 100644 --- a/src/config_unix.h +++ b/src/config_unix.h @@ -208,5 +208,7 @@ static inline void *aligned_malloc(size_t size, size_t alignment) #define platform_mkdir(a) mkdir(a, 0777) +#define INVALID_SOCKET -1 + #endif /* _CONFIG_UNIX_H */ #endif /* NDEF WIN32 */ diff --git a/src/control_socket.cpp b/src/control_socket.cpp index b22070d05..826008676 100644 --- a/src/control_socket.cpp +++ b/src/control_socket.cpp @@ -316,7 +316,9 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message) resp = send_message(s->root_module, path, (struct message *) msg); - send_message(s->root_module, path_audio, (struct message *) msg_audio); + struct response *resp_audio = + send_message(s->root_module, path_audio, (struct message *) msg_audio); + resp_audio->deleter(resp_audio); } else if (prefix_matches(message, "receiver-port ")) { struct msg_receiver *msg = (struct msg_receiver *) @@ -341,6 +343,7 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message) strncpy(msg->fec, fec + 6, sizeof(msg->fec) - 1); } else { resp = new_response(RESPONSE_NOT_FOUND, strdup("unknown media type")); + free(msg); } if(!resp) { @@ -654,9 +657,13 @@ void control_done(struct control_state *s) module_done(&s->mod); if(s->started) { - write_all(s->internal_fd[0], "quit\r\n", 6); - pthread_join(s->thread_id, NULL); - close(s->internal_fd[0]); + int ret = write_all(s->internal_fd[0], "quit\r\n", 6); + if (ret > 0) { + pthread_join(s->thread_id, NULL); + close(s->internal_fd[0]); + } else { + fprintf(stderr, "Cannot exit control thread!\n"); + } } if(s->connection_type == SERVER) { // for client, the socket has already been closed diff --git a/src/glx_common.c b/src/glx_common.c index 8580d8228..bb2c2dfe9 100644 --- a/src/glx_common.c +++ b/src/glx_common.c @@ -346,7 +346,7 @@ void *glx_init(glx_opengl_version_t version) " ... using old-style GLX context\n" ); context->ctx = glXCreateNewContext( display, bestFbc, GLX_RGBA_TYPE, 0, True ); if(!VERSION_IS_UNSPECIFIED(version)) { - return NULL; + goto error; } } diff --git a/src/hd-rum-translator/hd-rum-decompress.cpp b/src/hd-rum-translator/hd-rum-decompress.cpp index dfc9317fb..77f819a84 100644 --- a/src/hd-rum-translator/hd-rum-decompress.cpp +++ b/src/hd-rum-translator/hd-rum-decompress.cpp @@ -161,7 +161,7 @@ static void *worker(void *arg) memset(&last_desc, 0, sizeof(last_desc)); memset(&last_fec_desc, 0, sizeof(last_fec_desc)); - struct video_desc video_header; + struct video_desc video_header{}; pthread_mutex_unlock(&s->lock); diff --git a/src/hd-rum-translator/hd-rum-translator.c b/src/hd-rum-translator/hd-rum-translator.c index b7d985c7d..4ba52e44a 100644 --- a/src/hd-rum-translator/hd-rum-translator.c +++ b/src/hd-rum-translator/hd-rum-translator.c @@ -161,7 +161,7 @@ static int output_socket(unsigned short port, const char *host, int bufsize) { int s; struct addrinfo hints; - struct addrinfo *res; + struct addrinfo *res = NULL; char saddr[INET_ADDRSTRLEN]; char p[6]; @@ -201,6 +201,8 @@ static int output_socket(unsigned short port, const char *host, int bufsize) exit(2); } + freeaddrinfo(res); + return s; } diff --git a/src/messaging.cpp b/src/messaging.cpp index 6b2e0b214..11aaa6d9e 100644 --- a/src/messaging.cpp +++ b/src/messaging.cpp @@ -37,7 +37,7 @@ struct response *send_message(struct module *root, const char *const_path, struc malloc(sizeof(struct pair_msg_path)); saved_message->msg = msg; memset(saved_message->path, 0, sizeof(saved_message->path)); - strncpy(saved_message->path, const_path + (item - tmp), sizeof(saved_message->path)); + strncpy(saved_message->path, const_path + (item - tmp), sizeof(saved_message->path) - 1); simple_linked_list_append(old_receiver->msg_queue_childs, saved_message); pthread_mutex_unlock(&old_receiver->lock); @@ -50,6 +50,8 @@ struct response *send_message(struct module *root, const char *const_path, struc path = NULL; } + free(tmp); + lock_guard guard(receiver->lock, lock_guard_retain_ownership_t()); if(receiver->msg_callback == NULL) { @@ -74,7 +76,8 @@ void module_check_undelivered_messages(struct module *node) struct pair_msg_path *msg = (struct pair_msg_path *) simple_linked_list_it_next(&it); struct module *receiver = get_matching_child(node, msg->path); if (receiver) { - send_message_to_receiver(receiver, msg->msg); + struct response *resp = send_message_to_receiver(receiver, msg->msg); + resp->deleter(resp); simple_linked_list_remove(node->msg_queue_childs, msg); free(msg); // reinit iterator diff --git a/src/messaging.h b/src/messaging.h index 1af4bb760..ad7c83da5 100644 --- a/src/messaging.h +++ b/src/messaging.h @@ -108,9 +108,9 @@ struct response *new_response(int status, char *optional_message); typedef struct response *(*msg_callback_t)(struct module *mod, struct message *msg); void module_check_undelivered_messages(struct module *); -struct response *send_message(struct module *, const char *path, struct message *msg); -struct response *send_message_to_receiver(struct module *, struct message *msg); -struct message *new_message(size_t length); +struct response *send_message(struct module *, const char *path, struct message *msg) __attribute__ ((warn_unused_result)); +struct response *send_message_to_receiver(struct module *, struct message *msg) __attribute__ ((warn_unused_result)); +struct message *new_message(size_t length) __attribute__ ((warn_unused_result)); void free_message(struct message *m); const char *response_status_to_text(int status); diff --git a/src/module.c b/src/module.c index 12fb28767..f483eb90b 100644 --- a/src/module.c +++ b/src/module.c @@ -140,10 +140,10 @@ const char *module_class_name_pairs[] = { const char *module_class_name(enum module_class cls) { - if((unsigned int) cls > sizeof(module_class_name_pairs)/sizeof(const char *)) - return NULL; - else + if((unsigned int) cls < sizeof(module_class_name_pairs)/sizeof(const char *)) return module_class_name_pairs[cls]; + else + return NULL; } void append_message_path(char *buf, int buflen, enum module_class modules[]) @@ -217,6 +217,7 @@ struct module *get_module(struct module *root, const char *const_path) if (!receiver) { pthread_mutex_unlock(&old_receiver->lock); + free(tmp); return NULL; } pthread_mutex_lock(&receiver->lock); @@ -236,7 +237,7 @@ struct module *get_matching_child(struct module *node, const char *const_path) { struct module *receiver = node; char *path, *tmp; - char *item, *save_ptr; + char *item, *save_ptr = NULL; assert(node != NULL); diff --git a/src/rtp/audio_decoders.cpp b/src/rtp/audio_decoders.cpp index 3c0e61fd4..377658b44 100644 --- a/src/rtp/audio_decoders.cpp +++ b/src/rtp/audio_decoders.cpp @@ -180,6 +180,7 @@ void *audio_decoder_init(char *audio_channel_map, const char *audio_scale, const struct state_audio_decoder *s; bool scale_auto = false; double scale_factor = 1.0; + char *tmp = nullptr; assert(audio_scale != NULL); @@ -211,7 +212,6 @@ void *audio_decoder_init(char *audio_channel_map, const char *audio_scale, const if(audio_channel_map) { char *save_ptr = NULL; char *item; - char *tmp; char *ptr; tmp = ptr = strdup(audio_channel_map); @@ -249,7 +249,7 @@ void *audio_decoder_init(char *audio_channel_map, const char *audio_scale, const } if(!isdigit(strchr(item, ':')[1])) { fprintf(stderr, "Audio destination channel not entered!\n"); - return NULL; + goto error; } int dst = atoi(strchr(item, ':') + 1); if(src >= 0) { @@ -266,14 +266,14 @@ void *audio_decoder_init(char *audio_channel_map, const char *audio_scale, const if(!validate_mapping(&s->channel_map)) { - free(s); fprintf(stderr, "Wrong audio mapping.\n"); - return NULL; + goto error; } else { s->channel_remapping = TRUE; } free (tmp); + tmp = NULL; } else { s->channel_remapping = FALSE; s->channel_map.map = NULL; @@ -297,8 +297,7 @@ void *audio_decoder_init(char *audio_channel_map, const char *audio_scale, const scale_factor = atof(audio_scale); if(scale_factor <= 0.0) { fprintf(stderr, "Invalid audio scaling factor!\n"); - free(s); - return NULL; + goto error; } } @@ -314,6 +313,14 @@ void *audio_decoder_init(char *audio_channel_map, const char *audio_scale, const } return s; + +error: + free(tmp); + if (s) { + audio_decoder_destroy(s); + free(s); + } + return NULL; } void audio_decoder_destroy(void *state) diff --git a/src/rtp/fec.cpp b/src/rtp/fec.cpp index 2d603d954..27305af41 100644 --- a/src/rtp/fec.cpp +++ b/src/rtp/fec.cpp @@ -51,8 +51,8 @@ using namespace std; fec *fec::create_from_config(const char *c_str) { - char *str = strdup(c_str); - if (strncmp(str, "LDGM percents ", strlen("LDGM percents ")) == 0) { + if (strncmp(c_str, "LDGM percents ", strlen("LDGM percents ")) == 0) { + char *str = strdup(c_str); int mtu_len, data_len; double loss_pct; char *ptr = str + strlen("LDGM percents "); @@ -66,10 +66,11 @@ fec *fec::create_from_config(const char *c_str) item = strtok_r(NULL, " ", &save_ptr); assert (item != NULL); loss_pct = atof(item); - return new ldgm(mtu_len, data_len, - loss_pct); - } else if (strncmp(str, "LDGM cfg ", strlen("LDGM cfg ")) == 0) { - return new ldgm(str + strlen("LDGM cfg ")); + fec *ret = new ldgm(mtu_len, data_len, loss_pct); + free(str); + return ret; + } else if (strncmp(c_str, "LDGM cfg ", strlen("LDGM cfg ")) == 0) { + return new ldgm(c_str + strlen("LDGM cfg ")); } else { throw string("Unrecognized FEC configuration!"); } diff --git a/src/rtp/net_udp.c b/src/rtp/net_udp.c index f08a930dc..23e906de4 100644 --- a/src/rtp/net_udp.c +++ b/src/rtp/net_udp.c @@ -311,18 +311,17 @@ static socket_udp *udp_init4(const char *addr, const char *iface, s->rx_port = rx_port; s->tx_port = tx_port; s->ttl = ttl; + s->fd = INVALID_SOCKET; if (!resolve_address(s, addr)) { socket_error("Can't resolve IP address for %s", addr); - free(s); - return NULL; + goto error; } if (iface != NULL) { #ifdef HAVE_IF_NAMETOINDEX if ((ifindex = if_nametoindex(iface)) == 0) { debug_msg("Illegal interface specification\n"); - free(s); - return NULL; + goto error; } #else fprintf(stderr, "Cannot set interface name, if_nametoindex not supported.\n"); @@ -331,13 +330,9 @@ static socket_udp *udp_init4(const char *addr, const char *iface, ifindex = 0; } s->fd = socket(AF_INET, SOCK_DGRAM, 0); -#ifdef WIN32 if (s->fd == INVALID_SOCKET) { -#else - if (s->fd < 0) { -#endif socket_error("Unable to initialize socket"); - return NULL; + goto error; } if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_SNDBUF, (char *)&udpbufsize, @@ -357,21 +352,21 @@ static socket_udp *udp_init4(const char *addr, const char *iface, (s->fd, SOL_SOCKET, SO_REUSEPORT, (int *)&reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEPORT"); - return NULL; + goto error; } #endif if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEADDR"); - return NULL; + goto error; } s_in.sin_family = AF_INET; s_in.sin_addr.s_addr = INADDR_ANY; s_in.sin_port = htons(rx_port); if (bind(s->fd, (struct sockaddr *)&s_in, sizeof(s_in)) != 0) { socket_error("bind"); - return NULL; + goto error; } if (IN_MULTICAST(ntohl(s->addr4.s_addr))) { #ifndef WIN32 @@ -386,31 +381,37 @@ static socket_udp *udp_init4(const char *addr, const char *iface, (s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&imr, sizeof(struct ip_mreq)) != 0) { socket_error("setsockopt IP_ADD_MEMBERSHIP"); - return NULL; + goto error; } #ifndef WIN32 if (SETSOCKOPT (s->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) { socket_error("setsockopt IP_MULTICAST_LOOP"); - return NULL; + goto error; } #endif if (SETSOCKOPT (s->fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&s->ttl, sizeof(s->ttl)) != 0) { socket_error("setsockopt IP_MULTICAST_TTL"); - return NULL; + goto error; } if (SETSOCKOPT (s->fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&ifindex, sizeof(ifindex)) != 0) { socket_error("setsockopt IP_MULTICAST_IF"); - return NULL; + goto error; } } s->addr = strdup(addr); return s; +error: + if (s->fd != INVALID_SOCKET) { + close(s->fd); + } + free(s); + return NULL; } static void udp_exit4(socket_udp * s) @@ -493,7 +494,7 @@ static inline int udp_sendv4(socket_udp * s, struct iovec *vector, int count) static const char *udp_host_addr4(void) { - static char hname[MAXHOSTNAMELEN]; + static char hname[MAXHOSTNAMELEN + 1]; struct hostent *hent; struct in_addr iaddr; @@ -628,7 +629,7 @@ static socket_udp *udp_init6(const char *addr, const char *iface, s->rx_port = rx_port; s->tx_port = tx_port; s->ttl = ttl; - unsigned int ifindex; + unsigned int ifindex = 0; if (iface != NULL) { #ifdef HAVE_IF_NAMETOINDEX @@ -880,6 +881,7 @@ static const char *udp_host_addr6(socket_udp * s) &(addr6->sin6_addr), hname, MAXHOSTNAMELEN) == NULL) { error_msg("inet_ntop: %s: \n", hname); + freeaddrinfo(ai); return NULL; } freeaddrinfo(ai); diff --git a/src/rtp/pbuf.c b/src/rtp/pbuf.c index 80f55f9eb..c8e7129e7 100644 --- a/src/rtp/pbuf.c +++ b/src/rtp/pbuf.c @@ -347,11 +347,11 @@ void pbuf_insert(struct pbuf *playout_buf, rtp_packet * pkt) discard_pkt = true; } } - if (pkt->m && discard_pkt) { - debug_msg - ("Oops... dropped packet with M bit set\n"); - } if (discard_pkt) { + if (pkt->m) { + debug_msg + ("Oops... dropped packet with M bit set\n"); + } free(pkt); } } diff --git a/src/rtp/rtp.c b/src/rtp/rtp.c index a2f33fdc1..e670c16f2 100644 --- a/src/rtp/rtp.c +++ b/src/rtp/rtp.c @@ -2007,6 +2007,8 @@ static void process_rtcp_app(struct rtp *session, rtcp_t * packet) event.type = RX_APP; event.data = (void *)app; /* The callback function MUST free this! */ session->callback(session, &event); + } else { + free(app); } } @@ -3655,6 +3657,7 @@ int rtp_set_encryption_key(struct rtp *session, const char *passphrase) } else { debug_msg("Encryption algorithm \"%s\" not found\n", session->encryption_algorithm); + free(canonical_passphrase); return FALSE; } } diff --git a/src/rtp/rtp_callback.c b/src/rtp/rtp_callback.c index 9af7a1013..0dfdeed38 100644 --- a/src/rtp/rtp_callback.c +++ b/src/rtp/rtp_callback.c @@ -143,6 +143,7 @@ process_sdes(struct pdb *participants, uint32_t ssrc, rtcp_sdes_item * d) switch (d->type) { case RTCP_SDES_END: + free(sdes_item); /* This is the end of the SDES list of a packet. */ /* Nothing for us to deal with. */ break; @@ -182,8 +183,10 @@ process_sdes(struct pdb *participants, uint32_t ssrc, rtcp_sdes_item * d) e->sdes_note = sdes_item; break; case RTCP_SDES_PRIV: + free(sdes_item); break; /* Ignore private extensions */ default: + free(sdes_item); debug_msg ("Ignored unknown SDES item (type=0x%02x) from 0x%08x\n", ssrc); @@ -200,12 +203,12 @@ void rtp_recv_callback(struct rtp *session, rtp_event * e) switch (e->type) { case RX_RTP: - if (pckt_rtp->data_len > 0) { /* Only process packets that contain data... */ - pbuf_insert(state->playout_buffer, pckt_rtp); - } gettimeofday(&curr_time, NULL); tfrc_recv_data(state->tfrc_state, curr_time, pckt_rtp->seq, pckt_rtp->data_len + 40); + if (pckt_rtp->data_len > 0) { /* Only process packets that contain data... */ + pbuf_insert(state->playout_buffer, pckt_rtp); + } break; case RX_TFRC_RX: /* compute TCP friendly data rate */ diff --git a/src/rtp/video_decoders.cpp b/src/rtp/video_decoders.cpp index 083eea8cc..b7a0de978 100644 --- a/src/rtp/video_decoders.cpp +++ b/src/rtp/video_decoders.cpp @@ -216,11 +216,6 @@ struct main_msg_reconfigure : public main_msg { */ struct state_video_decoder { - state_video_decoder() : - decompress_queue(1), fec_queue(1) - {} - virtual ~state_video_decoder() {} - struct module *parent; pthread_t decompress_thread_id, @@ -254,7 +249,7 @@ struct state_video_decoder * has been processed and we can write to a new one */ pthread_cond_t buffer_swapped_cv; ///< condition variable associated with @ref buffer_swapped - message_queue decompress_queue; + message_queue decompress_queue{1}; codec_t out_codec; // display or postprocessor @@ -268,7 +263,7 @@ struct state_video_decoder int pp_output_frames_count; /// @} - message_queue fec_queue; + message_queue fec_queue{1}; enum video_mode video_mode; ///< video mode set for this decoder unsigned merged_fb:1; ///< flag if the display device driver requires tiled video or not @@ -472,6 +467,7 @@ static void *fec_thread(void *args) { cleanup: if(ret == FALSE) { + delete decompress_msg; for(int i = 0; i < data->substream_count; ++i) { free(data->recv_buffers[i]); } @@ -637,8 +633,7 @@ struct state_video_decoder *video_decoder_init(struct module *parent, { struct state_video_decoder *s; - s = (state_video_decoder *) calloc(1, sizeof(state_video_decoder)); - s = new(s) state_video_decoder; // call the constructor + s = new state_video_decoder{}; // call the constructor s->parent = parent; @@ -669,19 +664,22 @@ struct state_video_decoder *video_decoder_init(struct module *parent, s->postprocess = vo_postprocess_init(tmp_pp_config); free(tmp_pp_config); if(strcmp(postprocess, "help") == 0) { + delete s; exit_uv(0); return NULL; } if(!s->postprocess) { fprintf(stderr, "Initializing postprocessor \"%s\" failed.\n", postprocess); - free(s); + delete s; exit_uv(129); return NULL; } } - if(!video_decoder_register_display(s, display)) + if(!video_decoder_register_display(s, display)) { + delete s; return NULL; + } return s; } @@ -1158,7 +1156,7 @@ static bool reconfigure_decoder(struct state_video_decoder *decoder, ret = display_get_property(decoder->display, DISPLAY_PROPERTY_VIDEO_MODE, &display_mode, &len); if(!ret) { - debug_msg("Failed to get video display mode."); + debug_msg("Failed to get video display mode.\n"); display_mode = DISPLAY_PROPERTY_VIDEO_MERGED; } diff --git a/src/transmit.cpp b/src/transmit.cpp index e808eb17f..a11954e7e 100644 --- a/src/transmit.cpp +++ b/src/transmit.cpp @@ -179,7 +179,9 @@ static void tx_update(struct tx *tx, struct video_frame *frame, int substream) snprintf(msg->fec_cfg, sizeof(msg->fec_cfg), "LDGM percents %d %d %f", data_len, tx->avg_len, tx->max_loss); msg->type = SENDER_MSG_CHANGE_FEC; - send_message_to_receiver(get_parent_module(&tx->mod), (struct message *) msg); + struct response *resp = send_message_to_receiver(get_parent_module(&tx->mod), + (struct message *) msg); + resp->deleter(resp); tx->avg_len_last = tx->avg_len; } } @@ -295,7 +297,9 @@ static bool set_fec(struct tx *tx, const char *fec_const) snprintf(msg->fec_cfg, sizeof(msg->fec_cfg), "LDGM cfg %s", fec_cfg ? fec_cfg : ""); msg->type = SENDER_MSG_CHANGE_FEC; - send_message_to_receiver(get_parent_module(&tx->mod), (struct message *) msg); + struct response *resp = send_message_to_receiver(get_parent_module(&tx->mod), + (struct message *) msg); + resp->deleter(resp); } else { // delay creation until we have avarage frame size tx->max_loss = atof(fec_cfg); } diff --git a/src/utils/config_file.c b/src/utils/config_file.c index 63f5404a0..08506a6b3 100644 --- a/src/utils/config_file.c +++ b/src/utils/config_file.c @@ -193,6 +193,7 @@ static int replace_line_suffix(struct config_file *s, const char *prefix, const } if (!truncate_for_writing(s)) { + free(new_file_content); return 0; } diff --git a/src/utils/vf_split.cpp b/src/utils/vf_split.cpp index d8040a83b..b81ab1e8a 100644 --- a/src/utils/vf_split.cpp +++ b/src/utils/vf_split.cpp @@ -195,7 +195,7 @@ struct separate_tiles_dispose_udata { sizeof(void (*)(struct video_frame *frame))); m_frame = (struct video_frame **) calloc(max_count, sizeof(struct video_frame *)); } - separate_tiles_dispose_udata() { + ~separate_tiles_dispose_udata() { free((void *) m_dispose); free(m_frame); } diff --git a/src/video_capture/aggregate.c b/src/video_capture/aggregate.c index 9d28380d9..2318f7236 100644 --- a/src/video_capture/aggregate.c +++ b/src/video_capture/aggregate.c @@ -112,6 +112,7 @@ vidcap_aggregate_init(const struct vidcap_params *params) if(vidcap_params_get_fmt(params) && strcmp(vidcap_params_get_fmt(params), "") != 0) { show_help(); + free(s); return &vidcap_init_noerr; } diff --git a/src/video_capture/bluefish444.cpp b/src/video_capture/bluefish444.cpp index ce2ec0e18..ad2039a11 100644 --- a/src/video_capture/bluefish444.cpp +++ b/src/video_capture/bluefish444.cpp @@ -945,7 +945,7 @@ error: for(int i = 0; i < s->attachedDevices; ++i) { BailOut(s->pSDK[i]); } - free(s); + delete s; return NULL; } diff --git a/src/video_capture/decklink.cpp b/src/video_capture/decklink.cpp index 73cc5b502..a53222c5f 100644 --- a/src/video_capture/decklink.cpp +++ b/src/video_capture/decklink.cpp @@ -128,9 +128,7 @@ struct vidcap_decklink_state { }; static HRESULT set_display_mode_properties(struct vidcap_decklink_state *s, struct tile *tile, IDeckLinkDisplayMode* displayMode, /* out */ BMDPixelFormat *pf); - - - +static void cleanup_common(struct vidcap_decklink_state *s); class VideoDelegate : public IDeckLinkInputCallback { @@ -748,6 +746,12 @@ vidcap_decklink_init(const struct vidcap_params *params) return &vidcap_init_noerr; } + // init mutex + pthread_mutex_init(&s->lock, NULL); + pthread_cond_init(&s->boss_cv, NULL); + + s->boss_waiting = FALSE; + if(vidcap_params_get_flags(params) & (VIDCAP_FLAG_AUDIO_EMBEDDED | VIDCAP_FLAG_AUDIO_AESEBU | VIDCAP_FLAG_AUDIO_ANALOG)) { s->grab_audio = TRUE; switch(vidcap_params_get_flags(params) & (VIDCAP_FLAG_AUDIO_EMBEDDED | VIDCAP_FLAG_AUDIO_AESEBU | VIDCAP_FLAG_AUDIO_ANALOG)) { @@ -807,7 +811,7 @@ vidcap_decklink_init(const struct vidcap_params *params) fprintf(stderr, "\nA DeckLink iterator could not be created. The DeckLink drivers may not be installed or are outdated.\n"); fprintf(stderr, "This UltraGrid version was compiled with DeckLink drivers %s. You should have at least this version.\n\n", BLACKMAGIC_DECKLINK_API_VERSION_STRING); - return NULL; + goto error; } while (deckLinkIterator->Next(&deckLink) == S_OK) { @@ -1042,12 +1046,6 @@ vidcap_decklink_init(const struct vidcap_params *params) deckLinkIterator->Release(); } - // init mutex - pthread_mutex_init(&s->lock, NULL); - pthread_cond_init(&s->boss_cv, NULL); - - s->boss_waiting = FALSE; - // check if any mode was found for (int i = 0; i < s->devices_cnt; ++i) { @@ -1064,29 +1062,54 @@ vidcap_decklink_init(const struct vidcap_params *params) debug_msg("vidcap_decklink_init - END\n"); /* TOREMOVE */ return s; -error: +error: if(displayMode != NULL) { displayMode->Release(); displayMode = NULL; } - if(deckLinkInput != NULL) - { - deckLinkInput->Release(); - deckLinkInput = NULL; - } + if (displayModeIterator != NULL){ + displayModeIterator->Release(); + displayModeIterator = NULL; + } - if(deckLink != NULL) - { - deckLink->Release(); - deckLink = NULL; - } + if (s) { + cleanup_common(s); + } return NULL; } +static void cleanup_common(struct vidcap_decklink_state *s) { + for (int i = 0; i < s->devices_cnt; ++i) { + if(s->state[i].deckLinkConfiguration != NULL) { + s->state[i].deckLinkConfiguration->Release(); + } + + if(s->state[i].deckLinkInput != NULL) + { + s->state[i].deckLinkInput->Release(); + s->state[i].deckLinkInput = NULL; + } + + if(s->state[i].deckLink != NULL) + { + s->state[i].deckLink->Release(); + s->state[i].deckLink = NULL; + } + } + + free(s->audio.data); + + pthread_mutex_destroy(&s->lock); + pthread_cond_destroy(&s->boss_cv); + + vf_free(s->frame); + free(s); +} + void vidcap_decklink_done(void *state) { @@ -1118,26 +1141,9 @@ vidcap_decklink_done(void *state) string err_msg = bmd_hresult_to_string(result); fprintf(stderr, MODULE_NAME "Could disable video input: %s\n", err_msg.c_str()); } + } - if(s->state[i].deckLinkConfiguration != NULL) { - s->state[i].deckLinkConfiguration->Release(); - } - - if(s->state[i].deckLinkInput != NULL) - { - s->state[i].deckLinkInput->Release(); - s->state[i].deckLinkInput = NULL; - } - - if(s->state[i].deckLink != NULL) - { - s->state[i].deckLink->Release(); - s->state[i].deckLink = NULL; - } - } - - vf_free(s->frame); - free(s); + cleanup_common(s); } /** diff --git a/src/video_capture/deltacast.cpp b/src/video_capture/deltacast.cpp index c3990c8ea..fa62c8724 100644 --- a/src/video_capture/deltacast.cpp +++ b/src/video_capture/deltacast.cpp @@ -277,10 +277,14 @@ static bool wait_for_channel(struct vidcap_deltacast_state *s) throw delta_init_exception(); } } - if(s->frame->color_spec == v210 || s->frame->color_spec == RAW) + if(s->frame->color_spec == v210 || s->frame->color_spec == RAW) { Packing = VHD_BUFPACK_VIDEO_YUV422_10; - if(s->frame->color_spec == UYVY) + } else if(s->frame->color_spec == UYVY) { Packing = VHD_BUFPACK_VIDEO_YUV422_8; + } else { + fprintf(stderr, "[DELTACAST] Unsupported pixel format\n"); + throw delta_init_exception(); + } printf("[DELTACAST] Pixel format '%s' selected.\n", get_codec_name(s->frame->color_spec)); Result = VHD_SetStreamProperty(s->StreamHandle, VHD_CORE_SP_BUFFER_PACKING, Packing); if (Result != VHDERR_NOERROR) { @@ -334,12 +338,19 @@ static bool wait_for_channel(struct vidcap_deltacast_state *s) void * vidcap_deltacast_init(const struct vidcap_params *params) { - struct vidcap_deltacast_state *s; + struct vidcap_deltacast_state *s = nullptr; ULONG Result,DllVersion,NbBoards,ChnType; ULONG BrdId = 0; printf("vidcap_deltacast_init\n"); + char *init_fmt = strdup(vidcap_params_get_fmt(params)); + if (init_fmt && strcmp(init_fmt, "help") == 0) { + free(init_fmt); + usage(); + return &vidcap_init_noerr; + } + s = (struct vidcap_deltacast_state *) calloc(1, sizeof(struct vidcap_deltacast_state)); if(s == NULL) { @@ -359,14 +370,7 @@ vidcap_deltacast_init(const struct vidcap_params *params) s->BoardHandle = s->StreamHandle = s->SlotHandle = NULL; - char *init_fmt = strdup(vidcap_params_get_fmt(params)); - if(init_fmt && strcmp(init_fmt, "help") == 0) { - usage(); - return &vidcap_init_noerr; - } - - if(init_fmt) - { + if (init_fmt) { char *save_ptr = NULL; char *tok; char *tmp = init_fmt; @@ -399,6 +403,7 @@ vidcap_deltacast_init(const struct vidcap_params *params) } } free(init_fmt); + init_fmt = NULL; printf("[DELTACAST] Selected device %d\n", BrdId); @@ -456,15 +461,21 @@ vidcap_deltacast_init(const struct vidcap_params *params) return s; error: - if(s->StreamHandle) { - /* Close stream handle */ - VHD_CloseStreamHandle(s->StreamHandle); - } - if(s->BoardHandle) { - /* Re-establish RX0-TX0 by-pass relay loopthrough */ - VHD_SetBoardProperty(s->BoardHandle,VHD_CORE_BP_BYPASS_RELAY_0,TRUE); - VHD_CloseBoardHandle(s->BoardHandle); + free(init_fmt); + + if (s) { + if(s->StreamHandle) { + /* Close stream handle */ + VHD_CloseStreamHandle(s->StreamHandle); + } + if(s->BoardHandle) { + /* Re-establish RX0-TX0 by-pass relay loopthrough */ + VHD_SetBoardProperty(s->BoardHandle,VHD_CORE_BP_BYPASS_RELAY_0,TRUE); + VHD_CloseBoardHandle(s->BoardHandle); + } + vf_free(s->frame); } + free(s); return NULL; } diff --git a/src/video_capture/deltacast_dvi.cpp b/src/video_capture/deltacast_dvi.cpp index 833448085..c3dada4cc 100644 --- a/src/video_capture/deltacast_dvi.cpp +++ b/src/video_capture/deltacast_dvi.cpp @@ -470,25 +470,25 @@ vidcap_deltacast_dvi_init(const struct vidcap_params *params) printf("vidcap_deltacast_dvi_init\n"); + char *init_fmt = NULL; + if (vidcap_params_get_fmt(params) != NULL) + init_fmt = strdup(vidcap_params_get_fmt(params)); + if(init_fmt && strcmp(init_fmt, "help") == 0) { + free(init_fmt); + usage(); + return &vidcap_init_noerr; + } + s = (struct vidcap_deltacast_dvi_state *) calloc(1, sizeof(struct vidcap_deltacast_dvi_state)); - s->codec = BGR; - s->configured = false; - if(s == NULL) { printf("Unable to allocate DELTACAST state\n"); return NULL; } + s->codec = BGR; + s->configured = false; s->BoardHandle = s->StreamHandle = NULL; - char *init_fmt = NULL; - if (vidcap_params_get_fmt(params) != NULL) - init_fmt = strdup(vidcap_params_get_fmt(params)); - if(init_fmt && strcmp(init_fmt, "help") == 0) { - usage(); - return &vidcap_init_noerr; - } - if(init_fmt) { char *save_ptr = NULL; diff --git a/src/video_capture/import.c b/src/video_capture/import.c index 8c1a85a11..0f44b44b0 100644 --- a/src/video_capture/import.c +++ b/src/video_capture/import.c @@ -198,6 +198,8 @@ static void message_queue_clear(struct message_queue *queue); static bool parse_msg(char *buffer, char buffer_len, /* out */ char *message, int *new_buffer_len) WIN32_UNUSED; static void process_msg(struct vidcap_import_state *state, char *message) WIN32_UNUSED; +static void cleanup_common(struct vidcap_import_state *s); + volatile bool exit_control = false; static void message_queue_clear(struct message_queue *queue) { @@ -302,15 +304,19 @@ vidcap_import_init(const struct vidcap_params *params) s->video_reading_threads_count = 1; // default is single threaded + pthread_mutex_init(&s->lock, NULL); + pthread_cond_init(&s->worker_cv, NULL); + pthread_cond_init(&s->boss_cv, NULL); + char *tmp = strdup(vidcap_params_get_fmt(params)); char *save_ptr; - const char *directory = strtok_r(tmp, ":", &save_ptr); - if (!directory || strcmp(directory, "help") == 0) { + s->directory = strdup(strtok_r(tmp, ":", &save_ptr)); + char *suffix; + if (!s->directory || strcmp(s->directory, "help") == 0) { fprintf(stderr, "Import usage:\n" "\t{:loop|:mt_reading=|:o_direct}"); - return NULL; + goto error; } - char *suffix; while ((suffix = strtok_r(NULL, ":", &save_ptr)) != NULL) { if (strcmp(suffix, "loop") == 0) { s->loop = true; @@ -325,20 +331,18 @@ vidcap_import_init(const struct vidcap_params *params) } else { fprintf(stderr, "[Playback] Unrecognized" " option %s.\n", suffix); - return NULL; + goto error; } } + free(tmp); + tmp = NULL; message_queue_clear(&s->message_queue); message_queue_clear(&s->audio_state.message_queue); - pthread_mutex_init(&s->lock, NULL); - pthread_cond_init(&s->worker_cv, NULL); - pthread_cond_init(&s->boss_cv, NULL); - - char *audio_filename = malloc(strlen(directory) + sizeof("/soud.wav") + 1); + char *audio_filename = malloc(strlen(s->directory) + sizeof("/soud.wav") + 1); assert(audio_filename != NULL); - strcpy(audio_filename, directory); + strcpy(audio_filename, s->directory); strcat(audio_filename, "/sound.wav"); if((vidcap_params_get_flags(params) & VIDCAP_FLAG_AUDIO_EMBEDDED) && init_audio(s, audio_filename)) { s->audio_state.has_audio = true; @@ -351,9 +355,9 @@ vidcap_import_init(const struct vidcap_params *params) } free(audio_filename); - char *info_filename = malloc(strlen(directory) + sizeof("/video.info") + 1); + char *info_filename = malloc(strlen(s->directory) + sizeof("/video.info") + 1); assert(info_filename != NULL); - strcpy(info_filename, directory); + strcpy(info_filename, s->directory); strcat(info_filename, "/video.info"); info = fopen(info_filename, "r"); @@ -364,6 +368,7 @@ vidcap_import_init(const struct vidcap_params *params) } struct video_desc desc; + memset(&desc, 0, sizeof desc); char line[512]; uint32_t items_found = 0; @@ -436,7 +441,8 @@ vidcap_import_init(const struct vidcap_params *params) } } - s->directory = strdup(directory); + assert(desc.color_spec != VIDEO_CODEC_NONE && desc.width != 0 && desc.height != 0 && desc.fps != 0.0 && + s->count != 0); char name[1024]; snprintf(name, sizeof(name), "%s/%08d.%s", s->directory, 1, @@ -490,11 +496,11 @@ vidcap_import_init(const struct vidcap_params *params) return s; error: + free(tmp); if (info != NULL) fclose(info); if (s) { - free(s->directory); - free(s); + cleanup_common(s); } return NULL; } @@ -587,13 +593,7 @@ static int flush_processed(struct processed_entry *list) return frames_deleted; } -void vidcap_import_done(void *state) -{ - struct vidcap_import_state *s = (struct vidcap_import_state *) state; - assert(s != NULL); - - vidcap_import_finish(state); - +static void cleanup_common(struct vidcap_import_state *s) { flush_processed(s->head); pthread_mutex_destroy(&s->lock); @@ -617,6 +617,16 @@ void vidcap_import_done(void *state) free(s); } +void vidcap_import_done(void *state) +{ + struct vidcap_import_state *s = (struct vidcap_import_state *) state; + assert(s != NULL); + + vidcap_import_finish(state); + + cleanup_common(s); +} + /* * Message len can be at most buffer_len + 1 (including '\0') */ @@ -787,6 +797,7 @@ static void * control_thread(void *args) int fd; fd = socket(AF_INET6, SOCK_STREAM, 0); + assert(fd != -1); int val = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); struct sockaddr_in6 s_in; @@ -807,6 +818,7 @@ static void * control_thread(void *args) if(!fifo_status) { clients = malloc(sizeof(struct client)); clients->fd = open(PIPE, O_RDONLY | O_NONBLOCK); + assert(clients->fd != -1); clients->pipe = true; clients->buff_len = 0; clients->next = NULL; @@ -833,12 +845,17 @@ static void * control_thread(void *args) struct timeval timeout = { .tv_sec = 1, .tv_usec = 0 }; if(select(max_fd, &set, NULL, NULL, &timeout) >= 1) { if(FD_ISSET(fd, &set)) { - struct client *new_client = malloc(sizeof(struct client)); - new_client->fd = accept(fd, (struct sockaddr *) &client_addr, &len); - new_client->next = clients; - new_client->buff_len = 0; - new_client->pipe = false; - clients = new_client; + int new_fd = accept(fd, (struct sockaddr *) &client_addr, &len); + if (new_fd != -1) { + struct client *new_client = malloc(sizeof(struct client)); + new_client->fd = new_fd; + new_client->next = clients; + new_client->buff_len = 0; + new_client->pipe = false; + clients = new_client; + } else { + fprintf(stderr, "Control socket: cannot accept new connection!"); + } } struct client **parent_ptr = &clients; @@ -1020,6 +1037,11 @@ static void *video_reader_callback(void *arg) / ALIGN * ALIGN); if (res <= 0) { perror("read"); + for (unsigned int i = 0; i < data->tile_count; i++) { + aligned_free(data->entry->tiles[i].data); + } + free(data->entry); + close(fd); return NULL; } bytes += res; diff --git a/src/video_capture/screen_x11.c b/src/video_capture/screen_x11.c index 2d225a1e1..735221b23 100644 --- a/src/video_capture/screen_x11.c +++ b/src/video_capture/screen_x11.c @@ -281,6 +281,7 @@ void * vidcap_screen_x11_init(const struct vidcap_params *params) if(vidcap_params_get_fmt(params)) { if (strcmp(vidcap_params_get_fmt(params), "help") == 0) { show_help(); + free(s); return &vidcap_init_noerr; } else if (strncasecmp(vidcap_params_get_fmt(params), "fps=", strlen("fps=")) == 0) { s->fps = atoi(vidcap_params_get_fmt(params) + strlen("fps=")); diff --git a/src/video_capture/switcher.c b/src/video_capture/switcher.c index 75c69c307..3faafa635 100644 --- a/src/video_capture/switcher.c +++ b/src/video_capture/switcher.c @@ -104,21 +104,26 @@ vidcap_switcher_init(const struct vidcap_params *params) return NULL; } - if (vidcap_params_get_fmt(params) && strcmp(vidcap_params_get_fmt(params), "") != 0) { - char *cfg = strdup(vidcap_params_get_fmt(params)); + const char *cfg_c = vidcap_params_get_fmt(params); + if (cfg_c && strcmp(cfg_c, "") != 0) { + char *cfg = strdup(cfg_c); char *save_ptr, *item; char *tmp = cfg; while ((item = strtok_r(cfg, ":", &save_ptr))) { if (strcmp(item, "help") == 0) { show_help(); + free(tmp); + free(s); return &vidcap_init_noerr; } else if (strcmp(item, "excl_init") == 0) { s->excl_init = true; } else if (strncasecmp(item, "select=", strlen("select=")) == 0) { s->selected_device = atoi(item + strlen("select=")); } else { - show_help(); fprintf(stderr, "[switcher] Unknown initialization option!\n"); + show_help(); + free(tmp); + free(s); return NULL; } cfg = NULL; diff --git a/src/video_capture/swmix.cpp b/src/video_capture/swmix.cpp index 1d1ba6042..1546ea9e2 100644 --- a/src/video_capture/swmix.cpp +++ b/src/video_capture/swmix.cpp @@ -951,6 +951,7 @@ static int parse_config_string(const char *fmt, unsigned int *width, *color_spec = get_codec_from_name(item); if (*color_spec == VIDEO_CODEC_NONE) { fprintf(stderr, "Unrecognized color spec string: %s\n", item); + free(parse_string); return PARSE_ERROR; } break; @@ -1091,6 +1092,7 @@ vidcap_swmix_init(const struct vidcap_params *params) char *init_fmt = strdup(vidcap_params_get_fmt(params)); if(!parse(s, &desc, init_fmt, &config_file, &s->interpolation, params)) { + free(init_fmt); goto error; } free(init_fmt); @@ -1127,11 +1129,14 @@ vidcap_swmix_init(const struct vidcap_params *params) s->slaves_data = init_slave_data(s, config_file); if(!s->slaves_data) { + free(s); return NULL; } - if(config_file) + if (config_file) { fclose(config_file); + config_file = nullptr; + } format = GL_RGBA; if(desc.color_spec == RGB) { @@ -1180,6 +1185,9 @@ vidcap_swmix_init(const struct vidcap_params *params) return s; error: + if (config_file) { + fclose(config_file); + } if(s->slaves) { free(s->slaves); } diff --git a/src/video_capture/testcard.c b/src/video_capture/testcard.c index 6c2579bbe..3f169e64e 100644 --- a/src/video_capture/testcard.c +++ b/src/video_capture/testcard.c @@ -306,31 +306,27 @@ void *vidcap_testcard_init(const struct vidcap_params *params) tmp = strtok_r(fmt, ":", &save_ptr); if (!tmp) { fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); - free(s); - return NULL; + goto error; } vf_get_tile(s->frame, 0)->width = atoi(tmp); tmp = strtok_r(NULL, ":", &save_ptr); if (!tmp) { fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); - free(s); - return NULL; + goto error; } vf_get_tile(s->frame, 0)->height = atoi(tmp); tmp = strtok_r(NULL, ":", &save_ptr); if (!tmp) { - free(s); fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); - return NULL; + goto error; } s->frame->fps = atof(tmp); tmp = strtok_r(NULL, ":", &save_ptr); if (!tmp) { - free(s); fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); - return NULL; + goto error; } int h_align = 0; @@ -382,6 +378,7 @@ void *vidcap_testcard_init(const struct vidcap_params *params) "computed size %d\n", (int)sb.st_size, s->size); free(s->data); free(s); + fclose(in); return NULL; } @@ -443,6 +440,7 @@ void *vidcap_testcard_init(const struct vidcap_params *params) s->data = (char *)tov210((unsigned char *) s->data, aligned_x, aligned_x, vf_get_tile(s->frame, 0)->height, bpp); + free(s->pixmap.data); } if (codec == R10k) { @@ -454,23 +452,17 @@ void *vidcap_testcard_init(const struct vidcap_params *params) s->data = (char *)toRGB((unsigned char *) s->data, vf_get_tile(s->frame, 0)->width, vf_get_tile(s->frame, 0)->height); + free(s->pixmap.data); } - if(codec == RGBA) { - toRGB((unsigned char *) s->data, vf_get_tile(s->frame, 0)->width, - vf_get_tile(s->frame, 0)->height); - } tmp = filename; vf_get_tile(s->frame, 0)->data = malloc(2 * s->size); memcpy(vf_get_tile(s->frame, 0)->data, s->data, s->size); memcpy(vf_get_tile(s->frame, 0)->data + s->size, vf_get_tile(s->frame, 0)->data, s->size); - if(s->pixmap.data) - free(s->pixmap.data); - else - free(vf_get_tile(s->frame, 0)->data); + free(s->data); s->data = vf_get_tile(s->frame, 0)->data; } @@ -499,8 +491,9 @@ void *vidcap_testcard_init(const struct vidcap_params *params) vf_get_tile(s->frame, 0)->data_len = s->size; if(strip_fmt != NULL) { - if(configure_tiling(s, strip_fmt) != 0) - return NULL; + if(configure_tiling(s, strip_fmt) != 0) { + goto error; + } } if(vidcap_params_get_flags(params) & VIDCAP_FLAG_AUDIO_EMBEDDED) { @@ -517,6 +510,11 @@ void *vidcap_testcard_init(const struct vidcap_params *params) free(fmt); return s; + +error: + free(fmt); + free(s); + return NULL; } void vidcap_testcard_done(void *state) diff --git a/src/video_capture/v4l2.c b/src/video_capture/v4l2.c index a3d8f5337..7a34ae0e2 100644 --- a/src/video_capture/v4l2.c +++ b/src/video_capture/v4l2.c @@ -162,6 +162,7 @@ static void show_help() fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if(ioctl(fd, VIDIOC_G_FMT, &fmt) != 0) { perror("[V4L2] Unable to get video formant"); + close(fd); continue; } @@ -182,8 +183,8 @@ static void show_help() res = ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &size); if(res == -1) { - close(fd); fprintf(stderr, "[V4L2] Unable to get frame size iterator.\n"); + close(fd); continue; } @@ -270,6 +271,8 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) return NULL; } + s->fd = -1; + char *tmp = NULL; if(vidcap_params_get_fmt(params)) { @@ -312,7 +315,7 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) } else { fprintf(stderr, "[V4L2] Invalid configuration argument: %s\n", item); - return NULL; + goto error; } init_fmt = NULL; } @@ -323,31 +326,31 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) if(s->fd == -1) { fprintf(stderr, "[V4L2] Unable to open input device %s: %s\n", dev_name, strerror(errno)); - goto error_fd; + goto error; } int index = 0; if (ioctl(s->fd, VIDIOC_S_INPUT, &index) != 0) { perror ("Could not enable input (VIDIOC_S_INPUT)"); - goto error_fd; + goto error; } struct v4l2_capability capability; memset(&capability, 0, sizeof(capability)); if (ioctl(s->fd,VIDIOC_QUERYCAP, &capability) != 0) { perror("V4L2: ioctl VIDIOC_QUERYCAP"); - goto error_fd; + goto error; } if (!(capability.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { fprintf(stderr, "%s, %s can't capture\n",capability.card,capability.bus_info); - goto error_fd; + goto error; } if (!(capability.capabilities & V4L2_CAP_STREAMING)) { fprintf(stderr, "[V4L2] Streaming capability not present.\n"); - goto error_fd; + goto error; } @@ -357,7 +360,7 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) if(ioctl(s->fd, VIDIOC_G_FMT, &fmt) != 0) { perror("[V4L2] Unable to get video formant"); - goto error_fd; + goto error; } struct v4l2_streamparm stream_params; @@ -366,7 +369,7 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) if(ioctl(s->fd, VIDIOC_G_PARM, &stream_params) != 0) { perror("[V4L2] Unable to get stream params"); - goto error_fd; + goto error; } if (pixelformat) { @@ -383,7 +386,7 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) if(ioctl(s->fd, VIDIOC_S_FMT, &fmt) != 0) { perror("[V4L2] Unable to set video formant"); - goto error_fd; + goto error; } if(numerator != 0 && denominator != 0) { @@ -393,7 +396,7 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) if(ioctl(s->fd, VIDIOC_S_PARM, &stream_params) != 0) { perror("[V4L2] Unable to set stream params"); - goto error_fd; + goto error; } } @@ -403,13 +406,13 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) if(ioctl(s->fd, VIDIOC_G_FMT, &fmt) != 0) { perror("[V4L2] Unable to get video formant"); - goto error_fd; + goto error; } if(ioctl(s->fd, VIDIOC_G_PARM, &stream_params) != 0) { perror("[V4L2] Unable to get stream params"); - goto error_fd; + goto error; } s->desc.tile_count = 1; @@ -462,7 +465,7 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) case V4L2_FIELD_INTERLACED_BT: default: fprintf(stderr, "[V4L2] Unsupported interlacing format reported from driver.\n"); - goto error_fd; + goto error; } s->desc.fps = (double) stream_params.parm.capture.timeperframe.denominator / stream_params.parm.capture.timeperframe.numerator; @@ -487,14 +490,14 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) printf("Video capturing or mmap-streaming is not supported\n"); else perror("VIDIOC_REQBUFS"); - goto error_fd; + goto error; } if (reqbuf.count < 2) { /* You may need to free the buffers here. */ printf("Not enough buffer memory\n"); - goto error_fd; + goto error; } for (unsigned int i = 0; i < reqbuf.count; i++) { @@ -506,7 +509,7 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) if (-1 == ioctl (s->fd, VIDIOC_QUERYBUF, &buf)) { perror("VIDIOC_QUERYBUF"); - goto error_fd; + goto error; } s->buffers[i].length = buf.length; /* remember for munmap() */ @@ -520,20 +523,20 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) /* If you do not exit here you should unmap() and free() the buffers mapped so far. */ perror("mmap"); - goto error_fd; + goto error; } buf.flags = 0; if(ioctl(s->fd, VIDIOC_QBUF, &buf) != 0) { perror("Unable to enqueue buffer"); - goto error_fd; + goto error; } } if(ioctl(s->fd, VIDIOC_STREAMON, &reqbuf.type) != 0) { perror("Unable to start stream"); - goto error_fd; + goto error; }; gettimeofday(&s->t0, NULL); @@ -543,8 +546,10 @@ void * vidcap_v4l2_init(const struct vidcap_params *params) return s; -error_fd: - close(s->fd); +error: + free(tmp); + if (s->fd != -1) + close(s->fd); free(s); return NULL; } @@ -633,6 +638,7 @@ struct video_frame * vidcap_v4l2_grab(void *state, struct audio_frame **audio) if(ret == -1) { fprintf(stderr, "Error converting video.\n"); + VIDEO_FRAME_DISPOSE(out); return NULL; } diff --git a/src/video_compress.cpp b/src/video_compress.cpp index 277c50ecf..692e770cf 100644 --- a/src/video_compress.cpp +++ b/src/video_compress.cpp @@ -439,6 +439,7 @@ static int compress_init_real(struct module *parent, const char *config_string, return 1; } } else { + free(s); return -1; } diff --git a/src/video_compress/cuda_dxt.cpp b/src/video_compress/cuda_dxt.cpp index 47312a9c6..f7e06a465 100644 --- a/src/video_compress/cuda_dxt.cpp +++ b/src/video_compress/cuda_dxt.cpp @@ -106,6 +106,7 @@ struct module *cuda_dxt_compress_init(struct module *parent, } else { printf("usage:\n" "\t-c cuda_dxt[:DXT1|:DXT5]\n"); + delete s; return NULL; } } @@ -274,6 +275,7 @@ struct video_frame *cuda_dxt_compress_tile(struct module *mod, struct video_fram out->tiles[0].data_len, CUDA_WRAPPER_MEMCPY_DEVICE_TO_HOST) != CUDA_WRAPPER_SUCCESS) { fprintf(stderr, "Memcpy failed: %s\n", cuda_wrapper_last_error_string()); + VIDEO_FRAME_DISPOSE(out); return NULL; } diff --git a/src/video_compress/dxt_glsl.cpp b/src/video_compress/dxt_glsl.cpp index 81e50b4d7..763edb35d 100644 --- a/src/video_compress/dxt_glsl.cpp +++ b/src/video_compress/dxt_glsl.cpp @@ -57,6 +57,10 @@ #include "video_compress.h" #include "video_compress/dxt_glsl.h" +#include + +using namespace std; + struct state_video_compress_rtdxt { struct module module_data; @@ -64,7 +68,7 @@ struct state_video_compress_rtdxt { int encoder_count; decoder_t decoder; - char *decoded; + unique_ptr decoded; unsigned int configured:1; unsigned int interlaced_input:1; codec_t color_spec; @@ -73,7 +77,7 @@ struct state_video_compress_rtdxt { struct gl_context gl_context; - video_frame_pool *pool; + video_frame_pool pool; }; static int configure_with(struct state_video_compress_rtdxt *s, struct video_frame *frame); @@ -192,9 +196,9 @@ static int configure_with(struct state_video_compress_rtdxt *s, struct video_fra } else { s->interlaced_input = FALSE; } - s->pool->reconfigure(compressed_desc, data_len); + s->pool.reconfigure(compressed_desc, data_len); - s->decoded = (char *) malloc(4 * compressed_desc.width * compressed_desc.height); + s->decoded = unique_ptr(new char[4 * compressed_desc.width * compressed_desc.height]); s->configured = TRUE; return TRUE; @@ -214,16 +218,7 @@ struct module *dxt_glsl_compress_init(struct module *parent, const struct video_ return &compress_init_noerr; } - s = (struct state_video_compress_rtdxt *) calloc(1, sizeof(struct state_video_compress_rtdxt)); - - s->decoded = NULL; - - s->pool = new video_frame_pool(); - - if(!init_gl_context(&s->gl_context, GL_CONTEXT_ANY)) { - fprintf(stderr, "[RTDXT] Error initializing GL context"); - return NULL; - } + s = new state_video_compress_rtdxt{}; if (strcasecmp(opts, "DXT5") == 0) { s->color_spec = DXT5; @@ -233,10 +228,15 @@ struct module *dxt_glsl_compress_init(struct module *parent, const struct video_ s->color_spec = DXT1; } else { fprintf(stderr, "Unknown compression: %s\n", opts); + delete s; return NULL; } - s->configured = FALSE; + if(!init_gl_context(&s->gl_context, GL_CONTEXT_ANY)) { + fprintf(stderr, "[RTDXT] Error initializing GL context"); + delete s; + return NULL; + } gl_context_make_current(NULL); @@ -268,14 +268,14 @@ struct video_frame * dxt_glsl_compress(struct module *mod, struct video_frame * return NULL; } - struct video_frame *out_frame = s->pool->get_frame(); + struct video_frame *out_frame = s->pool.get_frame(); for (x = 0; x < tx->tile_count; ++x) { struct tile *in_tile = vf_get_tile(tx, x); struct tile *out_tile = vf_get_tile(out_frame, x); line1 = (unsigned char *) in_tile->data; - line2 = (unsigned char *) s->decoded; + line2 = (unsigned char *) s->decoded.get(); for (i = 0; i < (int) in_tile->height; ++i) { s->decoder(line2, line1, s->encoder_input_linesize, @@ -285,11 +285,11 @@ struct video_frame * dxt_glsl_compress(struct module *mod, struct video_frame * } if(s->interlaced_input) - vc_deinterlace((unsigned char *) s->decoded, s->encoder_input_linesize, + vc_deinterlace((unsigned char *) s->decoded.get(), s->encoder_input_linesize, in_tile->height); dxt_encoder_compress(s->encoder[x], - (unsigned char *) s->decoded, + (unsigned char *) s->decoded.get(), (unsigned char *) out_tile->data); } @@ -309,12 +309,7 @@ static void dxt_glsl_compress_done(struct module *mod) } } - free(s->decoded); - - delete s->pool; - destroy_gl_context(&s->gl_context); - - free(s); + delete s; } diff --git a/src/video_compress/jpeg.cpp b/src/video_compress/jpeg.cpp index faf9bde32..f6c9d18a6 100644 --- a/src/video_compress/jpeg.cpp +++ b/src/video_compress/jpeg.cpp @@ -50,9 +50,12 @@ #include "libgpujpeg/gpujpeg_encoder.h" #include "utils/video_frame_pool.h" #include "video.h" +#include #include #include +using namespace std; + struct state_video_compress_jpeg { struct module module_data; @@ -60,7 +63,7 @@ struct state_video_compress_jpeg { struct gpujpeg_parameters encoder_param; decoder_t decoder; - char *decoded; + unique_ptr decoded; unsigned int rgb:1; codec_t color_spec; @@ -71,7 +74,7 @@ struct state_video_compress_jpeg { int encoder_input_linesize; - video_frame_pool *pool; + video_frame_pool pool; }; static int configure_with(struct state_video_compress_jpeg *s, struct video_frame *frame); @@ -196,7 +199,7 @@ static int configure_with(struct state_video_compress_jpeg *s, struct video_fram s->encoder = gpujpeg_encoder_create(&s->encoder_param, ¶m_image); int data_len = frame->tiles[0].width * frame->tiles[0].height * 3; - s->pool->reconfigure(compressed_desc, data_len); + s->pool.reconfigure(compressed_desc, data_len); s->encoder_input_linesize = frame->tiles[0].width * (param_image.color_space == GPUJPEG_RGB ? 3 : 2); @@ -207,7 +210,7 @@ static int configure_with(struct state_video_compress_jpeg *s, struct video_fram return FALSE; } - s->decoded = (char *) malloc(4 * frame->tiles[0].width * frame->tiles[0].height); + s->decoded = unique_ptr(new char[4 * frame->tiles[0].width * frame->tiles[0].height]); return TRUE; } @@ -265,10 +268,7 @@ struct module * jpeg_compress_init(struct module *parent, const struct video_com struct state_video_compress_jpeg *s; const char *opts = params->cfg; - s = (struct state_video_compress_jpeg *) malloc(sizeof(struct state_video_compress_jpeg)); - - s->decoded = NULL; - s->pool = new video_frame_pool(); + s = new state_video_compress_jpeg{}; if(opts && strcmp(opts, "help") == 0) { printf("JPEG comperssion usage:\n"); @@ -302,6 +302,7 @@ struct module * jpeg_compress_init(struct module *parent, const struct video_com if(ret != 0) { fprintf(stderr, "[JPEG] initializing CUDA device %d failed.\n", cuda_devices[0]); + delete s; return NULL; } @@ -353,14 +354,14 @@ struct video_frame * jpeg_compress(struct module *mod, struct video_frame * tx) } } - out = s->pool->get_frame(); + out = s->pool.get_frame(); for (x = 0; x < tx->tile_count; ++x) { struct tile *in_tile = vf_get_tile(tx, x); struct tile *out_tile = vf_get_tile(out, x); line1 = (unsigned char *) in_tile->data; - line2 = (unsigned char *) s->decoded; + line2 = (unsigned char *) s->decoded.get(); for (i = 0; i < (int) in_tile->height; ++i) { s->decoder(line2, line1, s->encoder_input_linesize, @@ -385,11 +386,13 @@ struct video_frame * jpeg_compress(struct module *mod, struct video_frame * tx) struct gpujpeg_encoder_input encoder_input; - gpujpeg_encoder_input_set_image(&encoder_input, (uint8_t *) s->decoded); + gpujpeg_encoder_input_set_image(&encoder_input, (uint8_t *) s->decoded.get()); ret = gpujpeg_encoder_encode(s->encoder, &encoder_input, &compressed, &size); - if(ret != 0) + if(ret != 0) { + VIDEO_FRAME_DISPOSE(out); return NULL; + } out_tile->data_len = size; memcpy(out_tile->data, compressed, size); @@ -406,13 +409,13 @@ static void jpeg_compress_done(struct module *mod) platform_spin_destroy(&s->spin); - delete s->pool; - free(s); + delete s; } static void cleanup_state(struct state_video_compress_jpeg *s) { - if(s->encoder) + if (s->encoder) gpujpeg_encoder_destroy(s->encoder); + s->encoder = NULL; } diff --git a/src/video_compress/libavcodec.c b/src/video_compress/libavcodec.c index a21324f4b..829785f0d 100644 --- a/src/video_compress/libavcodec.c +++ b/src/video_compress/libavcodec.c @@ -206,7 +206,6 @@ static int parse_fmt(struct state_video_compress_libav *s, char *fmt) { if(s->requested_subsampling != 422 && s->requested_subsampling != 420) { fprintf(stderr, "[lavc] Supported subsampling is only 422 or 420.\n"); - free(s); return -1; } } else if(strncasecmp("preset=", item, strlen("preset=")) == 0) { @@ -559,6 +558,7 @@ struct video_frame *libavcodec_compress_tile(struct module *mod, struct video_fr int got_output; #endif unsigned char *decoded; + struct video_frame *out = NULL; platform_spin_lock(&s->spin); @@ -571,7 +571,7 @@ struct video_frame *libavcodec_compress_tile(struct module *mod, struct video_fr } } - struct video_frame *out = vf_alloc_desc(s->compressed_desc); + out = vf_alloc_desc(s->compressed_desc); out->dispose = libavcodec_vid_enc_frame_dispose; #if LIBAVCODEC_VERSION_MAJOR >= 54 AVPacket *pkt = (AVPacket *) malloc(sizeof(AVPacket)); @@ -671,6 +671,7 @@ struct video_frame *libavcodec_compress_tile(struct module *mod, struct video_fr error: VIDEO_FRAME_DISPOSE(tx); + VIDEO_FRAME_DISPOSE(out); platform_spin_unlock(&s->spin); return NULL; } diff --git a/src/video_decompress/jpeg_to_dxt.cpp b/src/video_decompress/jpeg_to_dxt.cpp index bce954ff2..f9c6b91f7 100644 --- a/src/video_decompress/jpeg_to_dxt.cpp +++ b/src/video_decompress/jpeg_to_dxt.cpp @@ -192,17 +192,15 @@ void * jpeg_to_dxt_decompress_init(void) int ret = gpujpeg_init_device(cuda_devices[i], TRUE); if(ret != 0) { fprintf(stderr, "[JPEG] initializing CUDA device %d failed.\n", cuda_devices[0]); - free(s); + delete s; return NULL; } } for(unsigned int i = 0; i < cuda_devices_count; ++i) { s->thread_data[i].cuda_dev_index = i; - if(pthread_create(&s->thread_id[i], NULL, worker_thread, &s->thread_data[i]) != 0) { - fprintf(stderr, "Error creating thread.\n"); - return NULL; - } + int ret = pthread_create(&s->thread_id[i], NULL, worker_thread, &s->thread_data[i]); + assert(ret == 0); } return s; diff --git a/src/video_display/aggregate.c b/src/video_display/aggregate.c index 75fb1a921..b29b12db5 100644 --- a/src/video_display/aggregate.c +++ b/src/video_display/aggregate.c @@ -1,35 +1,26 @@ +/** + * @file video_display/aggregate.c + * @author Martin Pulec + */ /* - * FILE: video_display/sage.c - * AUTHORS: Martin Benes - * Lukas Hejtmanek - * Petr Holub - * Milos Liska - * Jiri Matela - * Dalibor Matura <255899@mail.muni.cz> - * Ian Wesley-Smith - * - * Copyright (c) 2005-2209 CESNET z.s.p.o. + * Copyright (c) 2011-2014 CESNET, z. s. p. o. + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, is permitted provided that the following conditions * are met: - * + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * - * This product includes software developed by CESNET z.s.p.o. - * - * 4. Neither the name of CESNET nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific - * prior written permission. - * + * + * 3. Neither the name of CESNET nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY @@ -42,10 +33,9 @@ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * */ + #ifdef HAVE_CONFIG_H #include "config.h" #include "config_unix.h" @@ -114,7 +104,7 @@ void *display_aggregate_init(const char *fmt, unsigned int flags) struct display_aggregate_state *s; char *save_ptr = NULL; char *item; - char *parse_string; + char *parse_string = NULL;; char *tmp; int i; @@ -157,11 +147,12 @@ void *display_aggregate_init(const char *fmt, unsigned int flags) int ret = initialize_video_display(device, device_cfg, dev_flags, &s->devices[i]); - free(config); if(ret != 0) { fprintf(stderr, "[aggregate] Unable to initialize device %d (%s:%s).\n", i, device, device_cfg); + free(config); goto error; } + free(config); ++i; tmp = NULL; } @@ -174,6 +165,7 @@ void *display_aggregate_init(const char *fmt, unsigned int flags) return (void *)s; error: + free(parse_string); if(s->devices) { unsigned int i; for (i = 0u; i < s->devices_cnt; ++i) { diff --git a/src/video_display/decklink.cpp b/src/video_display/decklink.cpp index 6c28383b4..4bafe6cbf 100644 --- a/src/video_display/decklink.cpp +++ b/src/video_display/decklink.cpp @@ -857,7 +857,7 @@ void *display_decklink_init(const char *fmt, unsigned int flags) for(int i = 0; i < s->devices_cnt; ++i) { if(s->state[i].deckLink == NULL) { fprintf(stderr, "No DeckLink PCI card #%d found\n", cardIdx[i]); - return NULL; + goto error; } } @@ -890,10 +890,8 @@ void *display_decklink_init(const char *fmt, unsigned int flags) for(int i = 0; i < s->devices_cnt; ++i) { // Obtain the audio/video output interface (IDeckLinkOutput) if (s->state[i].deckLink->QueryInterface(IID_IDeckLinkOutput, (void**)&s->state[i].deckLinkOutput) != S_OK) { - if(s->state[i].deckLinkOutput != NULL) - s->state[i].deckLinkOutput->Release(); - s->state[i].deckLink->Release(); - return NULL; + printf("Could not obtain the IDeckLinkOutput interface: %08x\n", (int) result); + goto error; } // Query the DeckLink for its configuration interface @@ -902,7 +900,7 @@ void *display_decklink_init(const char *fmt, unsigned int flags) if (result != S_OK) { printf("Could not obtain the IDeckLinkConfiguration interface: %08x\n", (int) result); - return NULL; + goto error; } #ifdef DECKLINK_LOW_LATENCY @@ -983,6 +981,9 @@ void *display_decklink_init(const char *fmt, unsigned int flags) s->initialized = false; return (void *)s; +error: + display_decklink_done(s); + return NULL; } void display_decklink_run(void *state) diff --git a/src/video_display/deltacast.cpp b/src/video_display/deltacast.cpp index ef0708c55..4a3335a55 100644 --- a/src/video_display/deltacast.cpp +++ b/src/video_display/deltacast.cpp @@ -372,6 +372,7 @@ void *display_deltacast_init(const char *fmt, unsigned int flags) tok = strtok_r(tmp, ":", &save_ptr); if(!tok) { + free(tmp); show_help(); goto error; } diff --git a/src/video_display/dvs.c b/src/video_display/dvs.c index b2374132c..828cdd1a6 100644 --- a/src/video_display/dvs.c +++ b/src/video_display/dvs.c @@ -653,8 +653,14 @@ void *display_dvs_init(const char *cfg, unsigned int flags) { struct state_hdsp *s; int i; - char *name = ""; + char *name = strdup(""); int res; + char *fmt = NULL; + + if (strcmp(cfg, "help") == 0) { + show_help(); + return &display_init_noerr; + } s = (struct state_hdsp *)calloc(1, sizeof(struct state_hdsp)); s->magic = HDSP_MAGIC; @@ -667,13 +673,10 @@ void *display_dvs_init(const char *cfg, unsigned int flags) gettimeofday(&s->t0, NULL); if (cfg != NULL) { - char *fmt = strdup(cfg); - if (strcmp(fmt, "help") == 0) { - show_help(); - return &display_init_noerr; - } + fmt = strdup(cfg); if(strncmp(fmt, "PCI", 3) == 0) { - name = fmt; + free(name); + name = strdup(fmt); } else { char *tmp; int mode_index; @@ -687,8 +690,7 @@ void *display_dvs_init(const char *cfg, unsigned int flags) s->frame->color_spec = get_codec_from_name(tmp); if (s->frame->color_spec == VIDEO_CODEC_NONE) { fprintf(stderr, "dvs: unknown codec: %s\n", tmp); - free(s); - return 0; + goto error; } for(i=0; hdsp_mode_table[i].width != 0; i++) { if(hdsp_mode_table[i].mode == mode_index) { @@ -698,18 +700,25 @@ void *display_dvs_init(const char *cfg, unsigned int flags) } if(s->mode == NULL) { fprintf(stderr, "dvs: unknown video mode: %d\n", mode_index); - free(s); - return 0; + goto error; } tmp = strtok(NULL, ":"); if(tmp) { - name = tmp; - tmp[strlen(name)] = ':'; + if (strtok(NULL, ":") != NULL) { // DVS device name contains ':' + // which was removed by strtok + tmp[strlen(tmp)] = ':'; + free(name); + name = strdup(tmp); + } else { + fprintf(stderr, "dvs: Malformed device name!"); + goto error; + } } } } free(fmt); + fmt = NULL; } s->audio.data = NULL; @@ -728,7 +737,7 @@ void *display_dvs_init(const char *cfg, unsigned int flags) if (res != SV_OK) { fprintf(stderr, "Cannot open DVS display device.\n"); fprintf(stderr, "Error %s\n", sv_geterrortext(res)); - return NULL; + goto error; } s->worker_waiting = TRUE; @@ -781,7 +790,17 @@ void *display_dvs_init(const char *cfg, unsigned int flags) return NULL; }*/ + free(name); return (void *)s; + +error: + free(name); + free(fmt); + if (s) { + vf_free(s->frame); + free(s); + } + return NULL; } void display_dvs_done(void *state) diff --git a/src/video_display/gl.cpp b/src/video_display/gl.cpp index 3a1143016..7a087cb78 100644 --- a/src/video_display/gl.cpp +++ b/src/video_display/gl.cpp @@ -290,14 +290,15 @@ void * display_gl_init(const char *fmt, unsigned int flags) { if (fmt != NULL) { if (strcmp(fmt, "help") == 0) { gl_show_help(); - free(s); + delete s; return &display_init_noerr; } - char *tmp = strdup(fmt); + char *tmp, *ptr; + tmp = ptr = strdup(fmt); char *tok, *save_ptr = NULL; - while((tok = strtok_r(tmp, ":", &save_ptr)) != NULL) { + while((tok = strtok_r(ptr, ":", &save_ptr)) != NULL) { if(!strcmp(tok, "d")) { s->deinterlace = true; } else if(!strcmp(tok, "fs")) { @@ -317,7 +318,7 @@ void * display_gl_init(const char *fmt, unsigned int flags) { } else { fprintf(stderr, "[GL] Unknown option: %s\n", tok); } - tmp = NULL; + ptr = NULL; } free(tmp); diff --git a/src/video_display/sage.cpp b/src/video_display/sage.cpp index 984a56450..149ccfeff 100644 --- a/src/video_display/sage.cpp +++ b/src/video_display/sage.cpp @@ -181,12 +181,13 @@ void *display_sage_init(const char *fmt, unsigned int flags) printf("\t Supported options are UYVY, RGBA, RGB or DXT1\n"); return &display_init_noerr; } else { - char *tmp = strdup(fmt); + char *tmp, *parse_str; + tmp = parse_str = strdup(fmt); char *save_ptr = NULL; char *item; - while((item = strtok_r(tmp, ":", &save_ptr))) { - tmp = NULL; + while((item = strtok_r(parse_str, ":", &save_ptr))) { + parse_str = NULL; if(strncmp(item, "config=", strlen("config=")) == 0) { s->confName = item + strlen("config="); } else if(strncmp(item, "codec=", strlen("codec=")) == 0) { @@ -233,6 +234,7 @@ void *display_sage_init(const char *fmt, unsigned int flags) if(s->confName) { if(stat(s->confName, &sb)) { perror("Unable to use SAGE config file"); + free(s); return NULL; } } else if(stat("ultragrid.conf", &sb) == 0) { @@ -246,6 +248,7 @@ void *display_sage_init(const char *fmt, unsigned int flags) if(s->confName == NULL && s->fsIP == NULL) { fprintf(stderr, "[SAGE] Unable to locate FS manager address. " "Set either in config file or from command line.\n"); + free(s); return NULL; } @@ -357,10 +360,10 @@ static sail *initSage(const char *confName, const char *fsIP, int appID, int nod // default values if(fsIP) { - strncpy(sailCfg.fsIP, fsIP, SAGE_IP_LEN); + strncpy(sailCfg.fsIP, fsIP, SAGE_IP_LEN - 1); } sailCfg.fsPort = 20002; - strncpy(sailCfg.masterIP, "127.0.0.1", SAGE_IP_LEN); + strncpy(sailCfg.masterIP, "127.0.0.1", SAGE_IP_LEN - 1); sailCfg.nwID = 1; sailCfg.msgPort = 23010; sailCfg.syncPort = 13010; diff --git a/src/video_display/sdl.cpp b/src/video_display/sdl.cpp index d0e443a45..f7550b677 100644 --- a/src/video_display/sdl.cpp +++ b/src/video_display/sdl.cpp @@ -432,7 +432,7 @@ void *display_sdl_init(const char *fmt, unsigned int flags) if (fmt != NULL) { if (strcmp(fmt, "help") == 0) { show_help(); - free(s); + delete s; return &display_init_noerr; } @@ -468,6 +468,7 @@ void *display_sdl_init(const char *fmt, unsigned int flags) if (ret < 0) { printf("Unable to initialize SDL.\n"); + delete s; return NULL; } diff --git a/src/video_export.c b/src/video_export.c index e8c3c249d..dc3863639 100644 --- a/src/video_export.c +++ b/src/video_export.c @@ -254,6 +254,8 @@ void video_export(struct video_export *s, struct video_frame *frame) MAX_QUEUE_SIZE, s->total++); // we increment total size to keep the index pthread_mutex_unlock(&s->lock); + free(entry->data); + free(entry); return; } diff --git a/src/video_frame.c b/src/video_frame.c index fe823d08a..6bea384e1 100644 --- a/src/video_frame.c +++ b/src/video_frame.c @@ -302,13 +302,13 @@ struct video_frame *vf_get_copy(struct video_frame *original) { bool save_video_frame_as_pnm(struct video_frame *frame, const char *name) { - unsigned char *data = NULL, *tmp = NULL; + unsigned char *data = NULL, *tmp_data = NULL; struct tile *tile = &frame->tiles[0]; int len = tile->width * tile->height * 3; if (frame->color_spec == RGB) { data = (unsigned char *) tile->data; } else { - data = tmp = (unsigned char *) malloc(len); + data = tmp_data = (unsigned char *) malloc(len); if (frame->color_spec == UYVY) { vc_copylineUYVYtoRGB(data, (const unsigned char *) tile->data, len); @@ -316,6 +316,7 @@ bool save_video_frame_as_pnm(struct video_frame *frame, const char *name) vc_copylineRGBAtoRGB(data, (const unsigned char *) tile->data, len, 0, 8, 16); } else { + free(tmp_data); return false; } } @@ -330,7 +331,7 @@ bool save_video_frame_as_pnm(struct video_frame *frame, const char *name) fwrite(data, 1, len, out); fclose(out); } - free(tmp); + free(tmp_data); return true; }