on master help sign in
Make the length check on unsafeNew mandatory

This prevents a segfault (found by Ian Lynagh) if an integer overflow occurs. --HG-- extra : convert_revision : b2e8aab08795719e92aae16689798fdfadd66547

commit75fa7606f447a55ee423a6a67a2f664bfd6028f8 authorBryan O'Sullivan <bos@serpentine.com> dateMon 13 Sep 2010, 00:09 (16 years ago) parent17f009c
1 file changed+8−14
Data/Text/Array.hs+8−14
Data/Text/Array.hs+8−14
@@ -102,22 +102,16 @@ instance IArray (MArray s) where
102102
103103-- | Create an uninitialized mutable array.
104104unsafeNew :: forall s. Int -> ST s (MArray s)
105−unsafeNew n =
105+unsafeNew n
106+ | len < 0 = error $ "Data.Text.Array.unsafeNew: invalid length " ++ show n
107+ | otherwise = ST $ \s1# ->
108+ case newByteArray# len# s1# of
109+ (# s2#, marr# #) -> (# s2#, MArray marr#
106110#if defined(ASSERTS)
107− assert (n >= 0) .
111+ n
108112#endif
109− ST $ \s1# ->
110− case bytesInArray n of
111− len@(I# len#) ->
112−#if defined(ASSERTS)
113− if len < 0 then error (show ("unsafeNew",len)) else
114−#endif
115− case newByteArray# len# s1# of
116− (# s2#, marr# #) -> (# s2#, MArray marr#
117−#if defined(ASSERTS)
118− n
119−#endif
120− #)
113+ #)
114+ where !len@(I# len#) = bytesInArray n
121115{-# INLINE unsafeNew #-}
122116
123117-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!