View | Details | Raw Unified
Collapse All | Expand All

(-) dspam-3.8.0.orig/src/hash_drv.c (-3 / +54 lines)
 Lines 251-264    Link Here 
int
int
_hash_drv_lock_get (
_hash_drv_lock_get (
  const char *home,
  DSPAM_CTX *CTX,
  struct _hash_drv_storage *s,
  struct _hash_drv_storage *s,
  const char *username)
  const char *username)
{
{
  char filename[MAX_FILENAME_LENGTH];
  char filename[MAX_FILENAME_LENGTH];
  int r;
  int r;
  _ds_userdir_path(filename, home, username, "lock");
  _ds_userdir_path(filename, CTX->home, username, "lock");
  _ds_prepare_path_for(filename);
  _ds_prepare_path_for(filename);
  s->lock = fopen(filename, "a");
  s->lock = fopen(filename, "a");
 Lines 294-299    Link Here 
  return r;
  return r;
}
}
FILE*
_hash_tools_lock_get (const char *cssfilename)
{
  char filename[MAX_FILENAME_LENGTH];
  char *pPeriod;
  int r;
  FILE* lockfile = NULL;
  if (cssfilename == NULL)
    return NULL;
  pPeriod = strrchr(cssfilename, '.');
  if (pPeriod == NULL || strcmp(pPeriod + 1, "css") || pPeriod - cssfilename + 5 >= sizeof(filename))
    return NULL;
  strncpy(filename, cssfilename, pPeriod - cssfilename + 1);
  strcpy(filename + (pPeriod - cssfilename + 1), "lock");
  _ds_prepare_path_for(filename);
  lockfile = fopen(filename, "a");
  if (lockfile == NULL) {
    LOG(LOG_ERR, ERR_IO_FILE_OPEN, filename, strerror(errno));
    return NULL;
  }
  r = _ds_get_fcntl_lock(fileno(lockfile));
  if (r) {
    fclose(lockfile);
	lockfile = NULL;
    LOG(LOG_ERR, ERR_IO_LOCK, filename, r, strerror(errno));
  }
  return lockfile;
}
int
_hash_tools_lock_free (
  const char *cssfilename,
  FILE* lockfile)
{
  int r;
  if (cssfilename == NULL || lockfile == NULL)
    return 0;
  r = _ds_free_fcntl_lock(fileno(lockfile));
  if (!r) {
    fclose(lockfile);
  } else {
    LOG(LOG_ERR, ERR_IO_LOCK_FREE, cssfilename, r, strerror(errno));
  }
  return r;
}
int _hash_drv_open(
int _hash_drv_open(
  const char *filename, 
  const char *filename, 
  hash_drv_map_t map, 
  hash_drv_map_t map, 
 Lines 490-496    Link Here 
    else
    else
      _ds_userdir_path(db, CTX->home, CTX->group, "css");
      _ds_userdir_path(db, CTX->home, CTX->group, "css");
    lock_result = _hash_drv_lock_get (CTX->home, s, 
    lock_result = _hash_drv_lock_get (CTX, s, 
      (CTX->group) ? CTX->group : CTX->username);
      (CTX->group) ? CTX->group : CTX->username);
    if (lock_result < 0) 
    if (lock_result < 0) 
      goto BAIL;
      goto BAIL;
(-) dspam-3.8.0.orig/src/hash_drv.h (-1 / +8 lines)
 Lines 88-94    Link Here 
  (DSPAM_CTX * CTX);
  (DSPAM_CTX * CTX);
int _hash_drv_lock_get (
int _hash_drv_lock_get (
  const char *home, 
  DSPAM_CTX *CTX,
  struct _hash_drv_storage *s, 
  struct _hash_drv_storage *s, 
  const char *username);
  const char *username);
 Lines 96-101    Link Here 
  struct _hash_drv_storage *s,
  struct _hash_drv_storage *s,
  const char *username);
  const char *username);
/* lock variant used by css tools */
FILE* _hash_tools_lock_get (const char *cssfilename);
int _hash_tools_lock_free (
  const char *cssfilename,
  FILE* lockfile);
