s/strdup/xstrdup/ - check memory allocations for failure.
[oweals/opkg-lede.git] / libopkg / opkg.c
index 0dff32b3b62d2d1dfa6425c808ab1b8dcf5e1c61..9cbbe906c65893ba3a5fa4cfcc6a4a424c089a06 100644 (file)
@@ -34,8 +34,6 @@
 
 #include <libbb/libbb.h>
 
-struct errlist* error_list;
-
 struct _opkg_t
 {
   args_t *args;
@@ -62,18 +60,14 @@ pkg_t_to_opkg_package_t (pkg_t *old)
 
   new = opkg_package_new ();
 
-#define sstrdup(x) (x) ? strdup (x) : NULL;
-
-  new->name = sstrdup (old->name);
+  new->name = xstrdup(old->name);
   new->version = pkg_version_str_alloc (old);
-  new->architecture = sstrdup (old->architecture);
+  new->architecture = xstrdup(old->architecture);
   if (old->src)
-    new->repository = sstrdup (old->src->name);
-  new->description = sstrdup (old->description);
-  new->tags = sstrdup (old->tags);
-  new->url = sstrdup (old->url);
-
-#undef sstrdup
+    new->repository = xstrdup(old->src->name);
+  new->description = xstrdup(old->description);
+  new->tags = xstrdup(old->tags);
+  new->url = xstrdup(old->url);
 
   new->size = (old->size) ? atoi (old->size) : 0;
   new->installed = (old->state_status == SS_INSTALLED);
@@ -249,6 +243,7 @@ opkg_re_read_config_files (opkg_t *opkg)
   a->autoremove = c->autoremove;
   a->force_depends = c->force_depends;
   a->force_defaults = c->force_defaults;
+  a->force_maintainer = c->force_maintainer;
   a->force_overwrite = c->force_overwrite;
   a->force_downgrade = c->force_downgrade;
   a->force_reinstall = c->force_reinstall;
@@ -262,25 +257,25 @@ opkg_re_read_config_files (opkg_t *opkg)
   if (c->offline_root)
   {
     if (a->offline_root) free (a->offline_root);
-    a->offline_root = strdup (c->offline_root);
+    a->offline_root = xstrdup(c->offline_root);
   }
 
   if (c->offline_root_pre_script_cmd)
   {
     if (a->offline_root_pre_script_cmd) free (a->offline_root_pre_script_cmd);
-    a->offline_root_pre_script_cmd = strdup (c->offline_root_pre_script_cmd);
+    a->offline_root_pre_script_cmd = xstrdup(c->offline_root_pre_script_cmd);
   }
 
   if (c->offline_root_post_script_cmd)
   {
     if (a->offline_root_post_script_cmd) free (a->offline_root_post_script_cmd);
-    a->offline_root_post_script_cmd = strdup (c->offline_root_post_script_cmd);
+    a->offline_root_post_script_cmd = xstrdup(c->offline_root_post_script_cmd);
   }
 
   if (c->cache) {
     if (a->cache)
        free (a->cache);
-    a->cache = strdup(c->cache);
+    a->cache = xstrdup(c->cache);
   }
 
   /* throw away old opkg_conf and start again */
@@ -329,7 +324,7 @@ opkg_get_option (opkg_t *opkg, char *option, void **value)
     return;
 
   case OPKG_OPT_TYPE_STRING:
-    *((char **)value) = strdup (options[i].value);
+    *((char **)value) = xstrdup(options[i].value);
     return;
   }
 
@@ -381,7 +376,7 @@ opkg_set_option (opkg_t *opkg, char *option, void *value)
     return;
 
   case OPKG_OPT_TYPE_STRING:
-    *((char **)options[i].value) = strdup (value);
+    *((char **)options[i].value) = xstrdup(value);
     return;
   }
 
