[pacman-dev] [PATCH] only remove pacnew file if it is new

Allan McRae allan at archlinux.org
Sun Feb 7 12:53:23 UTC 2016


On 03/02/16 23:36, Andrew Gregory wrote:
> Check if we overwrote an exiting pacnew file before unlinking it.
> Otherwise, updating to a version with an unchanged file would delete
> existing pacnew files.
> 
> FS#47993
> 
> Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
> ---
>  lib/libalpm/add.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
> index 18a8175..b8ac082 100644
> --- a/lib/libalpm/add.c
> +++ b/lib/libalpm/add.c
> @@ -178,7 +178,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
>  	char filename[PATH_MAX]; /* the actual file we're extracting */
>  	int needbackup = 0, notouch = 0;
>  	const char *hash_orig = NULL;
> -	int errors = 0;
> +	int isnewfile = 0, errors = 0;
>  	struct stat lsbuf;
>  	size_t filename_len;
>  
> @@ -226,7 +226,8 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
>  	 *  6- skip extraction, dir already exists.
>  	 */
>  
> -	if(llstat(filename, &lsbuf) != 0) {
> +	isnewfile = (llstat(filename, &lsbuf) != 0 && errno == ENOENT);
> +	if(isnewfile) {

Unrelated change to the bug being fixed...  I would prefer that not to
be done in a pure bugfix release

Also, if llstat returns non-zero with any error other than ENOENT, I'd
guess the following operations on lsbuf will not be happy.

>  		/* cases 1,2: file doesn't exist, skip all backup checks */
>  	} else if(S_ISDIR(lsbuf.st_mode) && S_ISDIR(entrymode)) {
>  #if 0
> @@ -301,6 +302,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
>  			return 1;
>  		}
>  		strcpy(filename + filename_len, ".pacnew");
> +		isnewfile = (llstat(filename, &lsbuf) != 0 && errno == ENOENT);
>  	}
>  
>  	_alpm_log(handle, ALPM_LOG_DEBUG, "extracting %s\n", filename);
> @@ -354,7 +356,9 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
>  			 * including any user changes */
>  			_alpm_log(handle, ALPM_LOG_DEBUG,
>  					"action: leaving existing file in place\n");
> -			unlink(filename);
> +			if(isnewfile) {
> +				unlink(filename);
> +			}
>  		} else if(hash_orig && hash_local && strcmp(hash_orig, hash_local) == 0) {
>  			/* installed file has NOT been changed by user,
>  			 * update to the new version */
> 


More information about the pacman-dev mailing list