[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