X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fopkg_install.c;h=8ced15aa36222a323726a2735909d2589e5cf144;hp=5f154a5128f0179edf0dfc39090dce097618222a;hb=a1fc2ffe4491e0df37bb173e0d452c3b2b3ec498;hpb=5befdf4fce0a650193b32f618514de327543148e diff --git a/libopkg/opkg_install.c b/libopkg/opkg_install.c index 5f154a5..8ced15a 100644 --- a/libopkg/opkg_install.c +++ b/libopkg/opkg_install.c @@ -138,7 +138,7 @@ int opkg_install_from_file(opkg_conf_t *conf, const char *filename) opkg_error_t opkg_install_by_name(opkg_conf_t *conf, const char *pkg_name) { - int cmp, err; + int cmp, err = 0; pkg_t *old, *new; char *old_version, *new_version; @@ -432,9 +432,11 @@ static int check_conflicts_for(opkg_conf_t *conf, pkg_t *pkg) static int update_file_ownership(opkg_conf_t *conf, pkg_t *new_pkg, pkg_t *old_pkg) { str_list_t *new_list = pkg_get_installed_files(new_pkg); - str_list_elt_t *iter; + str_list_elt_t *iter, *niter; - for (iter = str_list_first(new_list); iter; iter = str_list_next(new_list, iter)) { + for (iter = str_list_first(new_list), niter = str_list_next(new_list, iter); + iter; + iter = niter, niter = str_list_next(new_list, niter)) { char *new_file = (char *)iter->data; pkg_t *owner = file_hash_get_file_owner(conf, new_file); if (!new_file) @@ -444,7 +446,9 @@ static int update_file_ownership(opkg_conf_t *conf, pkg_t *new_pkg, pkg_t *old_p } if (old_pkg) { str_list_t *old_list = pkg_get_installed_files(old_pkg); - for (iter = str_list_first(old_list); iter; iter = str_list_next(old_list, iter)) { + for (iter = str_list_first(old_list), niter = str_list_next(old_list, iter); + iter; + iter = niter, niter = str_list_next(old_list, niter)) { char *old_file = (char *)iter->data; pkg_t *owner = file_hash_get_file_owner(conf, old_file); if (owner == old_pkg) { @@ -471,9 +475,11 @@ static int verify_pkg_installable(opkg_conf_t *conf, pkg_t *pkg) * 3) return a proper error code instead of 1 */ int comp_size, blocks_available; + char *root_dir; if (!conf->force_space && pkg->installed_size != NULL) { - blocks_available = get_available_blocks(conf->default_dest->root_dir); + root_dir = pkg->dest ? pkg->dest->root_dir : conf->default_dest->root_dir; + blocks_available = get_available_blocks(root_dir); comp_size = strtoul(pkg->installed_size, NULL, 0); /* round up a blocks count without doing fancy-but-slow casting jazz */ @@ -482,7 +488,7 @@ static int verify_pkg_installable(opkg_conf_t *conf, pkg_t *pkg) if (comp_size >= blocks_available) { opkg_message(conf, OPKG_ERROR, "Only have %d available blocks on filesystem %s, pkg %s needs %d\n", - blocks_available, conf->default_dest->root_dir, pkg->name, comp_size); + blocks_available, root_dir, pkg->name, comp_size); return ENOSPC; } } @@ -760,6 +766,9 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) abstract_pkg_t *ab_pkg = NULL; int old_state_flag; char* file_md5; +#ifdef HAVE_SHA256 + char* file_sha256; +#endif char *pkgid; if ( from_upgrade ) @@ -828,11 +837,11 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) } /* check that the repository is valid */ - #if HAVE_GPGME + #if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) char *list_file_name, *sig_file_name, *lists_dir; /* check to ensure the package has come from a repository */ - if (pkg->src) + if (conf->check_signature && pkg->src) { sprintf_alloc (&lists_dir, "%s", (conf->restrict_to_default_dest) @@ -843,8 +852,15 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) if (file_exists (sig_file_name)) { - if (opkg_verify_file (conf, list_file_name, sig_file_name)) + if (opkg_verify_file (conf, list_file_name, sig_file_name)){ + opkg_message(conf, OPKG_ERROR, "Failed to verify the signature of: %s\n", + list_file_name); return OPKG_INSTALL_ERR_SIGNATURE; + } + }else{ + opkg_message(conf, OPKG_ERROR, "Signature file is missing. " + "Perhaps you need to run 'opkg update'?\n"); + return OPKG_INSTALL_ERR_SIGNATURE; } free (lists_dir); @@ -868,6 +884,22 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) free(file_md5); } +#ifdef HAVE_SHA256 + /* Check for sha256 value */ + if(pkg->sha256sum) + { + file_sha256 = file_sha256sum_alloc(pkg->local_filename); + if (strcmp(file_sha256, pkg->sha256sum)) + { + opkg_message(conf, OPKG_ERROR, + "Package %s sha256sum mismatch. Either the opkg or the package index are corrupt. Try 'opkg update'.\n", + pkg->name); + free(file_sha256); + return OPKG_INSTALL_ERR_SHA256; + } + } +#endif + if (pkg->tmp_unpack_dir == NULL) { unpack_pkg_control_files(conf, pkg); } @@ -1217,12 +1249,14 @@ static int check_data_file_clashes(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old_pkg other package. */ str_list_t *files_list; - str_list_elt_t *iter; + str_list_elt_t *iter, *niter; int clashes = 0; files_list = pkg_get_installed_files(pkg); - for (iter = str_list_first(files_list); iter; iter = str_list_next(files_list, iter)) { + for (iter = str_list_first(files_list), niter = str_list_next(files_list, iter); + iter; + iter = niter, niter = str_list_next(files_list, iter)) { char *root_filename; char *filename = (char *) iter->data; root_filename = root_filename_alloc(conf, filename); @@ -1304,25 +1338,33 @@ static int check_data_file_clashes_change(opkg_conf_t *conf, pkg_t *pkg, pkg_t * @@@ To change after 1.0 release. */ str_list_t *files_list; - str_list_elt_t *iter; + str_list_elt_t *iter, *niter; + + char *root_filename = NULL; int clashes = 0; files_list = pkg_get_installed_files(pkg); - for (iter = str_list_first(files_list); iter; iter = str_list_next(files_list, iter)) { - char *root_filename; + for (iter = str_list_first(files_list), niter = str_list_next(files_list, iter); + iter; + iter = niter, niter = str_list_next(files_list, niter)) { char *filename = (char *) iter->data; + if (root_filename) { + free(root_filename); + root_filename = NULL; + } root_filename = root_filename_alloc(conf, filename); if (file_exists(root_filename) && (! file_is_dir(root_filename))) { pkg_t *owner; + owner = file_hash_get_file_owner(conf, filename); + if (conf->force_overwrite) { /* but we need to change who owns this file */ file_hash_set_file_owner(conf, filename, pkg); continue; } - owner = file_hash_get_file_owner(conf, filename); /* Pre-existing files are OK if owned by a package replaced by new pkg. */ if (owner) { @@ -1336,7 +1378,10 @@ static int check_data_file_clashes_change(opkg_conf_t *conf, pkg_t *pkg, pkg_t * } } - free(root_filename); + } + if (root_filename) { + free(root_filename); + root_filename = NULL; } pkg_free_installed_files(pkg); @@ -1571,18 +1616,20 @@ static int resolve_conffiles(opkg_conf_t *conf, pkg_t *pkg) cf_backup = backup_filename_alloc(root_filename); - if (file_exists(cf_backup)) { - /* Let's compute md5 to test if files are changed */ - md5sum = file_md5sum_alloc(cf_backup); - if (strcmp( cf->value,md5sum) != 0 ) { - if (conf->force_defaults - || user_prefers_old_conffile(cf->name, cf_backup) ) { - rename(cf_backup, root_filename); - } - } - unlink(cf_backup); - free(md5sum); - } + if (file_exists(cf_backup)) { + /* Let's compute md5 to test if files are changed */ + md5sum = file_md5sum_alloc(cf_backup); + if (strcmp( cf->value,md5sum) != 0 ) { + if (conf->force_maintainer) { + opkg_message(conf, OPKG_NOTICE, "Conffile %s using maintainer's setting.\n", cf_backup); + } else if (conf->force_defaults + || user_prefers_old_conffile(cf->name, cf_backup) ) { + rename(cf_backup, root_filename); + } + } + unlink(cf_backup); + free(md5sum); + } free(cf_backup); free(root_filename);