Bug #1416 » 0001-Fix-queue-file-seek-position-races-by-locking.patch
| libexec/dma/dma.c | ||
|---|---|---|
| 
     	const char *errmsg = "unknown bounce reason"; 
   | 
||
| 
     	struct timeval now; 
   | 
||
| 
     	struct stat st; 
   | 
||
| 
     	struct flock fl; 
   | 
||
| 
     	syslog(LOG_INFO, "%s: mail from=<%s> to=<%s>", 
   | 
||
| 
     	       it->queueid, it->sender, it->addr); 
   | 
||
| ... | ... | |
| 
     	syslog(LOG_INFO, "%s: trying delivery", 
   | 
||
| 
     	       it->queueid); 
   | 
||
| 
     	bzero(&fl, sizeof(fl)); 
   | 
||
| 
     	fl.l_type = F_WRLCK; 
   | 
||
| 
     	fl.l_whence = SEEK_SET; 
   | 
||
| 
     	if (fcntl(fileno(it->queuef), F_SETLKW, &fl) == -1) { 
   | 
||
| 
     		syslog(LOG_ERR, "%s: failed to lock queue file: %m", 
   | 
||
| 
     				it->queueid); 
   | 
||
| 
     		goto bounce; 
   | 
||
| 
     	} 
   | 
||
| 
     	if (it->remote) 
   | 
||
| 
     		error = deliver_remote(it, &errmsg); 
   | 
||
| 
     	else 
   | 
||
| 
     		error = deliver_local(it, &errmsg); 
   | 
||
| 
     	bzero(&fl, sizeof(fl)); 
   | 
||
| 
     	fl.l_type = F_UNLCK; 
   | 
||
| 
     	fl.l_whence = SEEK_SET; 
   | 
||
| 
     	if (fcntl(fileno(it->queuef), F_SETLKW, &fl) == -1) { 
   | 
||
| 
     		syslog(LOG_ERR, "%s: failed to unlock queue file: %m", 
   | 
||
| 
     				it->queueid); 
   | 
||
| 
     		/* let `error' decide whether we bounce or not */ 
   | 
||
| 
     	} 
   | 
||
| 
     	switch (error) { 
   | 
||
| 
     	case 0: 
   | 
||
| 
     		unlink(it->queuefn); 
   | 
||
- « Previous
 - 1
 - …
 - 4
 - 5
 - 6
 - Next »