int _hash_drv_open(
int _hash_drv_open(
  const char *filename,
  const char *filename,
  hash_drv_map_t map,
  hash_drv_map_t map,
(-) dspam-3.8.0.orig/src/tools.hash_drv/cssclean.c (-28 / +26 lines)
 Lines 97-110    Link Here 
int cssclean(const char *filename) {
int cssclean(const char *filename) {
  int i;
  int i;
  hash_drv_header_t header;
  hash_drv_header_t header;
  struct _hash_drv_storage s;
  FILE* lockfile;
  void *offset;
  void *offset;
  struct _hash_drv_map old, new;
  struct _hash_drv_map old, new;
  hash_drv_spam_record_t rec;
  hash_drv_spam_record_t rec;
  unsigned long filepos;
  unsigned long filepos;
  char newfile[PATH_MAX];
  char *dir = NULL;
  char *oldfile;
  char *newfile = NULL;
  char *home, *username;
  struct stat st;
  struct stat st;
  unsigned long hash_rec_max = HASH_REC_MAX;
  unsigned long hash_rec_max = HASH_REC_MAX;
 Lines 138-188    Link Here 
  if (READ_ATTRIB("HashMaxSeek"))
  if (READ_ATTRIB("HashMaxSeek"))
     max_seek = strtol(READ_ATTRIB("HashMaxSeek"), NULL, 0);
     max_seek = strtol(READ_ATTRIB("HashMaxSeek"), NULL, 0);
  oldfile = strdup(filename);
  if (stat(filename, &st) < 0)
  if (!oldfile)
    return EFAILURE;
    return EFAILURE;
  oldfile = dirname(oldfile);		/* oldfile may not be free'd now */
  snprintf(newfile, sizeof(newfile), "%s/%u.css", oldfile, (unsigned int) getpid());
  /* set home and username */
  /* create a temporary file name */
  username = strdup(oldfile);
  dir = strdup(filename);
  home = strdup(oldfile);
  if (dir == NULL)
  if (!username || !home)
    return EFAILURE;
  username = basename(username);	/* username may not be free'd now */
  home = dirname(home);			/* home may not be free'd now */
  /* make sure at least /two/dirs/to.css for sane operation */
  if (!strcmp(username, home))
    return EFAILURE;
    return EFAILURE;
  newfile = tempnam(dirname(dir), "css");
  if (stat(filename, &st) < 0)
  if (newfile == NULL)
    return EFAILURE;
    return EFAILURE;
  if (_hash_drv_lock_get (home, &s, username) < 0)
  lockfile = _hash_tools_lock_get (filename);
  if (lockfile == NULL)
    return EFAILURE;
    return EFAILURE;
  if (_hash_drv_open(filename, &old, 0, max_seek,
  if (_hash_drv_open(filename, &old, 0, max_seek,
                     max_extents, extent_size, pctincrease, flags))
                     max_extents, extent_size, pctincrease, flags))
    goto unlock;
    goto end;
  if (_hash_drv_open(newfile, &new, hash_rec_max, max_seek,
  if (_hash_drv_open(newfile, &new, hash_rec_max, max_seek,
                     max_extents, extent_size, pctincrease, flags)) {
                     max_extents, extent_size, pctincrease, flags)) {
    _hash_drv_close(&old);
    _hash_drv_close(&old);
    goto unlock;
    goto end;
  }
  }
  
  /* preserve counters */
  memcpy(new.header, old.header, sizeof(*new.header));
  if (fchown(new.fd, st.st_uid, st.st_gid) < 0) {
  if (fchown(new.fd, st.st_uid, st.st_gid) < 0) {
    _hash_drv_close(&new);
    _hash_drv_close(&new);
    _hash_drv_close(&old);
    _hash_drv_close(&old);
    unlink(newfile);
    unlink(newfile);
    goto unlock;
    goto end;
  }
  }
  if (fchmod(new.fd, st.st_mode) < 0) {
  if (fchmod(new.fd, st.st_mode) < 0) {
    _hash_drv_close(&new);
    _hash_drv_close(&new);
    _hash_drv_close(&old);
    _hash_drv_close(&old);
    unlink(newfile);
    unlink(newfile);
    goto unlock;
    goto end;
  }
  }
  filepos = sizeof(struct _hash_drv_header);
  filepos = sizeof(struct _hash_drv_header);
 Lines 196-202    Link Here 
          _hash_drv_close(&new);
          _hash_drv_close(&new);
          _hash_drv_close(&old);
          _hash_drv_close(&old);
          unlink(newfile);
          unlink(newfile);
          goto unlock;
          goto end;
        }
        }
      }
      }
      filepos += sizeof(struct _hash_drv_spam_record);
      filepos += sizeof(struct _hash_drv_spam_record);
 Lines 209-219    Link Here 
  _hash_drv_close(&new);
  _hash_drv_close(&new);
  _hash_drv_close(&old);
  _hash_drv_close(&old);
  if (rename(newfile, filename) < 0)
  if (rename(newfile, filename) < 0)
    goto unlock;
    goto end;
  rc = 0;
  rc = 0;
unlock:
end:
  _hash_drv_lock_free(&s, username);
  if (dir)
    free(dir);
  if (newfile)
    free(newfile);
  _hash_tools_lock_free(filename, lockfile);
  return rc;
  return rc;
}
}