[Bug 230032] Intel graphics driver fails to detect DVI output

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Fri Jul 27 12:39:50 UTC 2018


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=230032

--- Comment #4 from FStl <felixstella at protonmail.com> ---
I have found two bugs (so far) in the code of the intel driver.

In /sys/dev/drm2/i915/intel_sdvo.c, in function intel_sdvo_write_cmd:


Line 458:
        msgs = malloc(args_len + 3 * sizeof(*msgs), DRM_MEM_KMS, M_NOWAIT |
M_ZERO);

This line is allocating "args_len" bytes plus "3 * sizeof(*msgs)" bytes of
memory, which is not as intended and actually leads to memory corruption. The
correct code should be:

        msgs = malloc((args_len + 3) * sizeof(*msgs), DRM_MEM_KMS, M_NOWAIT |
M_ZERO);


Lines 493-503:
        ret = -iicbus_transfer(intel_sdvo->i2c, msgs, i+3);
        if (ret < 0) {
                DRM_DEBUG_KMS("I2c transfer returned %d\n", ret);
                ret = false;
                goto out;
        }

out:
        free(msgs, DRM_MEM_KMS);
        free(buf, DRM_MEM_KMS);
        return ret;

The function iicbus_transfer returns 0 on success, and in that case, ret = -0 =
0 = false and so the function intel_sdvo_write_cmd ends up returning false even
when it has actually succeeded. The correct code should be:

        ret = iicbus_transfer(intel_sdvo->i2c, msgs, i+3);
        if (ret != 0) {
                DRM_DEBUG_KMS("I2c transfer returned %d\n", ret);
                ret = false;
        }
        else
                ret = true;

        free(msgs, DRM_MEM_KMS);
        free(buf, DRM_MEM_KMS);
        return ret;


Correcting these two bugs makes the intel_sdvo_get_capabilities call
successful, but the intel_sdvo_set_target_input call is still unsuccessful
(this call is successful on FreeBSD 10). So there are still some bugs left...

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list