Skip to content

Settings window crashes (segfault) the app when there are no outputs #12843

@HanabishiRecca

Description

@HanabishiRecca

Operating System Info

Other

Other OS

Linux

OBS Studio Version

32.0.2

OBS Studio Version (Other)

No response

OBS Studio Log URL

N/A

OBS Studio Crash Log URL

No response

Expected Behavior

The app should not crash.

Current Behavior

The app crashes.

Steps to Reproduce

  1. Open the settings window when there are no outputs in the system.

Anything else we should know?

I debugged it and found the problem.

Backtrace:

#0  __strcmp_evex () at ../sysdeps/x86_64/multiarch/strcmp-evex.S:320
#1  0x00007ffff67b2fbc in find_output (id=0x0) at /usr/src/debug/obs-studio/obs-studio-32.0.2/libobs/obs-output.c:126
#2  obs_get_output_supported_video_codecs (id=0x0)
    at /usr/src/debug/obs-studio/obs-studio-32.0.2/libobs/obs-output.c:3296
#3  0x00005555557e9136 in OBSBasicSettings::ResetEncoders (this=0x7fffffffbee0, streamOnly=false)
    at /usr/src/debug/obs-studio/obs-studio-32.0.2/frontend/settings/OBSBasicSettings_Stream.cpp:1604
#4  0x000055555583a615 in OBSBasicSettings::LoadOutputSettings (this=0x7fffffffbee0)
    at /usr/src/debug/obs-studio/obs-studio-32.0.2/frontend/settings/OBSBasicSettings.cpp:2165
#5  OBSBasicSettings::LoadSettings (this=0x7fffffffbee0, changedOnly=false)
    at /usr/src/debug/obs-studio/obs-studio-32.0.2/frontend/settings/OBSBasicSettings.cpp:2918
#6  0x0000555555827f57 in OBSBasicSettings::OBSBasicSettings (this=<optimized out>, parent=<optimized out>, 
    this=<optimized out>, parent=<optimized out>)
    at /usr/src/debug/obs-studio/obs-studio-32.0.2/frontend/settings/OBSBasicSettings.cpp:828
#7  0x00005555558ed0d4 in OBSBasic::on_action_Settings_triggered (this=0x555555fdda80)
    at /usr/src/debug/obs-studio/obs-studio-32.0.2/frontend/widgets/OBSBasic_MainControls.cpp:206

It crashes because the find_output function does not check its input id parameter for null.

const struct obs_output_info *find_output(const char *id)
{
size_t i;
for (i = 0; i < obs->output_types.num; i++)
if (strcmp(obs->output_types.array[i].id, id) == 0)
return obs->output_types.array + i;
return NULL;
}

The following patch fixes the problem:

--- a/libobs/obs-output.c
+++ b/libobs/obs-output.c
@@ -121,6 +121,9 @@
 
 const struct obs_output_info *find_output(const char *id)
 {
+	if (id == NULL)
+		return NULL;
+
 	size_t i;
 	for (i = 0; i < obs->output_types.num; i++)
 		if (strcmp(obs->output_types.array[i].id, id) == 0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions