[pacman-dev] [PATCHv3] alpm_handle: store lock file descriptor
Allan McRae
allan at archlinux.org
Tue Oct 29 01:53:22 EDT 2013
On 27/10/13 01:32, Andrew Gregory wrote:
> There was a brief window between opening the file descriptor and
> creating a stream to it. If the process was interrupted during that
> window the lock file would not be removed correctly.
>
> The pid is no longer printed to the lock file as this was virtually
> meaningless for lock files on NFS.
>
> Fixes FS#35603
>
> Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
> ---
Can someone else also look at commit acd92694 and ensure we are not
regressing here. I think this is fine...
>
> Initialize lockfd = -1 because using stdin as the lock is bad...
>
> lib/libalpm/handle.c | 25 +++++++++----------------
> lib/libalpm/handle.h | 2 +-
> 2 files changed, 10 insertions(+), 17 deletions(-)
>
> diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
> index 53c86c5..4871e1e 100644
> --- a/lib/libalpm/handle.c
> +++ b/lib/libalpm/handle.c
> @@ -44,6 +44,7 @@ alpm_handle_t *_alpm_handle_new(void)
>
> CALLOC(handle, 1, sizeof(alpm_handle_t), return NULL);
> handle->deltaratio = 0.0;
> + handle->lockfd = -1;
>
> return handle;
> }
> @@ -91,11 +92,10 @@ void _alpm_handle_free(alpm_handle_t *handle)
> /** Lock the database */
> int _alpm_handle_lock(alpm_handle_t *handle)
> {
> - int fd;
> char *dir, *ptr;
>
> ASSERT(handle->lockfile != NULL, return -1);
> - ASSERT(handle->lckstream == NULL, return 0);
> + ASSERT(handle->lockfd < 0, return 0);
>
> /* create the dir of the lockfile first */
> dir = strdup(handle->lockfile);
> @@ -110,27 +110,20 @@ int _alpm_handle_lock(alpm_handle_t *handle)
> FREE(dir);
>
> do {
> - fd = open(handle->lockfile, O_WRONLY | O_CREAT | O_EXCL, 0000);
> - } while(fd == -1 && errno == EINTR);
> - if(fd >= 0) {
> - FILE *f = fdopen(fd, "w");
> - fprintf(f, "%ld\n", (long)getpid());
> - fflush(f);
> - fsync(fd);
> - handle->lckstream = f;
> - return 0;
> - }
> - return -1;
> + handle->lockfd = open(handle->lockfile, O_WRONLY | O_CREAT | O_EXCL, 0000);
> + } while(handle->lockfd == -1 && errno == EINTR);
> +
> + return (handle->lockfd >= 0 ? 0 : -1);
> }
>
> /** Remove a lock file */
> int _alpm_handle_unlock(alpm_handle_t *handle)
> {
> ASSERT(handle->lockfile != NULL, return -1);
> - ASSERT(handle->lckstream != NULL, return 0);
> + ASSERT(handle->lockfd >= 0, return 0);
>
> - fclose(handle->lckstream);
> - handle->lckstream = NULL;
> + close(handle->lockfd);
> + handle->lockfd = -1;
>
> if(unlink(handle->lockfile) && errno != ENOENT) {
> return -1;
> diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
> index 5e84d58..a4e2cf7 100644
> --- a/lib/libalpm/handle.h
> +++ b/lib/libalpm/handle.h
> @@ -55,7 +55,7 @@ struct __alpm_handle_t {
> alpm_db_t *db_local; /* local db pointer */
> alpm_list_t *dbs_sync; /* List of (alpm_db_t *) */
> FILE *logstream; /* log file stream pointer */
> - FILE *lckstream; /* lock file stream pointer if one exists */
> + int lockfd; /* lock file descriptor */
> alpm_trans_t *trans;
>
> #ifdef HAVE_LIBCURL
>
More information about the pacman-dev
mailing list