@@ -530,6 +525,7 @@ opkg_install_package (opkg_t *opkg, const char *package_name, opkg_progress_call
       case OPKG_INSTALL_ERR_ALREADY_INSTALLED: return OPKG_PACKAGE_ALREADY_INSTALLED;
       case OPKG_INSTALL_ERR_SIGNATURE: return OPKG_GPG_ERROR;
       case OPKG_INSTALL_ERR_MD5: return OPKG_MD5_ERROR;
+      case OPKG_INSTALL_ERR_SHA256: return OPKG_SHA256_ERROR;
       default: return OPKG_UNKNOWN_ERROR;
     }
   }
@@ -669,6 +665,7 @@ opkg_upgrade_package (opkg_t *opkg, const char *package_name, opkg_progress_call
       case OPKG_INSTALL_ERR_ALREADY_INSTALLED: return OPKG_PACKAGE_ALREADY_INSTALLED;
       case OPKG_INSTALL_ERR_SIGNATURE: return OPKG_GPG_ERROR;
       case OPKG_INSTALL_ERR_MD5: return OPKG_MD5_ERROR;
+      case OPKG_INSTALL_ERR_SHA256: return OPKG_SHA256_ERROR;
       default: return OPKG_UNKNOWN_ERROR;
     }
   }
@@ -772,7 +769,7 @@ opkg_update_package_lists (opkg_t *opkg, opkg_progress_callback_t progress_callb
     }
   }
 
