Skip to content

Commit

Permalink
Merge pull request FreeRDP#4648 from akallabeth/nsc_free_fix
Browse files Browse the repository at this point in the history
Fixed FreeRDP#4647: nsc_context_free must not access possibly uninitialized fields
  • Loading branch information
mfleisz authored May 15, 2018
2 parents f653686 + ae76543 commit 278fef2
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 27 deletions.
47 changes: 23 additions & 24 deletions libfreerdp/codec/nsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,13 +248,13 @@ static BOOL nsc_context_initialize(NSC_CONTEXT* context, wStream* s)
return TRUE;
}

static void nsc_profiler_print(NSC_CONTEXT* context)
static void nsc_profiler_print(NSC_CONTEXT_PRIV* priv)
{
PROFILER_PRINT_HEADER
PROFILER_PRINT(context->priv->prof_nsc_rle_decompress_data)
PROFILER_PRINT(context->priv->prof_nsc_decode)
PROFILER_PRINT(context->priv->prof_nsc_rle_compress_data)
PROFILER_PRINT(context->priv->prof_nsc_encode)
PROFILER_PRINT(priv->prof_nsc_rle_decompress_data)
PROFILER_PRINT(priv->prof_nsc_decode)
PROFILER_PRINT(priv->prof_nsc_rle_compress_data)
PROFILER_PRINT(priv->prof_nsc_encode)
PROFILER_PRINT_FOOTER
}

Expand All @@ -279,7 +279,7 @@ NSC_CONTEXT* nsc_context_new(void)
context->priv = (NSC_CONTEXT_PRIV*) calloc(1, sizeof(NSC_CONTEXT_PRIV));

if (!context->priv)
goto error_priv;
goto error;

context->priv->log = WLog_Get("com.freerdp.codec.nsc");
WLog_OpenAppender(context->priv->log);
Expand All @@ -289,7 +289,7 @@ NSC_CONTEXT* nsc_context_new(void)
context->priv->PlanePool = BufferPool_New(TRUE, 0, 16);

if (!context->priv->PlanePool)
goto error_PlanePool;
goto error;

PROFILER_CREATE(context->priv->prof_nsc_rle_decompress_data,
"nsc_rle_decompress_data")
Expand All @@ -303,34 +303,33 @@ NSC_CONTEXT* nsc_context_new(void)
/* init optimized methods */
NSC_INIT_SIMD(context);
return context;
error_PlanePool:
free(context->priv);
error_priv:
free(context);
error:
nsc_context_free(context);
return NULL;
}

void nsc_context_free(NSC_CONTEXT* context)
{
int i;
size_t i;

for (i = 0; i < 4; i++)
if (!context)
return;

if (context->priv)
{
if (context->priv->PlaneBuffers[i])
{
for (i = 0; i < 4; i++)
free(context->priv->PlaneBuffers[i]);
context->priv->PlaneBuffers[i] = NULL;
}

BufferPool_Free(context->priv->PlanePool);
nsc_profiler_print(context->priv);
PROFILER_FREE(context->priv->prof_nsc_rle_decompress_data)
PROFILER_FREE(context->priv->prof_nsc_decode)
PROFILER_FREE(context->priv->prof_nsc_rle_compress_data)
PROFILER_FREE(context->priv->prof_nsc_encode)
free(context->priv);
}

free(context->BitmapData);
BufferPool_Free(context->priv->PlanePool);
nsc_profiler_print(context);
PROFILER_FREE(context->priv->prof_nsc_rle_decompress_data)
PROFILER_FREE(context->priv->prof_nsc_decode)
PROFILER_FREE(context->priv->prof_nsc_rle_compress_data)
PROFILER_FREE(context->priv->prof_nsc_encode)
free(context->priv);
free(context);
}

Expand Down
7 changes: 4 additions & 3 deletions libfreerdp/utils/profiler.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ PROFILER* profiler_create(char* name)

void profiler_free(PROFILER* profiler)
{
stopwatch_free(profiler->stopwatch);
if (profiler)
stopwatch_free(profiler->stopwatch);

free(profiler);
}

Expand All @@ -76,9 +78,8 @@ void profiler_print(PROFILER* profiler)
{
double s = stopwatch_get_elapsed_time_in_seconds(profiler->stopwatch);
double avg = profiler->stopwatch->count == 0 ? 0 : s / profiler->stopwatch->count;

WLog_INFO(TAG, "%-30s | %10u | %10.4fs | %8.6fs | %6.0f",
profiler->name, profiler->stopwatch->count, s, avg, profiler->stopwatch->count / s);
profiler->name, profiler->stopwatch->count, s, avg, profiler->stopwatch->count / s);
}

void profiler_print_footer(void)
Expand Down

0 comments on commit 278fef2

Please sign in to comment.