Skip to content

Commit 1b1728a

Browse files
committed
Fix string encodings.
Previously we used the Binary instance for Text to serialise the event name. This is wrong. We now first encode to UTF-8 and use this in the eventlog encoding.
1 parent e811ce7 commit 1b1728a

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

src/GHC/RTS/Events/Binary.hs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -916,8 +916,9 @@ putHeader (Header ets) = do
916916
putMarker EVENT_ET_BEGIN
917917
putType n
918918
putE $ fromMaybe 0xffff msz
919-
putE (fromIntegral $ T.length d :: EventTypeDescLen)
920-
putE d
919+
let d' = TE.encodeUtf8 d
920+
putE (fromIntegral $ B.length d' :: EventTypeDescLen)
921+
putByteString d'
921922
-- the event type header allows for extra data, which we don't use:
922923
putE (0 :: Word32)
923924
putMarker EVENT_ET_END
@@ -1136,9 +1137,10 @@ putEventSpec (WakeupThread t c) = do
11361137
putCap c
11371138

11381139
putEventSpec (ThreadLabel t l) = do
1139-
putE (fromIntegral (T.length l) + sz_tid :: Word16)
1140+
let l' = TE.encodeUtf8 l
1141+
putE (fromIntegral (B.length l') + sz_tid :: Word16)
11401142
putE t
1141-
putE l
1143+
putByteString l'
11421144

11431145
putEventSpec Shutdown =
11441146
return ()
@@ -1245,21 +1247,24 @@ putEventSpec (CapsetRemoveCap cs cp) = do
12451247
putCap cp
12461248

12471249
putEventSpec (RtsIdentifier cs rts) = do
1248-
putE (fromIntegral (T.length rts) + sz_capset :: Word16)
1250+
let rts' = TE.encodeUtf8 rts
1251+
putE (fromIntegral (B.length rts') + sz_capset :: Word16)
12491252
putE cs
1250-
putE rts
1253+
putByteString rts'
12511254

12521255
putEventSpec (ProgramArgs cs as) = do
1253-
let sz_args = sum $ map ((+ 1) {- for \0 -} . T.length) as
1256+
let as' = map TE.encodeUtf8 as
1257+
let sz_args = sum (map ((+ 1) {- for \0 -} . B.length) as') - 1
12541258
putE (fromIntegral sz_args + sz_capset :: Word16)
12551259
putE cs
1256-
mapM_ putE (intersperse "\0" as)
1260+
mapM_ putByteString (intersperse "\0" as')
12571261

12581262
putEventSpec (ProgramEnv cs es) = do
1259-
let sz_env = sum $ map ((+ 1) {- for \0 -} . T.length) es
1263+
let es' = map TE.encodeUtf8 es
1264+
let sz_env = sum (map ((+ 1) {- for \0 -} . B.length) es') - 1
12601265
putE (fromIntegral sz_env + sz_capset :: Word16)
12611266
putE cs
1262-
mapM_ putE $ intersperse "\0" es
1267+
mapM_ putByteString $ intersperse "\0" es'
12631268

12641269
putEventSpec (OsProcessPid cs pid) = do
12651270
putE cs
@@ -1275,16 +1280,19 @@ putEventSpec (WallClockTime cs sec nsec) = do
12751280
putE nsec
12761281

12771282
putEventSpec (Message s) = do
1278-
putE (fromIntegral (T.length s) :: Word16)
1279-
putE s
1283+
let s' = TE.encodeUtf8 s
1284+
putE (fromIntegral (B.length s') :: Word16)
1285+
putByteString s'
12801286

12811287
putEventSpec (UserMessage s) = do
1282-
putE (fromIntegral (T.length s) :: Word16)
1283-
putE s
1288+
let s' = TE.encodeUtf8 s
1289+
putE (fromIntegral (B.length s') :: Word16)
1290+
putByteString s'
12841291

12851292
putEventSpec (UserMarker s) = do
1286-
putE (fromIntegral (T.length s) :: Word16)
1287-
putE s
1293+
let s' = TE.encodeUtf8 s
1294+
putE (fromIntegral (B.length s') :: Word16)
1295+
putByteString s'
12881296

12891297
putEventSpec (UnknownEvent {}) = error "putEventSpec UnknownEvent"
12901298

@@ -1388,9 +1396,10 @@ putEventSpec MerCapSleeping = return ()
13881396
putEventSpec MerCallingMain = return ()
13891397

13901398
putEventSpec PerfName{..} = do
1391-
putE (fromIntegral (T.length name) + sz_perf_num :: Word16)
1399+
let name' = TE.encodeUtf8 name
1400+
putE (fromIntegral (B.length name') + sz_perf_num :: Word16)
13921401
putE perfNum
1393-
putE name
1402+
putByteString name'
13941403

13951404
putEventSpec PerfCounter{..} = do
13961405
putE perfNum

0 commit comments

Comments
 (0)