diff options
Diffstat (limited to 'src/engine.c')
| -rw-r--r-- | src/engine.c | 40 | 
1 files changed, 28 insertions, 12 deletions
| diff --git a/src/engine.c b/src/engine.c index 80febea5..4f2000c2 100644 --- a/src/engine.c +++ b/src/engine.c @@ -182,6 +182,8 @@ _gpgme_engine_info_release (gpgme_engine_info_t info)  gpgme_error_t  gpgme_get_engine_info (gpgme_engine_info_t *info)  { +  gpgme_error_t err; +    LOCK (engine_info_lock);    if (!engine_info)      { @@ -194,6 +196,7 @@ gpgme_get_engine_info (gpgme_engine_info_t *info)  					GPGME_PROTOCOL_UISERVER };        unsigned int proto; +      err = 0;        for (proto = 0; proto < DIM (proto_list); proto++)  	{  	  const char *ofile_name = engine_get_file_name (proto_list[proto]); @@ -205,13 +208,24 @@ gpgme_get_engine_info (gpgme_engine_info_t *info)  	    continue;  	  file_name = strdup (ofile_name); -          home_dir = ohome_dir? strdup (ohome_dir): NULL; +          if (!file_name) +            err = gpg_error_from_syserror (); + +          if (ohome_dir) +            { +              home_dir = strdup (ohome_dir); +              if (!home_dir && !err) +                err = gpg_error_from_syserror (); +            } +          else +            home_dir = NULL;  	  *lastp = malloc (sizeof (*engine_info)); -	  if (!*lastp || !file_name) -	    { -	      int saved_err = gpg_error_from_syserror (); +          if (!*lastp && !err) +            err = gpg_error_from_syserror (); +	  if (err) +	    {  	      _gpgme_engine_info_release (engine_info);  	      engine_info = NULL; @@ -221,7 +235,7 @@ gpgme_get_engine_info (gpgme_engine_info_t *info)  		free (home_dir);  	      UNLOCK (engine_info_lock); -	      return saved_err; +	      return err;  	    }  	  (*lastp)->protocol = proto_list[proto]; @@ -273,11 +287,13 @@ _gpgme_engine_info_copy (gpgme_engine_info_t *r_info)        assert (info->file_name);        file_name = strdup (info->file_name); +      if (!file_name) +        err = gpg_error_from_syserror ();        if (info->home_dir)  	{  	  home_dir = strdup (info->home_dir); -	  if (!home_dir) +	  if (!home_dir && !err)  	    err = gpg_error_from_syserror ();  	}        else @@ -286,19 +302,19 @@ _gpgme_engine_info_copy (gpgme_engine_info_t *r_info)        if (info->version)  	{  	  version = strdup (info->version); -	  if (!version) +	  if (!version && !err)  	    err = gpg_error_from_syserror ();  	}        else  	version = NULL;        *lastp = malloc (sizeof (*engine_info)); -      if (!*lastp || !file_name || err) -	{ -	  int saved_err = gpg_error_from_syserror (); +      if (!*lastp && !err) +        err = gpg_error_from_syserror (); +      if (err) +	{  	  _gpgme_engine_info_release (new_info); -  	  if (file_name)  	    free (file_name);  	  if (home_dir) @@ -307,7 +323,7 @@ _gpgme_engine_info_copy (gpgme_engine_info_t *r_info)  	    free (version);  	  UNLOCK (engine_info_lock); -	  return saved_err; +	  return err;  	}        (*lastp)->protocol = info->protocol; | 
