libopkg: check for file size mismatches
[oweals/opkg-lede.git] / libopkg / opkg_install.c
index a2f97c96a321a62c56d32b8683c62c88ecb06718..0b7f1f1cdccfe7c223a661d24208fc29daf49958 100644 (file)
@@ -45,7 +45,7 @@ static int satisfy_dependencies_for(pkg_t * pkg)
        int i, err;
        pkg_vec_t *depends = pkg_vec_alloc();
        pkg_t *dep;
-       char **tmp, **unresolved = NULL;
+       char **tmp, **unresolved = NULL, *prev = NULL;
        int ndepends;
 
        ndepends = pkg_hash_fetch_unsatisfied_dependencies(pkg, depends,
@@ -57,12 +57,17 @@ static int satisfy_dependencies_for(pkg_t * pkg)
                         pkg->name);
                tmp = unresolved;
                while (*unresolved) {
-                       opkg_message(ERROR, "\t%s", *unresolved);
+                       if (!prev || strcmp(*unresolved, prev))
+                               opkg_message(ERROR, "\t%s\n", *unresolved);
+                       prev = *unresolved;
+                       unresolved++;
+               }
+               unresolved = tmp;
+               while (*unresolved) {
                        free(*unresolved);
                        unresolved++;
                }
                free(tmp);
-               opkg_message(ERROR, "\n");
                if (!conf->force_depends) {
                        opkg_msg(INFO,
                                 "This could mean that your package list is out of date or that the packages\n"
@@ -884,8 +889,6 @@ static int check_data_file_clashes_change(pkg_t * pkg, pkg_t * old_pkg)
        str_list_t *files_list;
        str_list_elt_t *iter, *niter;
 
-       char *root_filename = NULL;
-
        files_list = pkg_get_installed_files(pkg);
        if (files_list == NULL)
                return -1;
@@ -894,12 +897,7 @@ static int check_data_file_clashes_change(pkg_t * pkg, pkg_t * old_pkg)
             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(filename);
-               if (file_exists(root_filename) && (!file_is_dir(root_filename))) {
+               if (file_exists(filename) && (!file_is_dir(filename))) {
                        pkg_t *owner;
 
                        owner = file_hash_get_file_owner(filename);
@@ -926,10 +924,6 @@ static int check_data_file_clashes_change(pkg_t * pkg, pkg_t * old_pkg)
 
                }
        }
-       if (root_filename) {
-               free(root_filename);
-               root_filename = NULL;
-       }
        pkg_free_installed_files(pkg);
 
        return 0;
@@ -1090,13 +1084,6 @@ static int install_data_files(pkg_t * pkg)
                return err;
        }
 
-       /* The "Essential" control field may only be present in the control
-        * file and not in the Packages list. Ensure we capture it regardless.
-        *
-        * XXX: This should be fixed outside of opkg, in the Package list.
-        */
-       set_flags_from_control(pkg);
-
        opkg_msg(DEBUG, "Calling pkg_write_filelist.\n");
        err = pkg_write_filelist(pkg);
        if (err)
@@ -1268,6 +1255,7 @@ int opkg_install_pkg(pkg_t * pkg, int from_upgrade)
        char *file_sha256, *pkg_sha256;
        sigset_t newset, oldset;
        const char *local_filename;
+       struct stat pkg_stat;
        time_t now;
 
        if (from_upgrade)
@@ -1344,7 +1332,7 @@ int opkg_install_pkg(pkg_t * pkg, int from_upgrade)
        }
 
        /* check that the repository is valid */
-#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) || defined(HAVE_USIGN)
+#if defined(HAVE_USIGN)
        char *list_file_name, *sig_file_name, *lists_dir;
 
        /* check to ensure the package has come from a repository */
@@ -1379,6 +1367,29 @@ int opkg_install_pkg(pkg_t * pkg, int from_upgrade)
        }
 #endif
 
+       /* Check file size */
+       err = lstat(local_filename, &pkg_stat);
+
+       if (err) {
+               opkg_msg(ERROR, "Failed to stat %s: %s\n",
+                        local_filename, strerror(errno));
+               return -1;
+       }
+
+       if (pkg_stat.st_size != pkg_get_int(pkg, PKG_SIZE)) {
+               if (!conf->force_checksum) {
+                       opkg_msg(ERROR,
+                                "Package size mismatch: %s is %lld bytes, expecting %lld bytes\n",
+                                pkg->name, (long long int)pkg_stat.st_size,
+                                (long long int)pkg_get_int(pkg, PKG_SIZE));
+                       return -1;
+               } else {
+                       opkg_msg(NOTICE,
+                                "Ignored %s size mismatch.\n",
+                                pkg->name);
+               }
+       }
+
        /* Check for md5 values */
        pkg_md5 = pkg_get_md5(pkg);
        if (pkg_md5) {