mkDataの戻り値が>=0の場合はデータの個数と仮定するとこんな感じで良いんじゃないかと思う。

import Foreign.Ptr
import Foreign.C.Types
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Storable

foreign import ccall "mkData" mkData :: Ptr (Ptr CInt) -> IO CInt

makeData :: IO (Maybe [CInt])
makeData = alloca $ \ a -> do { num <- mkData a; if num < 0 then return Nothing else (peek a >>= peekArray (fromIntegral num) >>= return . Just) }