The unpac monorepo manager self-hosting as a monorepo using unpac
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix off-by-one errors in Weak.get_copy and Weak.blit (#1835)

authored by

KC Sivaramakrishnan and committed by
Damien Doligez
314cb28e 9702af72

+26 -23
+3
Changes
··· 707 707 (Xavier Clerc, report by Christophe Troestler, review by Nicolás Ojeda Bär 708 708 and Gabriel Scherer) 709 709 710 + - GPR#1835: Fix off-by-one errors in Weak.get_copy and Weak.blit 711 + (KC Sivaramakrishnan) 712 + 710 713 OCaml 4.06.1 (16 Feb 2018): 711 714 --------------------------- 712 715
+23 -23
byterun/weak.c
··· 68 68 mlsize_t size, i; 69 69 value res; 70 70 71 - size = Long_val (len) + 1 /* weak_list */ + 1 /* the value */; 72 - if (size < 2 || size > Max_wosize) caml_invalid_argument ("Weak.create"); 71 + size = Long_val (len) + CAML_EPHE_FIRST_KEY; 72 + if (size < CAML_EPHE_FIRST_KEY || size > Max_wosize) 73 + caml_invalid_argument ("Weak.create"); 73 74 res = caml_alloc_shr (size, Abstract_tag); 74 75 for (i = 1; i < size; i++) Field (res, i) = caml_ephe_none; 75 76 Field (res, CAML_EPHE_LINK_OFFSET) = caml_ephe_list_head; ··· 119 120 that is going to disappear is dead and so should trigger a cleaning 120 121 */ 121 122 static void do_check_key_clean(value ar, mlsize_t offset){ 122 - CAMLassert ( offset >= 2); 123 + CAMLassert (offset >= CAML_EPHE_FIRST_KEY); 123 124 if (caml_gc_phase == Phase_clean){ 124 125 value elt = Field (ar, offset); 125 126 if (elt != caml_ephe_none && Is_Dead_during_clean(elt)){ ··· 161 162 162 163 CAMLprim value caml_ephe_set_key (value ar, value n, value el) 163 164 { 164 - mlsize_t offset = Long_val (n) + 2; 165 + mlsize_t offset = Long_val (n) + CAML_EPHE_FIRST_KEY; 165 166 CAMLassert (Is_in_heap (ar)); 166 - if (offset < 2 || offset >= Wosize_val (ar)){ 167 + if (offset < CAML_EPHE_FIRST_KEY || offset >= Wosize_val (ar)){ 167 168 caml_invalid_argument ("Weak.set"); 168 169 } 169 170 do_check_key_clean(ar,offset); ··· 173 174 174 175 CAMLprim value caml_ephe_unset_key (value ar, value n) 175 176 { 176 - mlsize_t offset = Long_val (n) + 2; 177 + mlsize_t offset = Long_val (n) + CAML_EPHE_FIRST_KEY; 177 178 CAMLassert (Is_in_heap (ar)); 178 - if (offset < 2 || offset >= Wosize_val (ar)){ 179 + if (offset < CAML_EPHE_FIRST_KEY || offset >= Wosize_val (ar)){ 179 180 caml_invalid_argument ("Weak.set"); 180 181 } 181 182 do_check_key_clean(ar,offset); ··· 185 186 186 187 value caml_ephe_set_key_option (value ar, value n, value el) 187 188 { 188 - mlsize_t offset = Long_val (n) + 2; 189 + mlsize_t offset = Long_val (n) + CAML_EPHE_FIRST_KEY; 189 190 CAMLassert (Is_in_heap (ar)); 190 - if (offset < 2 || offset >= Wosize_val (ar)){ 191 + if (offset < CAML_EPHE_FIRST_KEY || offset >= Wosize_val (ar)){ 191 192 caml_invalid_argument ("Weak.set"); 192 193 } 193 194 do_check_key_clean(ar,offset); ··· 212 213 cleaned we always need to check it. */ 213 214 caml_ephe_clean(ar); 214 215 }; 215 - do_set (ar, 1, el); 216 + do_set (ar, CAML_EPHE_DATA_OFFSET, el); 216 217 return Val_unit; 217 218 } 218 219 ··· 226 227 CAMLprim value caml_ephe_get_key (value ar, value n) 227 228 { 228 229 CAMLparam2 (ar, n); 229 - mlsize_t offset = Long_val (n) + 2; 230 + mlsize_t offset = Long_val (n) + CAML_EPHE_FIRST_KEY; 230 231 CAMLlocal2 (res, elt); 231 232 CAMLassert (Is_in_heap (ar)); 232 - if (offset < 2 || offset >= Wosize_val (ar)){ 233 + if (offset < CAML_EPHE_FIRST_KEY || offset >= Wosize_val (ar)){ 233 234 caml_invalid_argument ("Weak.get_key"); 234 235 } 235 236 if (is_ephe_key_none(ar, offset)){ ··· 252 253 CAMLprim value caml_ephe_get_data (value ar) 253 254 { 254 255 CAMLparam1 (ar); 255 - mlsize_t offset = 1; 256 256 CAMLlocal2 (res, elt); 257 257 CAMLassert (Is_in_heap (ar)); 258 - elt = Field (ar, offset); 258 + elt = Field (ar, CAML_EPHE_DATA_OFFSET); 259 259 if(caml_gc_phase == Phase_clean) caml_ephe_clean(ar); 260 260 if (elt == caml_ephe_none){ 261 261 res = None_val; ··· 272 272 CAMLprim value caml_ephe_get_key_copy (value ar, value n) 273 273 { 274 274 CAMLparam2 (ar, n); 275 - mlsize_t offset = Long_val (n) + 2; 275 + mlsize_t offset = Long_val (n) + CAML_EPHE_FIRST_KEY; 276 276 CAMLlocal2 (res, elt); 277 277 value v; /* Caution: this is NOT a local root. */ 278 278 CAMLassert (Is_in_heap (ar)); 279 - if (offset < 1 || offset >= Wosize_val (ar)){ 279 + if (offset < CAML_EPHE_FIRST_KEY || offset >= Wosize_val (ar)){ 280 280 caml_invalid_argument ("Weak.get_copy"); 281 281 } 282 282 ··· 319 319 CAMLprim value caml_ephe_get_data_copy (value ar) 320 320 { 321 321 CAMLparam1 (ar); 322 - mlsize_t offset = 1; 322 + mlsize_t offset = CAML_EPHE_DATA_OFFSET; 323 323 CAMLlocal2 (res, elt); 324 324 value v; /* Caution: this is NOT a local root. */ 325 325 CAMLassert (Is_in_heap (ar)); ··· 360 360 361 361 CAMLprim value caml_ephe_check_key (value ar, value n) 362 362 { 363 - mlsize_t offset = Long_val (n) + 2; 363 + mlsize_t offset = Long_val (n) + CAML_EPHE_FIRST_KEY; 364 364 CAMLassert (Is_in_heap (ar)); 365 - if (offset < 2 || offset >= Wosize_val (ar)){ 365 + if (offset < CAML_EPHE_FIRST_KEY || offset >= Wosize_val (ar)){ 366 366 caml_invalid_argument ("Weak.check"); 367 367 } 368 368 return Val_bool (!is_ephe_key_none(ar, offset)); ··· 382 382 CAMLprim value caml_ephe_blit_key (value ars, value ofs, 383 383 value ard, value ofd, value len) 384 384 { 385 - mlsize_t offset_s = Long_val (ofs) + 2; 386 - mlsize_t offset_d = Long_val (ofd) + 2; 385 + mlsize_t offset_s = Long_val (ofs) + CAML_EPHE_FIRST_KEY; 386 + mlsize_t offset_d = Long_val (ofd) + CAML_EPHE_FIRST_KEY; 387 387 mlsize_t length = Long_val (len); 388 388 long i; 389 389 CAMLassert (Is_in_heap (ars)); 390 390 CAMLassert (Is_in_heap (ard)); 391 - if (offset_s < 1 || offset_s + length > Wosize_val (ars)){ 391 + if (offset_s < CAML_EPHE_FIRST_KEY || offset_s + length > Wosize_val (ars)){ 392 392 caml_invalid_argument ("Weak.blit"); 393 393 } 394 - if (offset_d < 1 || offset_d + length > Wosize_val (ard)){ 394 + if (offset_d < CAML_EPHE_FIRST_KEY || offset_d + length > Wosize_val (ard)){ 395 395 caml_invalid_argument ("Weak.blit"); 396 396 } 397 397 if (caml_gc_phase == Phase_clean){