From 10f5d7f3aa4669df2b87816b27fb14c8a6ea17b1 Mon Sep 17 00:00:00 2001
From: GoaLitiuM <goalitium@kapsi.fi>
Date: Sat, 27 Sep 2014 01:35:36 +0300
Subject: [PATCH] Fixed NULL pointer dereferencing in linked lists

---
 libobs-opengl/gl-shader.c  | 3 ++-
 libobs/media-io/audio-io.c | 3 ++-
 libobs/obs-display.c       | 3 ++-
 libobs/obs.c               | 3 ++-
 4 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/libobs-opengl/gl-shader.c b/libobs-opengl/gl-shader.c
index b3c03e166..931a95ede 100644
--- a/libobs-opengl/gl-shader.c
+++ b/libobs-opengl/gl-shader.c
@@ -673,7 +673,8 @@ void gs_program_destroy(struct gs_program *program)
 
 	if (program->next)
 		program->next->prev_next = program->prev_next;
-	*program->prev_next = program->next;
+	if (program->prev_next)
+		*program->prev_next = program->next;
 
 	glDeleteProgram(program->obj);
 	gl_success("glDeleteProgram");
diff --git a/libobs/media-io/audio-io.c b/libobs/media-io/audio-io.c
index 806a33156..3829f81c9 100644
--- a/libobs/media-io/audio-io.c
+++ b/libobs/media-io/audio-io.c
@@ -99,7 +99,8 @@ static inline void audio_output_removeline(struct audio_output *audio,
 		struct audio_line *line)
 {
 	pthread_mutex_lock(&audio->line_mutex);
-	*line->prev_next = line->next;
+	if (line->prev_next)
+		*line->prev_next = line->next;
 	if (line->next)
 		line->next->prev_next = line->prev_next;
 	pthread_mutex_unlock(&audio->line_mutex);
diff --git a/libobs/obs-display.c b/libobs/obs-display.c
index a20b55249..f433d8620 100644
--- a/libobs/obs-display.c
+++ b/libobs/obs-display.c
@@ -86,7 +86,8 @@ void obs_display_destroy(obs_display_t *display)
 {
 	if (display) {
 		pthread_mutex_lock(&obs->data.displays_mutex);
-		*display->prev_next = display->next;
+		if (display->prev_next)
+			*display->prev_next = display->next;
 		if (display->next)
 			display->next->prev_next = display->prev_next;
 		pthread_mutex_unlock(&obs->data.displays_mutex);
diff --git a/libobs/obs.c b/libobs/obs.c
index e06ff457f..fc5904467 100644
--- a/libobs/obs.c
+++ b/libobs/obs.c
@@ -1326,7 +1326,8 @@ void obs_context_data_remove(struct obs_context_data *context)
 {
 	if (context && context->mutex) {
 		pthread_mutex_lock(context->mutex);
-		*context->prev_next = context->next;
+		if (context->prev_next)
+			*context->prev_next = context->next;
 		if (context->next)
 			context->next->prev_next = context->prev_next;
 		pthread_mutex_unlock(context->mutex);
-- 
GitLab