While installing a pkg, remove files with wrong hash before unpacking.
This commit is contained in:
parent
7e4118a6e2
commit
7c6119427c
@ -23,12 +23,14 @@
|
|||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <xbps_api.h>
|
#include <xbps_api.h>
|
||||||
#include "xbps_api_impl.h"
|
#include "xbps_api_impl.h"
|
||||||
@ -143,6 +145,33 @@ remove_metafile(const char *file, const char *pkgname, const char *version)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remove_file_wrong_hash(prop_dictionary_t d, const char *file)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
const char *hash;
|
||||||
|
int rv = 0;
|
||||||
|
|
||||||
|
if (stat(file, &st) == -1)
|
||||||
|
if (errno != ENOENT)
|
||||||
|
return errno;
|
||||||
|
|
||||||
|
if (!S_ISREG(st.st_mode))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Only check for regular files, not symlinks, dirs or conffiles. */
|
||||||
|
hash = xbps_get_file_hash_from_dict(d, "files", file);
|
||||||
|
if (hash) {
|
||||||
|
rv = xbps_check_file_hash(file, hash);
|
||||||
|
if (rv == ERANGE) {
|
||||||
|
(void)unlink(file);
|
||||||
|
xbps_warn_printf("Removed `%s' entry with "
|
||||||
|
"with unmatched hash.\n", file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Execute the unpack progress function callback if set and its
|
* Execute the unpack progress function callback if set and its
|
||||||
* private data is also set. It's so sad that
|
* private data is also set. It's so sad that
|
||||||
@ -376,6 +405,21 @@ unpack_archive(prop_dictionary_t pkg_repod,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Check if current entry already exists on disk and
|
||||||
|
* if the sha256 hash doesn't match, remove the file.
|
||||||
|
* Only do this if we are _installing_ a package.
|
||||||
|
*/
|
||||||
|
if (!update) {
|
||||||
|
rv = remove_file_wrong_hash(filesd, entry_pname);
|
||||||
|
if (rv != 0) {
|
||||||
|
xbps_dbg_printf("remove_file_wrong_hash "
|
||||||
|
"failed for `%s': %s\n", entry_pname,
|
||||||
|
strerror(rv));
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extract entry from archive.
|
* Extract entry from archive.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user