Compare commits

..

No commits in common. "0c63b665448af0955cdcca008e6a45bee1569bfb" and "252ca8542a1a5746ae01784870d94f8891505e44" have entirely different histories.

2 changed files with 71 additions and 81 deletions

View File

@ -40,22 +40,13 @@ static bool varint(CTX &ctx, T &val)
return false; return false;
} }
static bool length(CTX &ctx, qint32 &val)
{
if (TYPE(ctx.tag) != LEN)
return false;
if (!varint(ctx, val))
return false;
return (val >= 0);
}
static bool str(CTX &ctx, QByteArray &val) static bool str(CTX &ctx, QByteArray &val)
{ {
qint32 len; qint32 len;
if (!length(ctx, len)) if (TYPE(ctx.tag) != LEN)
return false;
if (!varint(ctx, len))
return false; return false;
if (ctx.bp + len > ctx.be) if (ctx.bp + len > ctx.be)
return false; return false;
@ -98,7 +89,7 @@ static bool packed(CTX &ctx, QVector<quint32> &vals)
if (TYPE(ctx.tag) == LEN) { if (TYPE(ctx.tag) == LEN) {
qint32 len; qint32 len;
if (!varint(ctx, len) || len < 0) if (!varint(ctx, len))
return false; return false;
const char *ee = ctx.bp + len; const char *ee = ctx.bp + len;
if (ee > ctx.be) if (ee > ctx.be)
@ -129,7 +120,7 @@ static bool skip(CTX &ctx)
len = 8; len = 8;
break; break;
case LEN: case LEN:
if (!varint(ctx, len) || len < 0) if (!varint(ctx, len))
return false; return false;
break; break;
case I32: case I32:
@ -148,13 +139,16 @@ static bool skip(CTX &ctx)
static bool value(CTX &ctx, QVariant &val) static bool value(CTX &ctx, QVariant &val)
{ {
if (TYPE(ctx.tag) != LEN)
return false;
qint32 len; qint32 len;
QByteArray ba; QByteArray ba;
quint64 num; quint64 num;
double dnum; double dnum;
float fnum; float fnum;
if (!length(ctx, len)) if (!varint(ctx, len))
return false; return false;
const char *ee = ctx.bp + len; const char *ee = ctx.bp + len;
@ -220,10 +214,13 @@ static bool value(CTX &ctx, QVariant &val)
static bool feature(CTX &ctx, Data::Feature &f) static bool feature(CTX &ctx, Data::Feature &f)
{ {
qint32 len;
quint32 e; quint32 e;
if (!length(ctx, len)) if (TYPE(ctx.tag) != LEN)
return false;
qint32 len;
if (!varint(ctx, len))
return false; return false;
const char *ee = ctx.bp + len; const char *ee = ctx.bp + len;
@ -269,9 +266,12 @@ static bool feature(CTX &ctx, Data::Feature &f)
static bool layer(CTX &ctx, Data::Layer &l) static bool layer(CTX &ctx, Data::Layer &l)
{ {
qint32 len; if (FIELD(ctx.tag) == 3) {
if (TYPE(ctx.tag) != LEN)
return false;
if (!length(ctx, len)) qint32 len;
if (!varint(ctx, len))
return false; return false;
const char *ee = ctx.bp + len; const char *ee = ctx.bp + len;
@ -321,6 +321,8 @@ static bool layer(CTX &ctx, Data::Layer &l)
} }
return (ctx.bp == ee); return (ctx.bp == ee);
} else
return skip(ctx);
} }
bool Data::load(const QByteArray &ba) bool Data::load(const QByteArray &ba)
@ -330,17 +332,9 @@ bool Data::load(const QByteArray &ba)
while (ctx.bp < ctx.be) { while (ctx.bp < ctx.be) {
if (!varint(ctx, ctx.tag)) if (!varint(ctx, ctx.tag))
return false; return false;
switch (FIELD(ctx.tag)) {
case 3:
_layers.append(Layer()); _layers.append(Layer());
if (!layer(ctx, _layers.last())) if (!layer(ctx, _layers.last()))
return false; return false;
break;
default:
if (!skip(ctx))
return false;
}
} }
return (ctx.bp == ctx.be); return (ctx.bp == ctx.be);

View File

@ -17,8 +17,6 @@ public:
struct Feature struct Feature
{ {
Feature() : id(0), type(UNKNOWN) {}
quint64 id; quint64 id;
QVector<quint32> tags; QVector<quint32> tags;
GeomType type; GeomType type;
@ -27,8 +25,6 @@ public:
struct Layer struct Layer
{ {
Layer() : version(1), extent(4096) {}
quint32 version; quint32 version;
QByteArray name; QByteArray name;
QVector<Feature> features; QVector<Feature> features;