Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Security: Suspicious pointer scaling #136

Closed
jserv opened this issue Jun 1, 2023 · 0 comments
Closed

Security: Suspicious pointer scaling #136

jserv opened this issue Jun 1, 2023 · 0 comments
Assignees

Comments

@jserv
Copy link
Contributor

jserv commented Jun 1, 2023

Reported by CodeQL.

src/emulate.c:149

    case CSR_CYCLE: /* Cycle counter for RDCYCLE instruction */
        return (uint32_t *) (&rv->csr_cycle) + 0;
    case CSR_CYCLEH: /* Upper 32 bits of cycle */
        return (uint32_t *) (&rv->csr_cycle) + 1;

This pointer might have type (size 8), but this pointer arithmetic is done with type uint32_t * (size 4).

Pointer arithmetic in C and C++ is automatically scaled according to the size of the data type. For example, if the type of p is T* and sizeof(T) == 4 then the expression p+1 adds 4 bytes to p. This can cause a buffer overflow condition if the programmer forgets that they are adding a multiple of sizeof(T), rather than a number of bytes.

This query finds pointer arithmetic expressions where it appears likely that the programmer has forgotten that the offset is automatically scaled.

Recommendation
Whenever possible, use the array subscript operator rather than pointer arithmetic. For example, replace *(p+k) with p[k].
Cast to the correct type before using pointer arithmetic. For example, if the type of p is int* but it really points to an array of type double[] then use the syntax (double*)p + k to get a pointer to the k'th element of the array.

src/emulate.c:147

    /* Machine Counter/Timers */
    case CSR_CYCLE: /* Cycle counter for RDCYCLE instruction */
        return (uint32_t *) (&rv->csr_cycle) + 0;

This pointer might have type (size 8), but this pointer arithmetic is done with type uint32_t * (size 4).

References
Common Weakness Enumeration: CWE-468.

qwe661234 added a commit to qwe661234/rv32emu that referenced this issue Jun 2, 2023
qwe661234 added a commit to qwe661234/rv32emu that referenced this issue Jun 2, 2023
@jserv jserv closed this as completed in f27985c Jun 2, 2023
2011eric pushed a commit to 2011eric/rv32emu that referenced this issue Jul 22, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants