> +struct rtl8366_mib_counter {
> +     unsigned        base;
> +     unsigned        offset;
> +     unsigned        length;
> +     const char      *name;
> +};


> +void rtl8366_get_strings(struct dsa_switch *ds, int port, uint8_t *data)
> +{
> +     struct realtek_smi *smi = ds->priv;
> +     struct rtl8366_mib_counter *mib;
> +     int i;
> +
> +     if (port >= smi->num_ports)
> +             return;
> +
> +     for (i = 0; i < smi->num_mib_counters; i++) {
> +             mib = &smi->mib_counters[i];
> +             memcpy(data + i * ETH_GSTRING_LEN,
> +                    mib->name, ETH_GSTRING_LEN);
> +     }
> +}

Hi Linus

name is a char *. Its length is determined by its content. But you
perform a memcpy of ETH_GSTRING_LEN. This can take you off the end of
the string causing an out of bounds error. Either make name
ETH_GSTRING_LEN long, or you strncpy().

        Andrew

Reply via email to