facebook/zstd

Possible division by zero in zstdcli_trace.c

Open

#4 368 ouverte le 17 avr. 2025

Voir sur GitHub
 (6 commentaires) (1 réaction) (0 assignés)C (27 100 stars) (2 481 forks)batch import
buggood first issuehelp wanted

Description

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

Guide contributeur