-  tmp = strdup ("/tmp/opkg.XXXXXX");
+  tmp = xstrdup("/tmp/opkg.XXXXXX");
 
   if (mkdtemp (tmp) == NULL)
   {
@@ -785,18 +782,16 @@ opkg_update_package_lists (opkg_t *opkg, opkg_progress_callback_t progress_callb
   /* count the number of sources so we can give some progress updates */
   sources_list_count = 0;
   sources_done = 0;
-  iter = opkg->conf->pkg_src_list.head;
-  while (iter)
+  list_for_each_entry(iter, &opkg->conf->pkg_src_list.head, node)
   {
     sources_list_count++;
-    iter = iter->next;
   }
 
-  for (iter = opkg->conf->pkg_src_list.head; iter; iter = iter->next)
+  list_for_each_entry(iter, &opkg->conf->pkg_src_list.head, node)
   {
     char *url, *list_file_name = NULL;
 
-    src = iter->data;
+    src = (pkg_src_t *)iter->data;
 
     if (src->extra_data)  /* debian style? */
       sprintf_alloc (&url, "%s/%s/%s", src->value, src->extra_data,
@@ -851,43 +846,45 @@ opkg_update_package_lists (opkg_t *opkg, opkg_progress_callback_t progress_callb
     }
     free (url);
 
-#ifdef HAVE_GPGME
-    char *sig_file_name;
-    /* download detached signitures to verify the package lists */
-    /* get the url for the sig file */
-    if (src->extra_data)  /* debian style? */
-      sprintf_alloc (&url, "%s/%s/%s", src->value, src->extra_data,
-                     "Packages.sig");
-    else
-      sprintf_alloc (&url, "%s/%s", src->value, "Packages.sig");
+#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
+    if ( opkg->conf->check_signature ) {
+        char *sig_file_name;
+        /* download detached signitures to verify the package lists */
+        /* get the url for the sig file */
+        if (src->extra_data)  /* debian style? */
+            sprintf_alloc (&url, "%s/%s/%s", src->value, src->extra_data,
+                    "Packages.sig");
+        else
+            sprintf_alloc (&url, "%s/%s", src->value, "Packages.sig");
 
-    /* create filename for signature */
-    sprintf_alloc (&sig_file_name, "%s/%s.sig", lists_dir, src->name);
+        /* create filename for signature */
+        sprintf_alloc (&sig_file_name, "%s/%s.sig", lists_dir, src->name);
 
-    /* make sure there is no existing signature file */
-    unlink (sig_file_name);
+        /* make sure there is no existing signature file */
+        unlink (sig_file_name);
 
-    err = opkg_download (opkg->conf, url, sig_file_name, NULL, NULL);
-    if (err)
-    {
-      /* XXX: Warning: Download failed */
-    }
-    else
-    {
-      int err;
-      err = opkg_verify_file (opkg->conf, list_file_name, sig_file_name);
-      if (err == 0)
-      {
-        /* XXX: Notice: Signature check passed */
-      }
-      else
-      {
-        /* XXX: Warning: Signature check failed */
-      }
+        err = opkg_download (opkg->conf, url, sig_file_name, NULL, NULL);
+        if (err)
+        {
+            /* XXX: Warning: Download failed */
+        }
+        else
+        {
+            int err;
+            err = opkg_verify_file (opkg->conf, list_file_name, sig_file_name);
+            if (err == 0)
+            {
+                /* XXX: Notice: Signature check passed */
+            }
+            else
+            {
+                /* XXX: Warning: Signature check failed */
+            }
+        }
+        free (sig_file_name);
+        free (list_file_name);
+        free (url);
     }
-    free (sig_file_name);
-    free (list_file_name);
-    free (url);
 #else
     /* XXX: Note: Signature check for %s skipped because GPG support was not
      * enabled in this build
@@ -1020,7 +1017,9 @@ opkg_find_package (opkg_t *opkg, const char *name, const char *ver, const char *
   return package;
 }
 
+#ifdef HAVE_CURL
 #include <curl/curl.h>
+#endif
 /**
  * @brief Check the accessibility of repositories. It will try to access the repository to check if the respository is accessible throught current network status. 
  * @param opkg The opkg_t
@@ -1040,17 +1039,17 @@ int opkg_repository_accessibility_check(opkg_t *opkg)
 
   src = str_list_alloc();
 
-  for (iter = opkg->conf->pkg_src_list.head; iter; iter = iter->next) 
+  list_for_each_entry(iter, &opkg->conf->pkg_src_list.head, node)
   {
-    if (strstr(iter->data->value, "://") && 
-                   index(strstr(iter->data->value, "://") + 3, '/')) 
-      stmp = strndup(iter->data->value, 
-                     (index(strstr(iter->data->value, "://") + 3, '/') - iter->data->value)*sizeof(char));
+    if (strstr(((pkg_src_t *)iter->data)->value, "://") && 
+                   index(strstr(((pkg_src_t *)iter->data)->value, "://") + 3, '/')) 
+      stmp = strndup(((pkg_src_t *)iter->data)->value, 
+                     (index(strstr(((pkg_src_t *)iter->data)->value, "://") + 3, '/') - ((pkg_src_t *)iter->data)->value)*sizeof(char));
 
     else
-      stmp = strdup(iter->data->value);
+      stmp = xstrdup(((pkg_src_t *)iter->data)->value);
 
-    for (iter1 = src->head; iter1; iter1 = iter1->next)
+    for (iter1 = str_list_first(src); iter1; iter1 = str_list_next(src, iter1))
     {
       if (strstr(iter1->data, stmp)) 
         break;
@@ -1062,6 +1061,7 @@ int opkg_repository_accessibility_check(opkg_t *opkg)
     free(stmp);
 
     str_list_append(src, repo_ptr);
+    free(repo_ptr);
     repositories++;
   }
   while (repositories > 0) 
@@ -1070,16 +1070,19 @@ int opkg_repository_accessibility_check(opkg_t *opkg)
     repositories--;
 
     err = opkg_download(opkg->conf, iter1->data, "/dev/null", NULL, NULL);
+#ifdef HAVE_CURL
     if (!(err == CURLE_OK || 
                err == CURLE_HTTP_RETURNED_ERROR || 
                err == CURLE_FILE_COULDNT_READ_FILE ||
                err == CURLE_REMOTE_FILE_NOT_FOUND || 
                err == CURLE_TFTP_NOTFOUND
                )) {
+#else
+    if (!(err == 0)) {
+#endif
            ret++;
     }
     str_list_elt_deinit(iter1);
-    free(iter1);
   }
   free(src);
   return ret;