1 /* Variable-sized buffer with on-stack default allocation. 2 Copyright (C) 2015-2023 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #ifndef _LIBC 20 # include <libc-config.h> 21 #endif 22 23 #include <scratch_buffer.h> 24 #include <errno.h> 25 26 bool 27 __libc_scratch_buffer_grow (struct scratch_buffer *buffer) 28 { 29 void *new_ptr; 30 size_t new_length = buffer->length * 2; 31 32 /* Discard old buffer. */ 33 scratch_buffer_free (buffer); 34 35 /* Check for overflow. */ 36 if (__glibc_likely (new_length >= buffer->length)) 37 new_ptr = malloc (new_length); 38 else 39 { 40 __set_errno (ENOMEM); 41 new_ptr = NULL; 42 } 43 44 if (__glibc_unlikely (new_ptr == NULL)) 45 { 46 /* Buffer must remain valid to free. */ 47 scratch_buffer_init (buffer); 48 return false; 49 } 50 51 /* Install new heap-based buffer. */ 52 buffer->data = new_ptr; 53 buffer->length = new_length; 54 return true; 55 } 56 libc_hidden_def (__libc_scratch_buffer_grow)