Revision
16838
Author
anthm
Date
2010-02-26 13:20:24 -0600 (Fri, 26 Feb 2010)

Log Message

fix rare accidental null pointer deref

Modified Paths

Diff

Modified: freeswitch/trunk/src/switch_core_codec.c (16837 => 16838)


--- freeswitch/trunk/src/switch_core_codec.c	2010-02-26 17:52:36 UTC (rev 16837)
+++ freeswitch/trunk/src/switch_core_codec.c	2010-02-26 19:20:24 UTC (rev 16838)
@@ -113,13 +113,21 @@
 	if (codec) {
 		if (!session->real_read_codec) {
 			session->read_codec = session->real_read_codec = codec;
-			session->read_impl = *codec->implementation;
+			if (codec->implementation) {
+				session->read_impl = *codec->implementation;
+			} else {
+				memset(&session->read_impl, 0, sizeof(session->read_impl));
+			}
 		} else {
 			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Push codec %s:%d\n",
 							  switch_channel_get_name(session->channel), codec->implementation->iananame, codec->implementation->ianacode);
 			codec->next = session->read_codec;
 			session->read_codec = codec;
-			session->read_impl = *codec->implementation;
+			if (codec->implementation) {
+				session->read_impl = *codec->implementation;
+			} else {
+				memset(&session->read_impl, 0, sizeof(session->read_impl));
+			}
 		}
 	} else {
 		if (session->read_codec == session->real_read_codec) {
@@ -129,7 +137,11 @@
 		if (session->read_codec->next) {
 			switch_codec_t *old = session->read_codec;
 			session->read_codec = session->read_codec->next;
-			session->read_impl = *session->read_codec->implementation;
+			if (session->read_codec->implementation) {
+				session->read_impl = *session->read_codec->implementation;
+			} else {
+				memset(&session->read_impl, 0, sizeof(session->read_impl));
+			}
 			old->next = NULL;
 			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Restore previous codec %s:%d.\n",
 							  switch_channel_get_name(session->channel),
@@ -137,7 +149,11 @@
 
 		} else if (session->real_read_codec) {
 			session->read_codec = session->real_read_codec;
-			session->read_impl = *session->real_read_codec->implementation;
+			if (session->real_read_codec->implementation) {
+				session->read_impl = *session->real_read_codec->implementation;
+			} else {
+				memset(&session->read_impl, 0, sizeof(session->read_impl));
+			}
 			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Restore original codec.\n");
 		} else {
 			status = SWITCH_STATUS_FALSE;
@@ -374,7 +390,11 @@
 	switch_channel_set_variable(channel, "video_read_rate", tmp);
 
 	session->video_read_codec = codec;
-	session->video_read_impl = *codec->implementation;
+	if (codec->implementation) {
+		session->video_read_impl = *codec->implementation;
+	} else {
+		memset(&session->video_read_impl, 0, sizeof(session->video_read_impl));
+	}
   end:
 
 	return status;