aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/getkey.c48
-rw-r--r--jnlib/xmalloc.c19
2 files changed, 45 insertions, 22 deletions
diff --git a/g10/getkey.c b/g10/getkey.c
index 5e8c1c9f5..c0184c209 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -3035,27 +3035,35 @@ get_long_user_id_string( u32 *keyid )
char*
get_user_id( u32 *keyid, size_t *rn )
{
- user_id_db_t r;
- char *p;
- int pass=0;
+ user_id_db_t r;
+ char *p;
+ int pass = 0;
- /* try it two times; second pass reads from key resources */
- do {
- for(r=user_id_db; r; r = r->next ) {
- keyid_list_t a;
- for (a=r->keyids; a; a= a->next ) {
- if( a->keyid[0] == keyid[0] && a->keyid[1] == keyid[1] ) {
- p = xmalloc( r->len );
- memcpy(p, r->name, r->len );
- *rn = r->len;
- return p;
- }
- }
- }
- } while( ++pass < 2 && !get_pubkey( NULL, keyid ) );
- p = xstrdup( user_id_not_found_utf8 () );
- *rn = strlen(p);
- return p;
+ /* Try it two times; second pass reads from key resources. */
+ do
+ {
+ for (r = user_id_db; r; r = r->next)
+ {
+ keyid_list_t a;
+ for (a = r->keyids; a; a = a->next)
+ {
+ if (a->keyid[0] == keyid[0] && a->keyid[1] == keyid[1])
+ {
+ /* An empty string as user id is possible. Make
+ sure that the malloc allocates one byte and does
+ not bail out. */
+ p = xmalloc (r->len? r->len : 1);
+ memcpy (p, r->name, r->len);
+ *rn = r->len;
+ return p;
+ }
+ }
+ }
+ }
+ while (++pass < 2 && !get_pubkey (NULL, keyid));
+ p = xstrdup (user_id_not_found_utf8 ());
+ *rn = strlen (p);
+ return p;
}
char*
diff --git a/jnlib/xmalloc.c b/jnlib/xmalloc.c
index eb6d5ab11..244f7643e 100644
--- a/jnlib/xmalloc.c
+++ b/jnlib/xmalloc.c
@@ -36,7 +36,15 @@ out_of_core(void)
void *
xmalloc( size_t n )
{
- void *p = malloc( 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;
@@ -54,7 +62,14 @@ xrealloc( void *a, size_t n )
void *
xcalloc( size_t n, size_t m )
{
- void *p = calloc( n, m );
+ void *p;
+
+ if (!n)
+ n = 1;
+ if (!m)
+ m = 1;
+
+ p = calloc( n, m );
if( !p )
out_of_core();
return p;