gpgme: potential minor memory leaks in tests under gpgme/test/gpg

Seiya Kawashima skawashima at uchicago.edu
Fri Jun 10 17:17:51 CEST 2016


Hi,

I've been checking the test files under gpgme/tests/gpg. I cloned GPGME via git. The commit is 77d149e8614c381458e07808a7930ce3fb92cdc3 and the date is Wed Jun 8 18:06:24 2016 +0200. I might have found potential minor memory leaks in gpgme/tests/gpg/t-decrypt.c, gpgme/tests/gpg/t-import.c, gpgme/tests/gpg/t-thread1.c and gpgme/tests/gpg/t-decrypt-verify.c.

If they are not memory leaks or they are already fixed, please disregard the email.

It seems to me that all the leaks are caused by make_filename() in t-support.h:104. make_filename() allocates memory via malloc() in t-support.h:111 like

buf = malloc (strlen(srcdir) + strlen(fname) + 2);

but the memory is never freed in those tests.The file names are created in the tests as below.
./t-decrypt.c:46:  const char *cipher_1_asc = make_filename ("cipher-1.asc");
./t-import.c:217:  const char *pubkey_1_asc = make_filename ("pubkey-1.asc");
./t-import.c:218:  const char *seckey_1_asc = make_filename ("seckey-1.asc");
./t-thread1.c:97:  const char *cipher_1_asc = make_filename ("cipher-1.asc");
./t-decrypt-verify.c:104:  const char *cipher_2_asc = make_filename ("cipher-2.asc");

The corresponding free() seems to be needed. I've checked the source code of gpgme_data_new_from_filepart() and gpgme_data_new_from_file(). When the file name is dynamically allocated, the caller of gpgme_data_new_from_file() seems to be responsible for freeing the memory.

The small C code below simulates the memory leak.
#include <stdio.h>
#include <string.h>

#include <gpgme.h>
#include "t-support.h"

int
main (int argc, char *argv[])
{
  gpgme_error_t err;
  gpgme_data_t in;
  const char *cipher_1_asc = make_filename ("cipher-1.asc");

  err = gpgme_data_new_from_file (&in, cipher_1_asc, 1);
  fail_if_err (err);

  /* Need to free cipher_1_asc.
     Comment the below free() to cause a memory leak.
     Copy and paste the code into gpgme/tests/gpg.
     Compile the code like gcc -g t-make-filename.c -lgpgme.
     Run it with Valgrind like valgrind --leak-check=full ./a.out. */
  free((char *)cipher_1_asc);
  gpgme_data_release (in);
  return 0;
}

Keep up the great work.
Seiya


More information about the Gnupg-devel mailing list