Trace the use of GPG_ERR_INV_ENGINE.

* src/debug.h: Include "gpgme.h"
(_gpgme_trace_gpgme_error): New.
(trace_gpg_error): New macro.  Use it in all files where we return
GPG_ERR_INV_ENGINE; also "include debug.h" as needed.
--

This is a pretty common error code but often it is hard to figure out
the actual cause.  With debug level 4 we now print the file name and
line number where this error code is generated by gpgme.  Along with
the git revision printed in the first log lines, this should give us
an easier way to track down the problems related to this error code.
This commit is contained in:
Werner Koch 2012-10-19 11:23:39 +02:00
parent 14a8fd4eec
commit bd24feaa86
20 changed files with 65 additions and 37 deletions

View File

@ -26,6 +26,9 @@
#include <stdint.h> #include <stdint.h>
#endif #endif
#include "gpgme.h" /* Required for gpgme_error stuff. */
/* Indirect stringification, requires __STDC__ to work. */ /* Indirect stringification, requires __STDC__ to work. */
#define STRINGIFY(v) #v #define STRINGIFY(v) #v
#define XSTRINGIFY(v) STRINGIFY(v) #define XSTRINGIFY(v) STRINGIFY(v)
@ -81,6 +84,13 @@ void _gpgme_debug_buffer (int lvl, const char *const fmt,
void _gpgme_debug_frame_begin (void); void _gpgme_debug_frame_begin (void);
void _gpgme_debug_frame_end (void); void _gpgme_debug_frame_end (void);
static inline gpgme_error_t
_gpgme_trace_gpgme_error (gpgme_error_t err, const char *file, int line)
{
_gpgme_debug (DEBUG_ENGINE, "%s:%d: returning error: %s\n",
_gpgme_debug_srcname (file), line, gpgme_strerror (err));
return err;
}
/* Trace support. */ /* Trace support. */
@ -262,4 +272,11 @@ void _gpgme_debug_frame_end (void);
_gpgme_debug_end (&(hlp)) _gpgme_debug_end (&(hlp))
#define TRACE_ENABLED(hlp) (!!(hlp)) #define TRACE_ENABLED(hlp) (!!(hlp))
/* And finally a simple macro to trace the location of an error code.
This macro is independent of the other trace macros and may be used
without any preconditions. */
#define trace_gpg_error(e) \
_gpgme_trace_gpgme_error (gpg_error (e), __FILE__, __LINE__)
#endif /* DEBUG_H */ #endif /* DEBUG_H */

View File

@ -146,7 +146,7 @@ parse_enc_to (char *args, gpgme_recipient_t *recp)
if (*args != '\0' && *args != ' ') if (*args != '\0' && *args != ' ')
{ {
free (rec); free (rec);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
while (*args == ' ') while (*args == ' ')
@ -160,7 +160,7 @@ parse_enc_to (char *args, gpgme_recipient_t *recp)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (rec); free (rec);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
} }
@ -283,7 +283,7 @@ _gpgme_decrypt_status_handler (void *priv, gpgme_status_code_t code,
} }
/* FIXME: Is this ok? */ /* FIXME: Is this ok? */
if (!rec) if (!rec)
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
break; break;

View File

