Петр ответил на ваш вопрос. Кроме того, я бы посоветовал вам использовать
len = max(protobuf_readVarint(buf, &buf),sizeof(uint32_t));
или перехват, когда первый аргумент больше, чем второй, потому что в противном случае вы слишком много пишете в начало аргумента. Также у вас есть утечка памяти, которая может быть исправлена с помощью:
uint32_t readString(char *buf)
{
uint32_t start;
int len;
len = max(protobuf_readVarint(buf, &buf),sizeof(uint32_t));
memcpy ((void*)&start, buf, len);
buf += len;
return start;
}