On Wed, 23 Jan 2013 13:31:37 -0200
Luiz Capitulino <lcapitul...@redhat.com> wrote:

> On Wed, 23 Jan 2013 11:15:40 +0800
> Lei Li <li...@linux.vnet.ibm.com> wrote:
> 
> > >> +static int cirmem_chr_write(CharDriverState *chr, const uint8_t *buf, 
> > >> int len)
> > >> +{
> > >> +    CirMemCharDriver *d = chr->opaque;
> > >> +    int i;
> > >> +
> > >> +    if (!buf || (len < 0)) {
> > >> +        return -1;
> > >> +    }
> > > Is the above checks really needed? I don't see other char drivers
> > > doing that.
> 
> No answer.
> 
> > >> +
> > >> +    for (i = 0; i < len; i++ ) {
> > >> +        /* Avoid writing the IAC information to the queue. */
> > >> +        if ((unsigned char)buf[i] == IAC) {
> > >> +            continue;
> > >> +        }
> > >> +
> > >> +        d->cbuf[d->prod++ % d->size] = buf[i];
> > > You never reset d->prod, can't it overflow?
> > >
> > >> +        if ((d->prod - d->cons) > d->size) {
> > >> +            d->cons = d->prod - d->size;
> > >> +        }
> > > Why is the the if block above needed?
> > 
> > This algorithm is Anthony's suggestion which I squashed
> > it in. I think there is no overflow for that we use unsigned,
> 
> Actually, it can overflow. However, at least on my system the overflow
> reset the variable to 0. Not sure if this will always be the case, but
> that's the fix I'd propose anyway.
> 
> > and
> > this if block will adjust the index of product and consumer.
> 
> I can see that, I asked why it's needed. I'm seeing a bug that might
> be related to it:
> 
> (qemu) memchar_write foo luiz3
> (qemu) memchar_read foo 10
> uiz3, 
> (qemu) 
> 
> I'd expect to read '3uiz' back.

Forgot to say that, my buffer size is 4 bytes:

 -chardev memory,id=foo,maxcapacity=4

Reply via email to