on master help sign in
Fix buffer overflow and 64-bit int toStr truncation
d73f9bdBenjamin Saunders
llvm/defs.c+1−1
@@ -47,7 +47,7 @@ unsigned long long mpz_get_ull(mpz_t n)
47
47
48char *__idris_strCons(char c, char *s) {
48char *__idris_strCons(char c, char *s) {
49 size_t len = strlen(s);
49 size_t len = strlen(s);
50− char *result = GC_malloc_atomic(len);
50+ char *result = GC_malloc_atomic(len+2);
51 result[0] = c;
51 result[0] = c;
52 memcpy(result+1, s, len);
52 memcpy(result+1, s, len);
53 result[len+1] = 0;
53 result[len+1] = 0;
src/IRTS/CodegenLLVM.hs+2−2
@@ -118,10 +118,10 @@ initDefs tgt =
118 }
118 }
119 , rtsFun "intStr" ptrI8 [IntegerType 64]
119 , rtsFun "intStr" ptrI8 [IntegerType 64]
120 [ BasicBlock (UnName 0)
120 [ BasicBlock (UnName 0)
121− [ UnName 1 := simpleCall "GC_malloc_atomic" [ConstantOperand (C.Int (fromInteger $ tgtWordSize tgt) 12)]
121+ [ UnName 1 := simpleCall "GC_malloc_atomic" [ConstantOperand (C.Int (fromInteger $ tgtWordSize tgt) 21)]
122 , UnName 2 := simpleCall "snprintf"
122 , UnName 2 := simpleCall "snprintf"
123 [ LocalReference (UnName 1)
123 [ LocalReference (UnName 1)
124− , ConstantOperand (C.Int (fromInteger $ tgtWordSize tgt) 12)
124+ , ConstantOperand (C.Int (fromInteger $ tgtWordSize tgt) 21)
125 , ConstantOperand $ C.GetElementPtr True (C.GlobalReference . Name $ "__idris_intFmtStr") [C.Int 32 0, C.Int 32 0]
125 , ConstantOperand $ C.GetElementPtr True (C.GlobalReference . Name $ "__idris_intFmtStr") [C.Int 32 0, C.Int 32 0]
126 , LocalReference (UnName 0)
126 , LocalReference (UnName 0)
127 ]
127 ]