[Dovecot] Shredding instead of deleting

Timo Sirainen tss at iki.fi
Wed Sep 14 18:19:06 EEST 2011


On 14.9.2011, at 18.05, dovecot at lists.grepular.com wrote:

>> The LD_PRELOAD way would be simple. Probably 10-20 lines of C code for something that would replace unlink()s to mail files with fork+exec to /usr/bin/shred.
> 
> Simple for somebody who can code in C you mean :)

I have no idea if this works (or even compiles), it's based on a web page I found:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>

int unlink(const char *path) {
  static int (*libc_unlink)(const char *) = NULL;
  char *args[3];
  int status;

  if (libc_unlink == NULL)
    *(void **)(&libc_unlink) = dlsym(RTLD_NEXT, "unlink");
  if (strstr(path, "Maildir/") != NULL) {
    args[0] = "/usr/bin/shred";
    args[1] = path;
    args[2] = NULL;
    switch (fork()) {
    case -1: return -1;
    case 0: execve(args[0], args); exit(99);
    default: if (wait(&status) < 0) return -1;
    }
    if (WIFEXITED(status) && WEXITSTATUS(status) == 0) return 0;
    errno = ENOENT; /* not really correct, should maybe check it properly */
    return -1;
  } else {
    libc_unlink(path);
  }
}




More information about the dovecot mailing list