2009-06-18 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Thu, 18 Jun 2009 12:38:55 +0000 (12:38 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Thu, 18 Jun 2009 12:38:55 +0000 (12:38 +0000)
* context.h (CTX_OP_DATA_MAGIC): New macro.
(struct ctx_op_data): New member MAGIC.
* op-support.c (_gpgme_op_data_lookup): Initialize magic.
* gpgme.c (gpgme_result_unref, gpgme_result_ref): Check magic.

src/ChangeLog
src/context.h
src/gpgme.c
src/op-support.c

index d7b4592e38b1ea06bb2e57a036f25f250e9b4215..95b5f2dbf1b25baf49a00fa271f532fc1cfb037b 100644 (file)
@@ -1,3 +1,10 @@
+2009-06-18  Marcus Brinkmann  <marcus@g10code.de>
+
+       * context.h (CTX_OP_DATA_MAGIC): New macro.
+       (struct ctx_op_data): New member MAGIC.
+       * op-support.c (_gpgme_op_data_lookup): Initialize magic.
+       * gpgme.c (gpgme_result_unref, gpgme_result_ref): Check magic.
+
 2009-06-16  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpgme.c (gpgme_result_unref): Hot fix to release a lock.
index 63af1d1029d4f30611be36ebc938bcc07ea33ef6..e98e7bea9fbabe1d10b6548dcdc8952481f94488 100644 (file)
@@ -42,8 +42,14 @@ typedef enum
   } ctx_op_data_id_t;
 
 
+/* "gpgmeres" in ASCII.  */
+#define CTX_OP_DATA_MAGIC 0x736572656d677067ULL
 struct ctx_op_data
 {
+  /* A magic word just to make sure people don't deallocate something
+     that ain't a result structure.  */
+  unsigned long long magic;
+
   /* The next element in the linked list, or NULL if this is the last
      element.  Used by op data structures linked into a context.  */
   struct ctx_op_data *next;
index 3283b34229c5f4df6c4f8dba69d50cc132cf70f5..56caf59cf740914b5aecb05bbbfdd9d6229603c1 100644 (file)
@@ -189,6 +189,8 @@ gpgme_result_ref (void *result)
 
   data = result - sizeof (struct ctx_op_data);
 
+  assert (data->magic == CTX_OP_DATA_MAGIC);
+
   LOCK (result_ref_lock);
   data->references++;
   UNLOCK (result_ref_lock);
@@ -205,6 +207,8 @@ gpgme_result_unref (void *result)
 
   data = result - sizeof (struct ctx_op_data);
 
+  assert (data->magic == CTX_OP_DATA_MAGIC);
+
   LOCK (result_ref_lock);
   if (--data->references)
     {
index 19b242055e275623eaf1ecbda86eefa3eaae543b..c3ba7785bd2e15ef4510580728962d6b407c93e3 100644 (file)
@@ -48,6 +48,7 @@ _gpgme_op_data_lookup (gpgme_ctx_t ctx, ctx_op_data_id_t type, void **hook,
       data = calloc (1, sizeof (struct ctx_op_data) + size);
       if (!data)
        return gpg_error_from_errno (errno);
+      data->magic = CTX_OP_DATA_MAGIC;
       data->next = ctx->op_data;
       data->type = type;
       data->cleanup = cleanup;