Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4857bb9c authored by Murthy Nidadavolu's avatar Murthy Nidadavolu
Browse files

media/dvb: Add checks if transport stream is existing



Chances of kernel crash when CAS clients call DMX_STOP without
successful prior DMX_START is eliminated by checking for a valid TS.

Change-Id: I760cdde238b076d1853afb1a3943de84bc88d96e
Signed-off-by: default avatarMurthy Nidadavolu <mnssr@codeaurora.org>
parent 04ac388e
Loading
Loading
Loading
Loading
+25 −19
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ static inline void dvb_dmxdev_notify_data_read(
		feed = list_first_entry(&filter->feed.ts,
					struct dmxdev_feed, next);

		if (feed->ts->notify_data_read)
		if (feed->ts && feed->ts->notify_data_read)
			feed->ts->notify_data_read(
						feed->ts,
						bytes_read);
@@ -599,6 +599,7 @@ static void dvb_dvr_oob_cmd(struct dmxdev *dmxdev, struct dmx_oob_command *cmd)
		case DMXDEV_TYPE_PES:
			feed = list_first_entry(&filter->feed.ts,
						struct dmxdev_feed, next);
			if (feed->ts && feed->ts->oob_command)
				feed->ts->oob_command(feed->ts, cmd);
			break;
		case DMXDEV_TYPE_NONE:
@@ -1351,7 +1352,7 @@ static int dvb_dmxdev_flush_data(struct dmxdev_filter *filter,
		feed = list_first_entry(&filter->feed.ts,
			struct dmxdev_feed, next);

		if (feed->ts->flush_buffer)
		if (feed->ts && feed->ts->flush_buffer)
			return feed->ts->flush_buffer(feed->ts, length);
	} else if (filter->type == DMXDEV_TYPE_SEC &&
		filter->feed.sec.feed->flush_buffer) {
@@ -2064,7 +2065,7 @@ static int dvb_dmxdev_set_indexing_params(
			ts_feed = feed;
			ts_feed->idx_params = *idx_params;
			if ((dmxdevfilter->state == DMXDEV_STATE_GO) &&
				ts_feed->ts->set_idx_params)
				ts_feed->ts && ts_feed->ts->set_idx_params)
				ret = ts_feed->ts->set_idx_params(
						ts_feed->ts, idx_params);
			break;
@@ -2096,7 +2097,7 @@ static int dvb_dmxdev_get_scrambling_bits(struct dmxdev_filter *filter,

	list_for_each_entry(feed, &filter->feed.ts, next) {
		if (feed->pid == scrambling_bits->pid) {
			if (feed->ts->get_scrambling_bits)
			if (feed->ts && feed->ts->get_scrambling_bits)
				return feed->ts->get_scrambling_bits(feed->ts,
						&scrambling_bits->value);
			return -EINVAL;
@@ -2131,6 +2132,7 @@ static void dvb_dmxdev_ts_insertion_work(struct work_struct *worker)
	mutex_unlock(&ts_buffer->dmxdevfilter->mutex);

	if (ts_buffer->size < free_bytes)
		if (ts && ts->ts_insertion_insert_buffer)
			ts->ts_insertion_insert_buffer(ts,
				ts_buffer->buffer, ts_buffer->size);

@@ -2242,7 +2244,7 @@ static int dvb_dmxdev_set_ts_insertion(
	feed = list_first_entry(&dmxdevfilter->feed.ts,
				struct dmxdev_feed, next);

	if (first_buffer && feed->ts->ts_insertion_init)
	if (first_buffer && feed->ts && feed->ts->ts_insertion_init)
		ret = feed->ts->ts_insertion_init(feed->ts);

	if (!ret) {
@@ -2296,7 +2298,7 @@ static int dvb_dmxdev_abort_ts_insertion(struct dmxdev_filter *dmxdevfilter,
		if (list_empty(&dmxdevfilter->insertion_buffers)) {
			feed = list_first_entry(&dmxdevfilter->feed.ts,
						struct dmxdev_feed, next);
			if (feed->ts->ts_insertion_terminate)
			if (feed->ts && feed->ts->ts_insertion_terminate)
				ret = feed->ts->ts_insertion_terminate(
							feed->ts);
		}
@@ -2503,7 +2505,7 @@ static int dvb_dmxdev_get_buffer_status(
					struct dmxdev_feed, next);

		/* Ask for status of decoder's buffer from underlying HW */
		if (feed->ts->get_decoder_buff_status)
		if (feed->ts && feed->ts->get_decoder_buff_status)
			ret = feed->ts->get_decoder_buff_status(
					feed->ts,
					dmx_buffer_status);
@@ -3196,6 +3198,7 @@ static int dvb_dmxdev_feed_stop(struct dmxdev_filter *dmxdevfilter)
				if (!dmxdevfilter->dev->dvr_feeds_count)
					dmxdevfilter->dev->dvr_feed = NULL;
			}
			if (feed->ts && feed->ts->stop_filtering)
				feed->ts->stop_filtering(feed->ts);
		}
		break;
@@ -3219,12 +3222,14 @@ static int dvb_dmxdev_feed_start(struct dmxdev_filter *filter)
			filter->feed.sec.feed);
	case DMXDEV_TYPE_PES:
		list_for_each_entry(feed, &filter->feed.ts, next) {
			if (feed->ts && feed->ts->start_filtering) {
				ret = feed->ts->start_filtering(feed->ts);
				if (ret < 0) {
					dvb_dmxdev_feed_stop(filter);
					return ret;
				}
			}
		}
		break;
	default:
		return -EINVAL;
@@ -3289,7 +3294,7 @@ static int dvb_dmxdev_filter_stop(struct dmxdev_filter *dmxdevfilter)
			list_for_each_entry(ts_buffer,
					&dmxdevfilter->insertion_buffers, next)
				dvb_dmxdev_cancel_ts_insertion(ts_buffer);
			if (feed->ts->ts_insertion_terminate)
			if (feed->ts && feed->ts->ts_insertion_terminate)
				feed->ts->ts_insertion_terminate(feed->ts);
		}

@@ -3754,7 +3759,7 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter)
			struct dmxdev_feed, next);

		ret = 0;
		if (feed->ts->ts_insertion_init)
		if (feed->ts && feed->ts->ts_insertion_init)
			ret = feed->ts->ts_insertion_init(feed->ts);
		if (!ret) {
			list_for_each_entry(ts_buffer,
@@ -3939,7 +3944,7 @@ static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev,

	list_for_each_entry_safe(feed, tmp, &filter->feed.ts, next) {
		if (feed->pid == pid) {
			if (feed->ts != NULL) {
			if (feed->ts != NULL && feed->ts->stop_filtering) {
				feed->ts->stop_filtering(feed->ts);
				filter->dev->demux->release_ts_feed(
							filter->dev->demux,
@@ -4037,6 +4042,7 @@ static int dvb_dmxdev_set_cipher(struct dmxdev *dmxdev,
				ts_feed = feed;
				ts_feed->cipher_ops = *cipher_ops;
				if (filter->state == DMXDEV_STATE_GO &&
						ts_feed->ts &&
						ts_feed->ts->set_cipher_ops)
					ts_feed->ts->set_cipher_ops(
						ts_feed->ts, cipher_ops);