diff options
Diffstat (limited to 'gl/malloca.c')
-rw-r--r-- | gl/malloca.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/gl/malloca.c b/gl/malloca.c index b4884234..183783a7 100644 --- a/gl/malloca.c +++ b/gl/malloca.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Safe automatic memory allocation. | 1 | /* Safe automatic memory allocation. |
2 | Copyright (C) 2003, 2006-2007, 2009-2021 Free Software Foundation, Inc. | 2 | Copyright (C) 2003, 2006-2007, 2009-2022 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2003, 2018. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2003, 2018. |
4 | 4 | ||
5 | This file is free software: you can redistribute it and/or modify | 5 | This file is free software: you can redistribute it and/or modify |
@@ -21,8 +21,9 @@ | |||
21 | /* Specification. */ | 21 | /* Specification. */ |
22 | #include "malloca.h" | 22 | #include "malloca.h" |
23 | 23 | ||
24 | #include <stdckdint.h> | ||
25 | |||
24 | #include "idx.h" | 26 | #include "idx.h" |
25 | #include "intprops.h" | ||
26 | #include "verify.h" | 27 | #include "verify.h" |
27 | 28 | ||
28 | /* The speed critical point in this file is freea() applied to an alloca() | 29 | /* The speed critical point in this file is freea() applied to an alloca() |
@@ -50,17 +51,16 @@ mmalloca (size_t n) | |||
50 | uintptr_t alignment2_mask = 2 * sa_alignment_max - 1; | 51 | uintptr_t alignment2_mask = 2 * sa_alignment_max - 1; |
51 | int plus = sizeof (small_t) + alignment2_mask; | 52 | int plus = sizeof (small_t) + alignment2_mask; |
52 | idx_t nplus; | 53 | idx_t nplus; |
53 | if (!INT_ADD_WRAPV (n, plus, &nplus) && !xalloc_oversized (nplus, 1)) | 54 | if (!ckd_add (&nplus, n, plus) && !xalloc_oversized (nplus, 1)) |
54 | { | 55 | { |
55 | char *mem = (char *) malloc (nplus); | 56 | char *mem = (char *) malloc (nplus); |
56 | 57 | ||
57 | if (mem != NULL) | 58 | if (mem != NULL) |
58 | { | 59 | { |
59 | uintptr_t umem = (uintptr_t)mem, umemplus; | 60 | uintptr_t umem = (uintptr_t)mem, umemplus; |
60 | /* The INT_ADD_WRAPV avoids signed integer overflow on | 61 | /* The ckd_add avoids signed integer overflow on |
61 | theoretical platforms where UINTPTR_MAX <= INT_MAX. */ | 62 | theoretical platforms where UINTPTR_MAX <= INT_MAX. */ |
62 | INT_ADD_WRAPV (umem, sizeof (small_t) + sa_alignment_max - 1, | 63 | ckd_add (&umemplus, umem, sizeof (small_t) + sa_alignment_max - 1); |
63 | &umemplus); | ||
64 | idx_t offset = ((umemplus & ~alignment2_mask) | 64 | idx_t offset = ((umemplus & ~alignment2_mask) |
65 | + sa_alignment_max - umem); | 65 | + sa_alignment_max - umem); |
66 | void *vp = mem + offset; | 66 | void *vp = mem + offset; |