On 2026/10/17 22:39, [email protected] wrote:

[...]

>>  out:
>> -    if (ret < 0)
>> +    /* preserve original error even if log finalization is successful */
>> +    err = bpf_log_attr_finalize(&attr_log, log);
>> +    if (err)
>> +            ret = err;
>> +
>> +    kfree(log);
>> +
>> +    if (ret < 0 && prog)
>>              bpf_prog_put(prog);
>>      return ret;
>>  }
> 
> [Severity: Critical]
> Can this underflow the refcount on prog and leak the newly installed link
> file descriptor if bpf_log_attr_finalize() fails after link attachment
> succeeds?

Correct.

To avoid such prog leak, I'd like to report the log_true_size twice.

ret = bpf_log_attr_report_size(&attr_log, 0);
if (ret)
        goto out;

switch (prog->type) {
        /* ... */
}

out:
if (ret) {
        int err =  bpf_log_attr_finalize(&attr_log, log);

        ret = err ? err : ret;
}

if (ret < 0 && prog)
        bpf_prog_put(prog);

kfree(log);
return ret;

Thanks,
Leon

> [...]


Reply via email to