facebook/zstd

Possible division by zero in zstdcli_trace.c

Open

#4368 aperta il 17 apr 2025

Vedi su GitHub
 (7 commenti) (1 reazione) (0 assegnatari)C (2481 fork)batch import
buggood first issuehelp wanted

Metriche repository

Star
 (27.100 star)
Metriche merge PR
 (Merge medio 50m) (2 PR mergiate in 30 g)

Descrizione

Hi,

In function TRACE_log 'duration' is received from function ZSTD_trace_compress_end, which states that it could be zero

Which leads to a possible division by zero bug

void ZSTD_trace_compress_end(ZSTD_TraceCtx ctx, ZSTD_Trace const* trace)
{
    PTime const beginNanos = (PTime)ctx;
    PTime const endNanos = UTIL_clockSpanNano(g_enableTime);
    PTime const durationNanos = endNanos > beginNanos ? endNanos - beginNanos : 0;
    assert(g_traceFile != NULL);
    assert(trace->version == ZSTD_VERSION_NUMBER); /* CLI version must match. */
    TRACE_log("compress", durationNanos, trace);
}

PTime const durationNanos = endNanos > beginNanos ? endNanos - beginNanos : 0; states that 'durationNanos' will be either 'endNanos - beginNanos', if 'endNanos' is bigger, or zero otherwise

Next this function calls TRACE_log("compress", durationNanos, trace);

In TRACE_log, further, it passed to a equation, where possibly division by zero happens

static void TRACE_log(char const* method, PTime duration, ZSTD_Trace const* trace)
{
    int level = 0;
    int workers = 0;
    double const ratio = (double)trace->uncompressedSize / (double)trace->compressedSize;
    double const speed = ((double)trace->uncompressedSize * 1000) / (double)duration;
    if (trace->params) {
...

double const speed = ((double)trace->uncompressedSize * 1000) / (double)duration; here, if 'durationNanos' was zero, will be a division by zero

Same with ZSTD_trace_decompress_end

Guida contributor