X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_nameval.c;h=767f9e0daef58562ff8d9cd0c075ad6ee4a33cb3;hp=e75411be9fb7dfef4e3f6866347a35cc88140881;hb=refs%2Fheads%2Fclean-up;hpb=472c70456396a6f2019bfabe83bd292782dbd978 diff --git a/yaffs_nameval.c b/yaffs_nameval.c index e75411b..767f9e0 100644 --- a/yaffs_nameval.c +++ b/yaffs_nameval.c @@ -37,13 +37,14 @@ static int nval_find(const char *xb, int xb_size, const YCHAR *name, memcpy(&size, xb, sizeof(int)); while (size > 0 && (size < xb_size) && (pos + size < xb_size)) { - if (!strncmp((YCHAR *) (xb + pos + sizeof(int)), name, size)) { + if (!strncmp((YCHAR *) (xb + pos + sizeof(int)), + name, size)) { if (exist_size) *exist_size = size; return pos; } pos += size; - if (pos < xb_size - sizeof(int)) + if (pos < xb_size - (int)sizeof(int)) memcpy(&size, xb + pos, sizeof(int)); else size = 0; @@ -61,7 +62,7 @@ static int nval_used(const char *xb, int xb_size) memcpy(&size, xb + pos, sizeof(int)); while (size > 0 && (size < xb_size) && (pos + size < xb_size)) { pos += size; - if (pos < xb_size - sizeof(int)) + if (pos < xb_size - (int)sizeof(int)) memcpy(&size, xb + pos, sizeof(int)); else size = 0; @@ -146,6 +147,12 @@ int nval_get(const char *xb, int xb_size, const YCHAR * name, char *buf, pos++; size--; + /* If bsize is zero then this is a size query. + * Return the size, but don't copy. + */ + if (!bsize) + return size; + if (size <= bsize) { memcpy(buf, xb + pos, size); return size; @@ -166,7 +173,7 @@ int nval_list(const char *xb, int xb_size, char *buf, int bsize) int filled = 0; memcpy(&size, xb + pos, sizeof(int)); - while (size > sizeof(int) && + while (size > (int)sizeof(int) && size <= xb_size && (pos + size) < xb_size && !filled) { @@ -187,7 +194,7 @@ int nval_list(const char *xb, int xb_size, char *buf, int bsize) filled = 1; } pos += size; - if (pos < xb_size - sizeof(int)) + if (pos < xb_size - (int)sizeof(int)) memcpy(&size, xb + pos, sizeof(int)); else size = 0;