Sorry, my suggested correction is still wrong. b[0] is the length of
the whole descriptor not the length of the string.  So I suggest this
(I tested it on exactly one device) -

static char*
mkstr(uchar *b, int n)
{
        Rune r;
        char *us;
        char *s;
        char *e;

        if(n <= 2 || b[0] > n || (b[0] & 1) != 0)
                return strdup("none");
        n = (b[0] - 2)/2;
        b += 2;
        ...


Or according to taste, one could do this (not tested) -

static char*
mkstr(uchar *b, int n)
{
        Rune r;
        char *us;
        char *s;
        char *e;

        if(n > b[0])
                n = b[0];
        if(n <= 2 || (n & 1) != 0)
                return strdup("none");
        n = (n - 2)/2;
        b += 2;
        ...

I'm not sure which I prefer.  They are semantically slightly different
(if one of b[0] or n is odd).


Reply via email to