mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-23 10:29:58 +01:00
99972bd6e9
* g10/getkey.c (get_user_id): Do not call xmalloc with 0. * common/xmalloc.c (xmalloc, xcalloc): Take extra precaution not to pass 0 to the arguments. -- The problem did not occur in 1.x because over there the xmalloc makes sure to allocate at least one byte. With 2.x for most calls the xmalloc of Libgcrypt is used and Libgcrypt returns an error insteead of silent allocating a byte. Thus gpg 2.x bailed out with an "Fatal: out of core while allocating 0 bytes". The extra code in xmalloc.c is for more robustness for the other xmalloc calls.
113 lines
2.3 KiB
C
113 lines
2.3 KiB
C
/* xmalloc.c - standard malloc wrappers
|
|
* Copyright (C) 1999, 2000, 2001, 2006 Free Software Foundation, Inc.
|
|
*
|
|
* This file is part of JNLIB, which is a subsystem of GnuPG.
|
|
*
|
|
* JNLIB is free software; you can redistribute it and/or modify it
|
|
* under the terms of either
|
|
*
|
|
* - the GNU Lesser General Public License as published by the Free
|
|
* Software Foundation; either version 3 of the License, or (at
|
|
* your option) any later version.
|
|
*
|
|
* or
|
|
*
|
|
* - the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 2 of the License, or (at
|
|
* your option) any later version.
|
|
*
|
|
* or both in parallel, as here.
|
|
*
|
|
* JNLIB 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
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copies of the GNU General Public License
|
|
* and the GNU Lesser General Public License along with this program;
|
|
* if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#include "libjnlib-config.h"
|
|
#include "xmalloc.h"
|
|
|
|
static void
|
|
out_of_core(void)
|
|
{
|
|
fputs("\nfatal: out of memory\n", stderr );
|
|
exit(2);
|
|
}
|
|
|
|
|
|
void *
|
|
xmalloc( size_t n )
|
|
{
|
|
void *p;
|
|
|
|
/* Make sure that xmalloc (0) works. This is the same behaviour
|
|
has in gpg 2.x. Note that in contrast to this code, Libgcrypt
|
|
(and thus most xmallocs in gpg 2.x) detect the !n and bail out. */
|
|
if (!n)
|
|
n = 1;
|
|
|
|
p = malloc( n );
|
|
if( !p )
|
|
out_of_core();
|
|
return p;
|
|
}
|
|
|
|
void *
|
|
xrealloc( void *a, size_t n )
|
|
{
|
|
void *p = realloc( a, n );
|
|
if( !p )
|
|
out_of_core();
|
|
return p;
|
|
}
|
|
|
|
void *
|
|
xcalloc( size_t n, size_t m )
|
|
{
|
|
void *p;
|
|
|
|
if (!n)
|
|
n = 1;
|
|
if (!m)
|
|
m = 1;
|
|
|
|
p = calloc( n, m );
|
|
if( !p )
|
|
out_of_core();
|
|
return p;
|
|
}
|
|
|
|
char *
|
|
xstrdup( const char *string )
|
|
{
|
|
void *p = xmalloc( strlen(string)+1 );
|
|
strcpy( p, string );
|
|
return p;
|
|
}
|
|
|
|
|
|
char *
|
|
xstrcat2( const char *a, const char *b )
|
|
{
|
|
size_t n1;
|
|
char *p;
|
|
|
|
if( !b )
|
|
return xstrdup( a );
|
|
|
|
n1 = strlen(a);
|
|
p = xmalloc( n1 + strlen(b) + 1 );
|
|
memcpy(p, a, n1 );
|
|
strcpy(p+n1, b );
|
|
return p;
|
|
}
|