Skip to content

Commit e08996d

Browse files
committed
workaround for possible OOM crash
1 parent 3a20515 commit e08996d

File tree

2 files changed

+69
-27
lines changed

2 files changed

+69
-27
lines changed

src/source.cpp

Lines changed: 66 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -947,10 +947,7 @@ WAVSource::WAVSource(obs_source_t *source)
947947

948948
obs_enter_graphics();
949949

950-
// create shader
951-
auto filename = obs_module_file("gradient.effect");
952-
m_shader = gs_effect_create_from_file(filename, nullptr);
953-
bfree(filename);
950+
create_shader();
954951

955952
obs_leave_graphics();
956953
}
@@ -960,8 +957,8 @@ WAVSource::~WAVSource()
960957
std::lock_guard lock(m_mtx);
961958
obs_enter_graphics();
962959

963-
gs_vertexbuffer_destroy(m_vbuf);
964-
gs_effect_destroy(m_shader);
960+
free_vbuf();
961+
free_shader();
965962

966963
obs_leave_graphics();
967964

@@ -1018,38 +1015,78 @@ void WAVSource::create_vbuf() {
10181015
num_verts += m_cap_tris * ((m_channel_spacing > 0) ? 12 : 6) * m_num_bars; // 2 caps per bar (middle omitted when 0 spacing)
10191016
}
10201017

1021-
obs_enter_graphics();
1018+
constexpr auto signbit = (size_t)1 << ((sizeof(num_verts) * 8) - 1);
1019+
assert(num_verts > 0);
1020+
assert((num_verts & signbit) == 0); // if MSB is set something has gone very wrong
1021+
assert((num_verts * sizeof(vec3)) < (1u << 30)); // abnormally large allocation
10221022

1023-
gs_vertexbuffer_destroy(m_vbuf);
1023+
obs_enter_graphics();
10241024

1025-
auto vbdata = gs_vbdata_create();
1026-
vbdata->num = num_verts;
1027-
vbdata->points = (vec3*)bmalloc(num_verts * sizeof(vec3));
1028-
vbdata->num_tex = 1;
1029-
vbdata->tvarray = (gs_tvertarray*)bzalloc(sizeof(gs_tvertarray));
1030-
vbdata->tvarray->width = 2;
1031-
vbdata->tvarray->array = bmalloc(2 * num_verts * sizeof(float));
1032-
m_vbuf = gs_vertexbuffer_create(vbdata, GS_DYNAMIC);
1025+
free_vbuf();
10331026

1034-
if(curve) {
1035-
if(m_render_mode == RenderMode::LINE)
1036-
{
1037-
for(auto i = 0u; i < m_width; ++i)
1038-
vec3_set(&vbdata->points[i], (float)i, 0, 0);
1039-
}
1040-
else
1041-
{
1042-
for(auto i = 0u; i < m_width; ++i)
1027+
// FIXME: temporary workaround
1028+
if((num_verts > 0) && ((num_verts * sizeof(vec3)) < (1u << 30)))
1029+
{
1030+
auto vbdata = gs_vbdata_create();
1031+
vbdata->num = num_verts;
1032+
vbdata->points = (vec3*)bmalloc(num_verts * sizeof(vec3));
1033+
vbdata->num_tex = 1;
1034+
vbdata->tvarray = (gs_tvertarray*)bzalloc(sizeof(gs_tvertarray));
1035+
vbdata->tvarray->width = 2;
1036+
vbdata->tvarray->array = bmalloc(2 * num_verts * sizeof(float));
1037+
m_vbuf = gs_vertexbuffer_create(vbdata, GS_DYNAMIC);
1038+
1039+
if(curve) {
1040+
if(m_render_mode == RenderMode::LINE)
1041+
{
1042+
for(auto i = 0u; i < m_width; ++i)
1043+
vec3_set(&vbdata->points[i], (float)i, 0, 0);
1044+
}
1045+
else
10431046
{
1044-
vec3_set(&vbdata->points[i * 2], (float)i, 0, 0);
1045-
vec3_set(&vbdata->points[(i * 2) + 1], (float)i, 0, 0);
1047+
for(auto i = 0u; i < m_width; ++i)
1048+
{
1049+
vec3_set(&vbdata->points[i * 2], (float)i, 0, 0);
1050+
vec3_set(&vbdata->points[(i * 2) + 1], (float)i, 0, 0);
1051+
}
10461052
}
10471053
}
10481054
}
1055+
else
1056+
{
1057+
LogError << "Tried to allocate vbuf of size: " << (num_verts * sizeof(vec3));
1058+
}
10491059

10501060
obs_leave_graphics();
10511061
}
10521062

1063+
void WAVSource::free_vbuf()
1064+
{
1065+
if(m_vbuf != nullptr)
1066+
{
1067+
gs_vertexbuffer_destroy(m_vbuf);
1068+
m_vbuf = nullptr;
1069+
}
1070+
}
1071+
1072+
void WAVSource::create_shader()
1073+
{
1074+
free_shader();
1075+
1076+
auto filename = obs_module_file("gradient.effect");
1077+
m_shader = gs_effect_create_from_file(filename, nullptr);
1078+
bfree(filename);
1079+
}
1080+
1081+
void WAVSource::free_shader()
1082+
{
1083+
if(m_shader != nullptr)
1084+
{
1085+
gs_effect_destroy(m_shader);
1086+
m_shader = nullptr;
1087+
}
1088+
}
1089+
10531090
void WAVSource::update(obs_data_t *settings)
10541091
{
10551092
std::lock_guard lock(m_mtx);
@@ -1324,6 +1361,8 @@ void WAVSource::render([[maybe_unused]] gs_effect_t *effect)
13241361
std::lock_guard lock(m_mtx);
13251362
if(m_last_silent && m_hide_on_silent)
13261363
return;
1364+
if(m_vbuf == nullptr)
1365+
return;
13271366

13281367
if((m_display_mode == DisplayMode::CURVE) || (m_display_mode == DisplayMode::WAVEFORM))
13291368
render_curve(effect);

src/source.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ class WAVSource
247247
float m_window_sum = 1.0f;
248248

249249
void create_vbuf();
250+
void free_vbuf();
251+
void create_shader();
252+
void free_shader();
250253

251254
void get_settings(obs_data_t *settings);
252255

0 commit comments

Comments
 (0)