u64 invalid_flags; /** Set of execobj.flags that are invalid */
        u32 context_flags; /** Set of execobj.flags to insert from the ctx */
 
+       u64 batch_len; /** Length of batch within object */
        u32 batch_start_offset; /** Location within object of batch */
-       u32 batch_len; /** Length of batch within object */
        u32 batch_flags; /** Flags composed for emit_bb_start() */
        struct intel_gt_buffer_pool_node *batch_pool; /** pool node for batch buffer */
 
 
        if (eb->batch_len == 0)
                eb->batch_len = eb->batch->vma->size - eb->batch_start_offset;
+       if (unlikely(eb->batch_len == 0)) { /* impossible! */
+               drm_dbg(&i915->drm, "Invalid batch length\n");
+               return -EINVAL;
+       }
 
        return 0;
 
        struct drm_i915_private *i915 = eb->i915;
        struct intel_gt_buffer_pool_node *pool = eb->batch_pool;
        struct i915_vma *shadow, *trampoline, *batch;
-       unsigned int len;
+       unsigned long len;
        int err;
 
        if (!eb_use_cmdparser(eb)) {
        } else {
                len += I915_CMD_PARSER_TRAMPOLINE_SIZE;
        }
+       if (unlikely(len < eb->batch_len)) /* last paranoid check of overflow */
+               return -EINVAL;
 
        if (!pool) {
                pool = intel_gt_get_buffer_pool(eb->engine->gt, len);