diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 9263287aafea301976ae8db0aec00196de9221a0..179a6c122718d9528f6acbcbd3388a8ade50ca42 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -641,10 +641,10 @@ def _norm_shape_dtype(shape, dtype, order="C", strides=None, name=""):
         except:
             shape = (shape,)
     if strides is None:
-        if order == "cC":
-            strides = c_contigous_strides(byte_size, shape)
-        elif order == "cF":
-            strides = f_contigous_strides(byte_size, shape)
+        if order in "cC":
+            strides = c_contiguous_strides(dtype.itemsize, shape)
+        elif order in "fF":
+            strides = f_contiguous_strides(dtype.itemsize, shape)
         else:
             raise RuntimeError("unrecognized order specifier %s" % order,
                                status_code.INVALID_VALUE, name)
@@ -671,7 +671,8 @@ class MemoryObjectHolder(_Common):
             shape, dtype, order, None, 'MemoryObjectHolder.get_host_array')
         _hostptr = _ffi.new('void**')
         _size = _ffi.new('size_t*')
-        _handle_error(memory_object__get_host_array(self.ptr, _hostptr, _size))
+        _handle_error(_lib.memory_object__get_host_array(self.ptr, _hostptr,
+                                                         _size))
         ary = cffi_array(_ffi.buffer(_hostptr[0], _size[0]), shape,
                          dtype, strides, self)
         if ary.nbytes > _size[0]:
diff --git a/src/c_wrapper/memory_object.cpp b/src/c_wrapper/memory_object.cpp
index 4670a4a5adb5abf5b0a1162de7cb090cf8918bcd..72e442f46a854e64d0405e984b487d24a6bb189d 100644
--- a/src/c_wrapper/memory_object.cpp
+++ b/src/c_wrapper/memory_object.cpp
@@ -84,6 +84,13 @@ memory_object__get_host_array(clobj_t _obj, void **hostptr, size_t *size)
 {
     auto obj = static_cast<memory_object*>(_obj);
     return c_handle_error([&] {
+            cl_mem_flags flags;
+            pyopencl_call_guarded(clGetMemObjectInfo, obj, CL_MEM_FLAGS,
+                                  size_arg(flags), nullptr);
+            if (!(flags & CL_MEM_USE_HOST_PTR))
+                throw clerror("MemoryObject.get_host_array", CL_INVALID_VALUE,
+                              "Only MemoryObject with USE_HOST_PTR "
+                              "is supported.");
             pyopencl_call_guarded(clGetMemObjectInfo, obj, CL_MEM_HOST_PTR,
                                   size_arg(*hostptr), nullptr);
             pyopencl_call_guarded(clGetMemObjectInfo, obj, CL_MEM_SIZE,