int ret;
ASSERT(this_cpu(hypfs_locked) == hypfs_write_locked);
- ASSERT(ulen <= leaf->e.max_size);
+
+ if ( ulen > leaf->e.max_size )
+ return -ENOSPC;
if ( leaf->e.type != XEN_HYPFS_TYPE_STRING &&
leaf->e.type != XEN_HYPFS_TYPE_BLOB && ulen != leaf->e.size )
ASSERT(this_cpu(hypfs_locked) == hypfs_write_locked);
+ /* Avoid oversized buffer allocation. */
+ if ( ulen > MAX_PARAM_SIZE )
+ return -ENOSPC;
+
buf = xzalloc_array(char, ulen);
if ( !buf )
return -ENOMEM;
ASSERT(entry->max_size);
- if ( ulen > entry->max_size )
- return -ENOSPC;
-
l = container_of(entry, struct hypfs_entry_leaf, e);
return entry->write(l, uaddr, ulen);
static int parse_params(const char *cmdline, const struct kernel_param *start,
const struct kernel_param *end)
{
- char opt[128], *optval, *optkey, *q;
+ char opt[MAX_PARAM_SIZE], *optval, *optkey, *q;
const char *p = cmdline, *key;
const struct kernel_param *param;
int rc, final_rc = 0;
} par;
};
+/* Maximum length of a single parameter string. */
+#define MAX_PARAM_SIZE 128
+
extern const struct kernel_param __setup_start[], __setup_end[];
#define __param(att) static const att \