From patchwork Sun Mar 1 14:28:11 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 5408 Received: (qmail 116142 invoked by alias); 2 Mar 2015 09:27:43 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 116094 invoked by uid 89); 2 Mar 2015 09:27:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL, BAYES_50, DATE_IN_PAST_12_24, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Message-Id: <7a6fe503fb764beee3d5b89662d3bbf65242161c.1425285061.git.fweimer@redhat.com> In-Reply-To: References: From: Florian Weimer Date: Sun, 1 Mar 2015 15:28:11 +0100 Subject: [PATCH 06/25] Add struct scratch_buffer and its internal helper functions To: libc-alpha@sourceware.org These will be used from NSS modules, so they have to be exported. --- include/scratch_buffer.h | 133 ++++++++++++++++++ malloc/Makefile | 6 +- malloc/Versions | 5 + malloc/scratch_buffer_grow.c | 52 +++++++ malloc/scratch_buffer_grow_preserve.c | 65 +++++++++ malloc/scratch_buffer_set_array_size.c | 61 ++++++++ malloc/tst-scratch_buffer.c | 155 +++++++++++++++++++++ sysdeps/unix/sysv/linux/aarch64/libc.abilist | 5 + sysdeps/unix/sysv/linux/alpha/libc.abilist | 5 + sysdeps/unix/sysv/linux/arm/libc.abilist | 5 + sysdeps/unix/sysv/linux/hppa/libc.abilist | 5 + sysdeps/unix/sysv/linux/i386/libc.abilist | 5 + sysdeps/unix/sysv/linux/ia64/libc.abilist | 5 + sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist | 5 + sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist | 5 + sysdeps/unix/sysv/linux/microblaze/libc.abilist | 5 + .../unix/sysv/linux/mips/mips32/fpu/libc.abilist | 5 + .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist | 5 + .../unix/sysv/linux/mips/mips64/n32/libc.abilist | 5 + .../unix/sysv/linux/mips/mips64/n64/libc.abilist | 5 + sysdeps/unix/sysv/linux/nios2/libc.abilist | 5 + .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist | 5 + .../linux/powerpc/powerpc32/nofpu/libc.abilist | 5 + .../unix/sysv/linux/powerpc/powerpc64/libc.abilist | 5 + sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist | 5 + sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist | 5 + sysdeps/unix/sysv/linux/sh/libc.abilist | 5 + sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist | 5 + sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist | 5 + .../sysv/linux/tile/tilegx/tilegx32/libc.abilist | 5 + .../sysv/linux/tile/tilegx/tilegx64/libc.abilist | 5 + sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist | 5 + sysdeps/unix/sysv/linux/x86_64/64/libc.abilist | 5 + sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist | 5 + 34 files changed, 610 insertions(+), 2 deletions(-) create mode 100644 include/scratch_buffer.h create mode 100644 malloc/scratch_buffer_grow.c create mode 100644 malloc/scratch_buffer_grow_preserve.c create mode 100644 malloc/scratch_buffer_set_array_size.c create mode 100644 malloc/tst-scratch_buffer.c diff --git a/include/scratch_buffer.h b/include/scratch_buffer.h new file mode 100644 index 0000000..57117b6 --- /dev/null +++ b/include/scratch_buffer.h @@ -0,0 +1,133 @@ +/* Variable-sized buffer with on-stack default allocation. + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#pragma once + +/* Scratch buffers with a default stack allocation and fallback to + heap allocation. It is expected that this function is used in this + way: + + struct scratch_buffer tmpbuf; + scratch_buffer_init (&tmpbuf); + + while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length)) + if (!scratch_buffer_grow (&tmpbuf)) + return -1; + + scratch_buffer_free (&tmpbuf); + return 0; + + The allocation functions (scratch_buffer_grow, + scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make + sure that the heap allocation, if any, is freed, so that the code + above does not have a memory leak. The buffer still remains in a + state that can be deallocated using scratch_buffer_free, so a loop + like this is valid as well: + + struct scratch_buffer tmpbuf; + scratch_buffer_init (&tmpbuf); + + while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length)) + if (!scratch_buffer_grow (&tmpbuf)) + break; + + scratch_buffer_free (&tmpbuf); + + The non-inlined functions are implemented in such a way that it is + possible to change the size of the pre-allocated buffer without + impacting ABI. +*/ + +#include +#include + +#define SCRATCH_BUFFER_ALIGNMENT \ + __attribute__ ((aligned (__alignof__ (union {void *p; double d;})))) + +/* Scratch buffer. Must be initialized with scratch_buffer_init + before its use. */ +struct scratch_buffer { + void *data; /* Pointer to the beginning of the scratch area. */ + size_t length; /* Allocated space at the data pointer, in bytes. */ + char __space[1024 - sizeof (size_t)] SCRATCH_BUFFER_ALIGNMENT; +} SCRATCH_BUFFER_ALIGNMENT; + +/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space + and BUFFER->length reflects the available space. */ +static inline void +scratch_buffer_init (struct scratch_buffer *buffer) + __attribute__ ((always_inline)); +static inline void +scratch_buffer_init (struct scratch_buffer *buffer) +{ + buffer->data = buffer->__space; + buffer->length = sizeof (buffer->__space); +} + +/* Deallocates *BUFFER (if it was heap-allocated). */ +static inline void +scratch_buffer_free (struct scratch_buffer *buffer) +{ + if (buffer->data != buffer->__space) + free (buffer->data); +} + +/* Grows *BUFFER by some arbitrary amount. The buffer contents is NOT + preserved. Returns true on success, fails on allocation failure + (in which case the old buffer is freed). On success, the new + buffer is slightly larger (by at least 16 bytes) than the previous + size. On failure, *BUFFER is deallocated, but remains in a + free-able state. */ +bool __libc_scratch_buffer_grow (struct scratch_buffer *buffer); +libc_hidden_proto (__libc_scratch_buffer_grow) + +/* Alias for __libc_scratch_buffer_grow. */ +static inline bool +scratch_buffer_grow (struct scratch_buffer *buffer) +{ + return __glibc_likely (__libc_scratch_buffer_grow (buffer)); +} + +/* Like __libc_scratch_buffer_grow, but preserves the old buffer + contents on success, as a prefix of the new buffer. */ +bool __libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer); +libc_hidden_proto (__libc_scratch_buffer_grow_preserve) + +/* Alias for __libc_scratch_buffer_grow_preserve. */ +static inline bool +scratch_buffer_grow_preserve (struct scratch_buffer *buffer) +{ + return __glibc_likely (__libc_scratch_buffer_grow_preserve (buffer)); +} + +/* Grows *BUFFER so that it can store at least NELEM elemnts of SIZE + bytes. The buffer contents is NOT preserved. Returns true on + success, fails on allocation failure (in which case the old buffer + is freed, but *BUFFER remains a free-able state). */ +bool __libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer, + size_t nelem, size_t size); +libc_hidden_proto (__libc_scratch_buffer_set_array_size) + +/* Alias for __libc_scratch_set_array_size. */ +static inline bool +scratch_buffer_set_array_size (struct scratch_buffer *buffer, + size_t nelem, size_t size) +{ + return __glibc_likely (__libc_scratch_buffer_set_array_size + (buffer, nelem, size)); +} diff --git a/malloc/Makefile b/malloc/Makefile index 5f68a79..9e7112a 100644 --- a/malloc/Makefile +++ b/malloc/Makefile @@ -27,10 +27,12 @@ headers := $(dist-headers) obstack.h mcheck.h tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 \ tst-malloc-usable tst-realloc tst-posix_memalign \ - tst-pvalloc tst-memalign tst-mallopt + tst-pvalloc tst-memalign tst-mallopt tst-scratch_buffer test-srcs = tst-mtrace -routines = malloc morecore mcheck mtrace obstack +routines = malloc morecore mcheck mtrace obstack \ + scratch_buffer_grow scratch_buffer_grow_preserve \ + scratch_buffer_set_array_size install-lib := libmcheck.a non-lib.a := libmcheck.a diff --git a/malloc/Versions b/malloc/Versions index 7ca9bdf..a88dbe6 100644 --- a/malloc/Versions +++ b/malloc/Versions @@ -61,6 +61,11 @@ libc { GLIBC_2.16 { aligned_alloc; } + GLIBC_2.22 { + __libc_scratch_buffer_grow; + __libc_scratch_buffer_grow_preserve; + __libc_scratch_buffer_set_array_size; + } GLIBC_PRIVATE { # Internal startup hook for libpthread. __libc_malloc_pthread_startup; diff --git a/malloc/scratch_buffer_grow.c b/malloc/scratch_buffer_grow.c new file mode 100644 index 0000000..6621393 --- /dev/null +++ b/malloc/scratch_buffer_grow.c @@ -0,0 +1,52 @@ +/* Variable-sized buffer with on-stack default allocation. + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +bool +__libc_scratch_buffer_grow (struct scratch_buffer *buffer) +{ + size_t new_length = buffer->length * 2; + + /* Discard old buffer. */ + scratch_buffer_free (buffer); + + /* Check for overflow. */ + if (__glibc_unlikely (new_length < buffer->length)) + { + /* Buffer must remain valid to free. */ + scratch_buffer_init (buffer); + __set_errno (ENOMEM); + return false; + } + + void *new_ptr = malloc (new_length); + if (new_ptr == NULL) + { + /* Buffer must remain valid to free. */ + scratch_buffer_init (buffer); + return false; + } + + /* Install new heap-based buffer. */ + buffer->data = new_ptr; + buffer->length = new_length; + return true; +} +libc_hidden_def (__libc_scratch_buffer_grow); diff --git a/malloc/scratch_buffer_grow_preserve.c b/malloc/scratch_buffer_grow_preserve.c new file mode 100644 index 0000000..3abbd56 --- /dev/null +++ b/malloc/scratch_buffer_grow_preserve.c @@ -0,0 +1,65 @@ +/* Variable-sized buffer with on-stack default allocation. + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +bool +__libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer) +{ + size_t new_length = 2 * buffer->length; + void *new_ptr; + + if (buffer->data == buffer->__space) + { + /* Move buffer to the heap. No overflow is possible because + buffer->length describes a small buffer on the stack. We use + buffer->length instead of sizeof (buffer->__space) to avoid + making the size of struct scratch_buffer part of the ABI. */ + new_ptr = malloc (new_length); + if (new_ptr == NULL) + return false; + memcpy (new_ptr, buffer->__space, buffer->length); + } + else + { + /* Buffer was already on the heap. Check for overflow. */ + if (__glibc_unlikely (new_length < buffer->length)) + { + /* Deallocate, but buffer must remain valid to free. */ + free (buffer->data); + scratch_buffer_init (buffer); + __set_errno (ENOMEM); + return false; + } + new_ptr = realloc (buffer->data, new_length); + if (new_ptr == NULL) + { + /* Deallocate, but buffer must remain valid to free. */ + free (buffer->data); + scratch_buffer_init (buffer); + return false; + } + } + + /* Install new heap-based buffer. */ + buffer->data = new_ptr; + buffer->length = new_length; + return true; +} +libc_hidden_def (__libc_scratch_buffer_grow_preserve); diff --git a/malloc/scratch_buffer_set_array_size.c b/malloc/scratch_buffer_set_array_size.c new file mode 100644 index 0000000..7786baf --- /dev/null +++ b/malloc/scratch_buffer_set_array_size.c @@ -0,0 +1,61 @@ +/* Variable-sized buffer with on-stack default allocation. + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +bool +__libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer, + size_t nelem, size_t size) +{ + size_t size_max_square_root = ((size_t)1) << (sizeof (size_t) * 4); + /* Avoid overflow check if both values are small. */ + if (nelem >= size_max_square_root || size >= size_max_square_root) + { + if (nelem != 0 && size > SIZE_MAX / nelem) + { + /* Discard the old buffer, but it must remain valid to + free. */ + scratch_buffer_free (buffer); + scratch_buffer_init (buffer); + __set_errno (ENOMEM); + return false; + } + } + + size_t new_length = nelem * size; + if (new_length <= buffer->length) + return true; + + /* Discard old buffer. */ + scratch_buffer_free (buffer); + + char *new_ptr = malloc (new_length); + if (new_ptr == NULL) + { + /* Buffer must remain valid to free. */ + scratch_buffer_init (buffer); + return false; + } + + /* Install new heap-based buffer. */ + buffer->data = new_ptr; + buffer->length = new_length; + return true; +} +libc_hidden_def (__libc_scratch_buffer_set_array_size); diff --git a/malloc/tst-scratch_buffer.c b/malloc/tst-scratch_buffer.c new file mode 100644 index 0000000..dcae512 --- /dev/null +++ b/malloc/tst-scratch_buffer.c @@ -0,0 +1,155 @@ +/* + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include + +static bool +unchanged_array_size (struct scratch_buffer *buf, size_t a, size_t b) +{ + size_t old_length = buf->length; + if (!scratch_buffer_set_array_size (buf, a, b)) + { + printf ("scratch_buffer_set_array_size failed: %zu %zu\n", + a, b); + return false; + } + if (old_length != buf->length) + { + printf ("scratch_buffer_set_array_size did not preserve size: %zu %zu\n", + a, b); + return false; + } + return true; +} + +static bool +array_size_must_fail (size_t a, size_t b) +{ + for (int pass = 0; pass < 2; ++pass) + { + struct scratch_buffer buf; + scratch_buffer_init (&buf); + if (pass > 0) + if (!scratch_buffer_grow (&buf)) + { + printf ("scratch_buffer_grow in array_size_must_fail failed\n"); + return false; + } + if (scratch_buffer_set_array_size (&buf, a, b)) + { + printf ("scratch_buffer_set_array_size passed: %d %zu %zu\n", + pass, a, b); + return false; + } + if (buf.data != buf.__space) + { + printf ("scratch_buffer_set_array_size did not free: %d %zu %zu\n", + pass, a, b); + return false; + } + } + return true; +} + +static int +do_test (void) +{ + { + struct scratch_buffer buf; + scratch_buffer_init (&buf); + memset (buf.data, ' ', buf.length); + scratch_buffer_free (&buf); + } + { + struct scratch_buffer buf; + scratch_buffer_init (&buf); + memset (buf.data, ' ', buf.length); + size_t old_length = buf.length; + scratch_buffer_grow (&buf); + if (buf.length <= old_length) + { + printf ("scratch_buffer_grow did not enlarge buffer\n"); + return 1; + } + memset (buf.data, ' ', buf.length); + scratch_buffer_free (&buf); + } + { + struct scratch_buffer buf; + scratch_buffer_init (&buf); + memset (buf.data, '@', buf.length); + strcpy (buf.data, "prefix"); + size_t old_length = buf.length; + scratch_buffer_grow_preserve (&buf); + if (buf.length <= old_length) + { + printf ("scratch_buffer_grow_preserve did not enlarge buffer\n"); + return 1; + } + if (strcmp (buf.data, "prefix") != 0) + { + printf ("scratch_buffer_grow_preserve did not copy buffer\n"); + return 1; + } + for (unsigned i = 7; i < old_length; ++i) + if (((char *)buf.data)[i] != '@') + { + printf ("scratch_buffer_grow_preserve did not copy buffer (%u)\n", + i); + return 1; + } + scratch_buffer_free (&buf); + } + { + struct scratch_buffer buf; + scratch_buffer_init (&buf); + for (int pass = 0; pass < 4; ++pass) + { + if (!(unchanged_array_size (&buf, 0, 0) + && unchanged_array_size (&buf, 1, 0) + && unchanged_array_size (&buf, 0, 1) + && unchanged_array_size (&buf, -1, 0) + && unchanged_array_size (&buf, 0, -1) + && unchanged_array_size (&buf, 1ULL << 16, 0) + && unchanged_array_size (&buf, 0, 1ULL << 16) + && unchanged_array_size (&buf, 1ULL << 32, 0) + && unchanged_array_size (&buf, 0, 1ULL << 32))) + return 1; + if (!scratch_buffer_grow (&buf)) + { + printf ("scratch_buffer_grow_failed (pass %d)\n", pass); + } + } + scratch_buffer_free (&buf); + } + { + if (!(array_size_must_fail (-1, 1) + && array_size_must_fail (-1, -1) + && array_size_must_fail (1, -1) + && array_size_must_fail (((size_t)-1) / 4, 4) + && array_size_must_fail (4, ((size_t)-1) / 4))) + return 1; + } + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist index aeee312..c997185 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist @@ -2081,3 +2081,8 @@ GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F _mcount F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist index 980e088..ece9220 100644 --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist @@ -2012,6 +2012,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist index ce45208..aee7e03 100644 --- a/sysdeps/unix/sysv/linux/arm/libc.abilist +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist @@ -89,6 +89,11 @@ GLIBC_2.17 GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.4 GLIBC_2.4 A _Exit F diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist index 58407fc..fbc040e 100644 --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist @@ -1860,6 +1860,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist index 3cb314d..98f97e1 100644 --- a/sysdeps/unix/sysv/linux/i386/libc.abilist +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist @@ -2023,6 +2023,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist index 067552d..ceb4cd4 100644 --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist @@ -1881,6 +1881,11 @@ GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F getunwind F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist index f06cc8e..cb36531 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist @@ -90,6 +90,11 @@ GLIBC_2.17 GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.4 GLIBC_2.4 A _Exit F diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist index 9010ea7..314bd55 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist @@ -1979,6 +1979,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist index 6e8d993..1cd28be 100644 --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist @@ -2080,3 +2080,8 @@ GLIBC_2.18 xencrypt F xprt_register F xprt_unregister F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist index 1c3490c..a40707e 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist @@ -1951,6 +1951,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist index d8fd823..bf0d583 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist @@ -1949,6 +1949,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist index 3e6ed35..1faf5ce 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist @@ -1947,6 +1947,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist index c7e46aa..4394069 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist @@ -1941,6 +1941,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist index 0703418..77ea7a9 100644 --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist @@ -2121,3 +2121,8 @@ GLIBC_2.21 xencrypt F xprt_register F xprt_unregister F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist index f27b48b..8eba8ff 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist @@ -1983,6 +1983,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist index a54382e..c7df1e0 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist @@ -1989,6 +1989,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist index 195b587..f7c5188 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist @@ -90,6 +90,11 @@ GLIBC_2.17 GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A _Exit F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist index 0194f0b..3ca48ce 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist @@ -1984,6 +1984,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist index 807f702..23951bb 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist @@ -1880,6 +1880,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist index a653292..47eaa7b 100644 --- a/sysdeps/unix/sysv/linux/sh/libc.abilist +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist @@ -1864,6 +1864,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist index 9defbdf..09cb658 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist @@ -1975,6 +1975,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist index 35987fa..ea21091 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist @@ -1908,6 +1908,11 @@ GLIBC_2.2.4 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist index caf74b8..069595f 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist @@ -2091,3 +2091,8 @@ GLIBC_2.17 GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist index 68d975b..c1343b8 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist @@ -2091,3 +2091,8 @@ GLIBC_2.17 GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist index caf74b8..069595f 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist @@ -2091,3 +2091,8 @@ GLIBC_2.17 GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist index 914b590..2c15f91 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist @@ -1854,6 +1854,11 @@ GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.2.6 A __nanosleep F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist index 0f64c8d..7c9c5dc 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist @@ -2089,3 +2089,8 @@ GLIBC_2.17 GLIBC_2.18 GLIBC_2.18 A __cxa_thread_atexit_impl F +GLIBC_2.22 + GLIBC_2.22 A + __libc_scratch_buffer_grow F + __libc_scratch_buffer_grow_preserve F + __libc_scratch_buffer_set_array_size F