@ -48,7 +48,7 @@ delete_status_handler (void *priv, gpgme_status_code_t code, char *args)
gpg_err_set_errno (0); gpg_err_set_errno (0);
problem = strtol (args, &tail, 0); problem = strtol (args, &tail, 0);
if (errno || (*tail && *tail != ' ')) if (errno || (*tail && *tail != ' '))
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
switch (problem) switch (problem)
{ {

View File

@ -1269,7 +1269,7 @@ start (engine_gpg_t gpg)
return gpg_error (GPG_ERR_INV_VALUE); return gpg_error (GPG_ERR_INV_VALUE);
if (!gpg->file_name && !_gpgme_get_gpg_path ()) if (!gpg->file_name && !_gpgme_get_gpg_path ())
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
if (gpg->lc_ctype) if (gpg->lc_ctype)
{ {

View File

@ -300,7 +300,7 @@ gpgconf_config_load_cb (void *hook, char *line)
/* We require at least the first 3 fields. */ /* We require at least the first 3 fields. */
if (fields < 2) if (fields < 2)
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
/* Find the pointer to the new component in the list. */ /* Find the pointer to the new component in the list. */
while (comp && comp->next) while (comp && comp->next)
@ -426,7 +426,7 @@ gpgconf_config_load_cb2 (void *hook, char *line)
/* We require at least the first 10 fields. */ /* We require at least the first 10 fields. */
if (fields < 10) if (fields < 10)
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
opt = calloc (1, sizeof (*opt)); opt = calloc (1, sizeof (*opt));
if (!opt) if (!opt)

View File

@ -30,6 +30,7 @@
#include "util.h" #include "util.h"
#include "sema.h" #include "sema.h"
#include "ops.h" #include "ops.h"
#include "debug.h"
#include "engine.h" #include "engine.h"
#include "engine-backend.h" #include "engine-backend.h"
@ -166,7 +167,7 @@ gpgme_engine_check_version (gpgme_protocol_t proto)
info->req_version); info->req_version);
UNLOCK (engine_info_lock); UNLOCK (engine_info_lock);
return result ? 0 : gpg_error (GPG_ERR_INV_ENGINE); return result ? 0 : trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
@ -359,7 +360,7 @@ _gpgme_set_engine_info (gpgme_engine_info_t info, gpgme_protocol_t proto,
info = info->next; info = info->next;
if (!info) if (!info)
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
/* Prepare new members. */ /* Prepare new members. */
if (file_name) if (file_name)
@ -449,7 +450,7 @@ _gpgme_engine_new (gpgme_engine_info_t info, engine_t *r_engine)
engine_t engine; engine_t engine;
if (!info->file_name || !info->version) if (!info->file_name || !info->version)
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
engine = calloc (1, sizeof *engine); engine = calloc (1, sizeof *engine);
if (!engine) if (!engine)

View File

@ -26,6 +26,7 @@
#include "ops.h" #include "ops.h"
#include "engine.h" #include "engine.h"
#include "debug.h"
#ifdef ENABLE_GPGCONF #ifdef ENABLE_GPGCONF
/* engine-gpgconf.c. */ /* engine-gpgconf.c. */

View File

@ -131,7 +131,7 @@ parse_import (char *args, gpgme_import_status_t *import_status, int problem)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (import); free (import);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
args = tail; args = tail;
@ -196,7 +196,7 @@ parse_import_res (char *args, gpgme_import_result_t result)
(x) = strtol (args, &tail, 0); \ (x) = strtol (args, &tail, 0); \
if (errno || args == tail || *tail != ' ') \ if (errno || args == tail || *tail != ' ') \
/* The crypto backend does not behave. */ \ /* The crypto backend does not behave. */ \
return gpg_error (GPG_ERR_INV_ENGINE); \ return trace_gpg_error (GPG_ERR_INV_ENGINE); \
args = tail; args = tail;
PARSE_NEXT (result->considered); PARSE_NEXT (result->considered);

View File

@ -30,6 +30,7 @@
#include "util.h" #include "util.h"
#include "ops.h" #include "ops.h"
#include "sema.h" #include "sema.h"
#include "debug.h"
/* Protects all reference counters in keys. All other accesses to a /* Protects all reference counters in keys. All other accesses to a

View File

@ -31,6 +31,7 @@
#include "context.h" #include "context.h"
#include "ops.h" #include "ops.h"
#include "util.h" #include "util.h"
#include "debug.h"
gpgme_error_t gpgme_error_t
@ -199,7 +200,7 @@ _gpgme_parse_inv_recp (char *args, gpgme_invalid_key_t *key)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (inv_key); free (inv_key);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
switch (reason) switch (reason)

View File

@ -32,6 +32,7 @@
#include "context.h" #include "context.h"
#include "ops.h" #include "ops.h"
#include "util.h" #include "util.h"
#include "debug.h"
typedef struct typedef struct

View File

@ -56,7 +56,7 @@ parse_error (char *args)
where = args; where = args;
} }
else else
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
err = atoi (which); err = atoi (which);

View File

@ -28,6 +28,7 @@
#include "util.h" #include "util.h"
#include "context.h" #include "context.h"
#include "debug.h"
gpgme_error_t gpgme_error_t

View File

@ -30,6 +30,7 @@
#include "util.h" #include "util.h"
#include "context.h" #include "context.h"
#include "ops.h" #include "ops.h"
#include "debug.h"
/* Free the signature notation object and all associated resources. /* Free the signature notation object and all associated resources.
@ -159,13 +160,13 @@ _gpgme_parse_notation (gpgme_sig_notation_t *notationp,
/* A few simple sanity checks. */ /* A few simple sanity checks. */
if (len > strlen (data)) if (len > strlen (data))
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
/* See below for the format of a notation subpacket. It has at /* See below for the format of a notation subpacket. It has at
least four octets of flags and two times two octets of length least four octets of flags and two times two octets of length
information. */ information. */
if (type == 20 && len < 4 + 2 + 2) if (type == 20 && len < 4 + 2 + 2)
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
err = _gpgme_decode_percent_string (data, &decoded_data, 0, 1); err = _gpgme_decode_percent_string (data, &decoded_data, 0, 1);
if (err) if (err)
@ -234,7 +235,7 @@ _gpgme_parse_notation (gpgme_sig_notation_t *notationp,
if (4 + 2 + 2 + name_len + value_len > len) if (4 + 2 + 2 + name_len + value_len > len)
{ {
free (decoded_data); free (decoded_data);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
name = (char *) bdata; name = (char *) bdata;

View File

@ -169,14 +169,14 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
default: default:
/* The backend engine is not behaving. */ /* The backend engine is not behaving. */
free (sig); free (sig);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
args++; args++;
if (*args != ' ') if (*args != ' ')
{ {
free (sig); free (sig);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
gpg_err_set_errno (0); gpg_err_set_errno (0);
@ -185,7 +185,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (sig); free (sig);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
args = tail; args = tail;
@ -194,7 +194,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (sig); free (sig);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
args = tail; args = tail;
@ -205,7 +205,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (sig); free (sig);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
args = tail; args = tail;
@ -214,7 +214,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (sig); free (sig);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
args = tail; args = tail;
while (*args == ' ') while (*args == ' ')
@ -224,7 +224,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
{ {
/* The crypto backend does not behave. */ /* The crypto backend does not behave. */
free (sig); free (sig);
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
} }
tail = strchr (args, ' '); tail = strchr (args, ' ');

View File

@ -30,6 +30,7 @@
#include "util.h" #include "util.h"
#include "ops.h" #include "ops.h"
#include "sema.h" #include "sema.h"
#include "debug.h"
/* Protects all reference counters in trust items. All other accesses /* Protects all reference counters in trust items. All other accesses

View File

@ -346,7 +346,7 @@ parse_new_sig (op_data_t opd, gpgme_status_code_t code, char *args)
/* Parse the timestamp. */ /* Parse the timestamp. */
sig->timestamp = _gpgme_parse_timestamp (end, &tail); sig->timestamp = _gpgme_parse_timestamp (end, &tail);
if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' ')) if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' '))
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
end = tail; end = tail;
while (*end == ' ') while (*end == ' ')
end++; end++;
@ -420,12 +420,12 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
sig->timestamp = _gpgme_parse_timestamp (end, &tail); sig->timestamp = _gpgme_parse_timestamp (end, &tail);
if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' ')) if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' '))
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
end = tail; end = tail;
sig->exp_timestamp = _gpgme_parse_timestamp (end, &tail); sig->exp_timestamp = _gpgme_parse_timestamp (end, &tail);
if (sig->exp_timestamp == -1 || end == tail || (*tail && *tail != ' ')) if (sig->exp_timestamp == -1 || end == tail || (*tail && *tail != ' '))
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
end = tail; end = tail;
while (*end == ' ') while (*end == ' ')
@ -445,7 +445,7 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
gpg_err_set_errno (0); gpg_err_set_errno (0);
sig->pubkey_algo = strtol (end, &tail, 0); sig->pubkey_algo = strtol (end, &tail, 0);
if (errno || end == tail || *tail != ' ') if (errno || end == tail || *tail != ' ')
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
end = tail; end = tail;
while (*end == ' ') while (*end == ' ')
@ -458,7 +458,7 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
gpg_err_set_errno (0); gpg_err_set_errno (0);
sig->hash_algo = strtol (end, &tail, 0); sig->hash_algo = strtol (end, &tail, 0);
if (errno || end == tail || *tail != ' ') if (errno || end == tail || *tail != ' ')
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
end = tail; end = tail;
} }
} }
@ -491,7 +491,7 @@ parse_notation (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
if (notation) if (notation)
/* There is another notation name without data for the /* There is another notation name without data for the
previous one. The crypto backend misbehaves. */ previous one. The crypto backend misbehaves. */
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
err = _gpgme_sig_notation_create (&notation, NULL, 0, NULL, 0, 0); err = _gpgme_sig_notation_create (&notation, NULL, 0, NULL, 0, 0);
if (err) if (err)
@ -544,7 +544,7 @@ parse_notation (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
if (!notation || !notation->name) if (!notation || !notation->name)
/* There is notation data without a previous notation /* There is notation data without a previous notation
name. The crypto backend misbehaves. */ name. The crypto backend misbehaves. */
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
if (!notation->value) if (!notation->value)
{ {
@ -569,7 +569,7 @@ parse_notation (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
notation->value_len += strlen (dest); notation->value_len += strlen (dest);
} }
else else
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
return 0; return 0;
} }
@ -645,7 +645,7 @@ parse_error (gpgme_signature_t sig, char *args, int set_status)
where = args; where = args;
} }
else else
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
err = atoi (which); err = atoi (which);
@ -708,7 +708,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
case GPGME_STATUS_VALIDSIG: case GPGME_STATUS_VALIDSIG:
opd->only_newsig_seen = 0; opd->only_newsig_seen = 0;
return sig ? parse_valid_sig (sig, args) return sig ? parse_valid_sig (sig, args)
: gpg_error (GPG_ERR_INV_ENGINE); : trace_gpg_error (GPG_ERR_INV_ENGINE);
case GPGME_STATUS_NODATA: case GPGME_STATUS_NODATA:
opd->only_newsig_seen = 0; opd->only_newsig_seen = 0;
@ -729,7 +729,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
case GPGME_STATUS_POLICY_URL: case GPGME_STATUS_POLICY_URL:
opd->only_newsig_seen = 0; opd->only_newsig_seen = 0;
return sig ? parse_notation (sig, code, args) return sig ? parse_notation (sig, code, args)
: gpg_error (GPG_ERR_INV_ENGINE); : trace_gpg_error (GPG_ERR_INV_ENGINE);
case GPGME_STATUS_TRUST_UNDEFINED: case GPGME_STATUS_TRUST_UNDEFINED:
case GPGME_STATUS_TRUST_NEVER: case GPGME_STATUS_TRUST_NEVER:
@ -738,7 +738,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
case GPGME_STATUS_TRUST_ULTIMATE: case GPGME_STATUS_TRUST_ULTIMATE:
opd->only_newsig_seen = 0; opd->only_newsig_seen = 0;
return sig ? parse_trust (sig, code, args) return sig ? parse_trust (sig, code, args)
: gpg_error (GPG_ERR_INV_ENGINE); : trace_gpg_error (GPG_ERR_INV_ENGINE);
case GPGME_STATUS_PKA_TRUST_BAD: case GPGME_STATUS_PKA_TRUST_BAD:
case GPGME_STATUS_PKA_TRUST_GOOD: case GPGME_STATUS_PKA_TRUST_GOOD:
@ -746,7 +746,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
/* Check that we only get one of these status codes per /* Check that we only get one of these status codes per
signature; if not the crypto backend misbehaves. */ signature; if not the crypto backend misbehaves. */
if (!sig || sig->pka_trust || sig->pka_address) if (!sig || sig->pka_trust || sig->pka_address)
return gpg_error (GPG_ERR_INV_ENGINE); return trace_gpg_error (GPG_ERR_INV_ENGINE);
sig->pka_trust = code == GPGME_STATUS_PKA_TRUST_GOOD? 2 : 1; sig->pka_trust = code == GPGME_STATUS_PKA_TRUST_GOOD? 2 : 1;
end = strchr (args, ' '); end = strchr (args, ' ');
if (end) if (end)

View File

@ -34,6 +34,7 @@
#include "wait.h" #include "wait.h"
#include "priv-io.h" #include "priv-io.h"
#include "ops.h" #include "ops.h"
#include "debug.h"
/* The global event loop is used for all asynchronous operations /* The global event loop is used for all asynchronous operations
(except key listing) for which no user I/O callbacks are specified. (except key listing) for which no user I/O callbacks are specified.

View File

@ -31,6 +31,7 @@
#include "ops.h" #include "ops.h"
#include "priv-io.h" #include "priv-io.h"
#include "util.h" #include "util.h"
#include "debug.h"
/* The private event loops are used for all blocking operations, and /* The private event loops are used for all blocking operations, and

View File

@ -29,6 +29,7 @@
#include "priv-io.h" #include "priv-io.h"
#include "wait.h" #include "wait.h"
#include "ops.h" #include "ops.h"
#include "debug.h"
/* The user event loops are used for all asynchronous operations for /* The user event loops are used for all asynchronous operations for