the vararg list must be terminated with zero else 64bit machines may crash
authorRichard Hughes <richard@hughsie.com>
Mon, 30 Jun 2008 09:46:20 +0000 (10:46 +0100)
committerRichard Hughes <richard@hughsie.com>
Mon, 30 Jun 2008 09:46:20 +0000 (10:46 +0100)
On 64 bit systems, the integer 0 is 32 bits and the pointer 0 is 64 bits.
The upper 32 bits will not be cleared and the loop will never terminate.
Also add the RAZOR_SENTINEL __attribute__ ((__sentinel__(0))) on GCC4
so we catch where we get this wrong automatically.

This also fixes the new search functionality from James which was missed
in the merge.

librazor/iterator.c
librazor/razor.c
librazor/razor.h
librazor/transaction.c
src/main.c
src/rpm.c

index b2bddff..6b973b0 100644 (file)
@@ -112,7 +112,7 @@ razor_package_iterator_create_for_file(struct razor_set *set,
  * @package: a %razor_package
  *
  * Gets the next iteratr along with any vararg data.
- * The vararg must be terminated with zero.
+ * The vararg must be terminated with NULL.
  *
  * Example: razor_package_iterator_next (pi, package, RAZOR_DETAIL_NAME, &name, 0);
  **/
@@ -273,7 +273,7 @@ razor_package_query_add_iterator(struct razor_package_query *pq,
        assert (pi != NULL);
 
        packages = pq->set->packages.data;
-       while (razor_package_iterator_next(pi, &p, 0)) {
+       while (razor_package_iterator_next(pi, &p, NULL)) {
                pq->count += pq->vector[p - packages] ^ 1;
                pq->vector[p - packages] = 1;
        }
index d3cab33..6f5b1b5 100644 (file)
@@ -394,7 +394,7 @@ razor_set_get_package(struct razor_set *set, const char *package)
        assert (package != NULL);
 
        pi = razor_package_iterator_create(set);
-       while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, 0)) {
+       while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, NULL)) {
                if (strcmp(package, name) == 0)
                        break;
        }
@@ -476,7 +476,7 @@ razor_package_get_details_varg(struct razor_set *set,
  * @package: a %razor_package
  *
  * Gets details about a package using a varg interface
- * The vararg must be terminated with zero.
+ * The vararg must be terminated with %NULL.
  *
  * Example: razor_package_get_details (set, package, RAZOR_DETAIL_URL, &url, 0);
  **/
@@ -721,12 +721,12 @@ razor_set_diff(struct razor_set *set, struct razor_set *upstream,
                                    RAZOR_DETAIL_NAME, &name1,
                                    RAZOR_DETAIL_VERSION, &version1,
                                    RAZOR_DETAIL_ARCH, &arch1,
-                                   0);
+                                   NULL);
        razor_package_iterator_next(pi2, &p2,
                                    RAZOR_DETAIL_NAME, &name2,
                                    RAZOR_DETAIL_VERSION, &version2,
                                    RAZOR_DETAIL_ARCH, &arch2,
-                                   0);
+                                   NULL);
 
        while (p1 || p2) {
                if (p1 && p2) {
@@ -749,13 +749,13 @@ razor_set_diff(struct razor_set *set, struct razor_set *upstream,
                                                    RAZOR_DETAIL_NAME, &name1,
                                                    RAZOR_DETAIL_VERSION, &version1,
                                                    RAZOR_DETAIL_ARCH, &arch1,
-                                                   0);
+                                                   NULL);
                if (p2 != NULL && res >= 0)
                        razor_package_iterator_next(pi2, &p2,
                                                    RAZOR_DETAIL_NAME, &name2,
                                                    RAZOR_DETAIL_VERSION, &version2,
                                                    RAZOR_DETAIL_ARCH, &arch2,
-                                                   0);
+                                                   NULL);
        }
 
        razor_package_iterator_destroy(pi1);
index 9f3c668..488b4ed 100644 (file)
 
 #include <stdint.h>
 
+/* GCC sentinel */
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define RAZOR_SENTINEL __attribute__ ((__sentinel__(0)));
+#else
+#define RAZOR_SENTINEL
+#endif
+
 enum razor_repo_file_type {
        RAZOR_REPO_FILE_MAIN,
        RAZOR_REPO_FILE_DETAILS,
@@ -29,7 +36,7 @@ enum razor_repo_file_type {
 };
 
 enum razor_detail_type {
-       RAZOR_DETAIL_NAME = 1, /* 0 is the marker for the vararg */
+       RAZOR_DETAIL_NAME = 1, /* NULL (0 on 32 bit) is the sentinel */
        RAZOR_DETAIL_VERSION,
        RAZOR_DETAIL_ARCH,
        RAZOR_DETAIL_SUMMARY,
@@ -94,7 +101,9 @@ struct razor_package *
 razor_set_get_package(struct razor_set *set, const char *package);
 
 void
-razor_package_get_details(struct razor_set *set, struct razor_package *package, ...);
+razor_package_get_details(struct razor_set *set,
+                         struct razor_package *package, ...)
+                         RAZOR_SENTINEL;
 
 
 /**
@@ -144,7 +153,8 @@ razor_package_iterator_create_for_file(struct razor_set *set,
                                       const char *filename);
 
 int razor_package_iterator_next(struct razor_package_iterator *pi,
-                               struct razor_package **package, ...);
+                               struct razor_package **package, ...)
+                               RAZOR_SENTINEL;
 void razor_package_iterator_destroy(struct razor_package_iterator *pi);
 
 struct razor_package_query *
index 9efd5cd..1e91cae 100644 (file)
@@ -318,7 +318,7 @@ remove_matching_providers(struct razor_transaction *trans,
                razor_package_iterator_init_for_property(&pkg_iter, set, p);
                while (razor_package_iterator_next(&pkg_iter, &pkg,
                                                   RAZOR_DETAIL_NAME, &n,
-                                                  RAZOR_DETAIL_VERSION, &v, 0)) {
+                                                  RAZOR_DETAIL_VERSION, &v, NULL)) {
                        fprintf(stderr, "removing %s-%s\n", n, v);
                        razor_transaction_remove_package(trans, pkg);
                }
@@ -364,7 +364,7 @@ flag_matching_providers(struct razor_transaction *trans,
                razor_package_iterator_init_for_property(&pkg_iter, set, p);
                while (razor_package_iterator_next(&pkg_iter, &pkg,
                                                   RAZOR_DETAIL_NAME, &name,
-                                                  RAZOR_DETAIL_VERSION, &version, 0)) {
+                                                  RAZOR_DETAIL_VERSION, &version, NULL)) {
 
                        fprintf(stderr, "flagging %s-%s for providing %s matching %s %s\n",
                                name, version,
@@ -526,7 +526,7 @@ update_unsatisfied_packages(struct razor_transaction *trans)
                                                         trans->system.set,
                                                         sp);
                while (razor_package_iterator_next(&pkg_iter, &pkg,
-                                                  RAZOR_DETAIL_NAME, &name, 0)) {
+                                                  RAZOR_DETAIL_NAME, &name, NULL)) {
                        fprintf(stderr, "updating %s because %s %s %s "
                                "isn't satisfied\n",
                                name, spi.pool + sp->name,
@@ -578,7 +578,7 @@ update_conflicted_packages(struct razor_transaction *trans)
                                                         sp);
                while (razor_package_iterator_next(&pkg_iter, &pkg,
                                                   RAZOR_DETAIL_NAME, &name,
-                                                  RAZOR_DETAIL_VERSION, &version, 0)) {
+                                                  RAZOR_DETAIL_VERSION, &version, NULL)) {
                        fprintf(stderr, "updating %s %s because it "
                                "conflicts with %s\n",
                                name, version, spi.pool + sp->name);
@@ -668,7 +668,7 @@ flush_scheduled_system_updates(struct razor_transaction *trans)
 
        while (razor_package_iterator_next(pi, &p,
                                           RAZOR_DETAIL_NAME, &name,
-                                          RAZOR_DETAIL_VERSION, &version, 0)) {
+                                          RAZOR_DETAIL_VERSION, &version, NULL)) {
                if (!(trans->system.packages[p - spkgs] & TRANS_PACKAGE_UPDATE))
                        continue;
 
@@ -705,7 +705,7 @@ flush_scheduled_upstream_updates(struct razor_transaction *trans)
 
        while (razor_package_iterator_next(pi, &p,
                                           RAZOR_DETAIL_NAME, &name,
-                                          RAZOR_DETAIL_VERSION, &version, 0)) {
+                                          RAZOR_DETAIL_VERSION, &version, NULL)) {
                if (!(trans->upstream.packages[p - upkgs] & TRANS_PACKAGE_UPDATE))
                        continue;
 
@@ -754,7 +754,7 @@ describe_unsatisfied(struct razor_set *set, struct razor_property *rp)
                while (razor_package_iterator_next(&pi, &pkg,
                                                   RAZOR_DETAIL_NAME, &name,
                                                   RAZOR_DETAIL_VERSION, &version,
-                                                  RAZOR_DETAIL_ARCH, &arch, 0))
+                                                  RAZOR_DETAIL_ARCH, &arch, NULL))
                        fprintf(stderr, "%s is needed by %s-%s.%s\n",
                                &pool[rp->name],
                                name, version, arch);
@@ -763,7 +763,7 @@ describe_unsatisfied(struct razor_set *set, struct razor_property *rp)
                while (razor_package_iterator_next(&pi, &pkg,
                                                   RAZOR_DETAIL_NAME, &name,
                                                   RAZOR_DETAIL_VERSION, &version,
-                                                  RAZOR_DETAIL_ARCH, &arch, 0))
+                                                  RAZOR_DETAIL_ARCH, &arch, NULL))
                        fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
                                &pool[rp->name],
                                razor_property_relation_to_string(rp),
index 56b3b2c..7fd0f51 100644 (file)
@@ -59,7 +59,7 @@ create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[])
                iter = razor_package_iterator_create(set);
                pattern = argv[i];
                count = 0;
-               while (razor_package_iterator_next(iter, &package, RAZOR_DETAIL_NAME, &name, 0)) {
+               while (razor_package_iterator_next(iter, &package, RAZOR_DETAIL_NAME, &name, NULL)) {
                        if (fnmatch(pattern, name, 0) != 0)
                                continue;
 
@@ -87,7 +87,7 @@ list_packages(struct razor_package_iterator *iter, uint32_t flags)
        while (razor_package_iterator_next(iter, &package,
                                           RAZOR_DETAIL_NAME, &name,
                                           RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch, 0)) {
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                if (flags & LIST_PACKAGES_ONLY_NAMES)
                        printf("%s\n", name);
                else
@@ -431,7 +431,7 @@ mark_packages_for_update(struct razor_transaction *trans,
 
        pi = razor_package_iterator_create(set);
        while (razor_package_iterator_next(pi, &package,
-                                          RAZOR_DETAIL_NAME, &name, 0)) {
+                                          RAZOR_DETAIL_NAME, &name, NULL)) {
                if (pattern && fnmatch(pattern, name, 0) == 0) {
                        razor_transaction_update_package(trans, package);
                        matches++;
@@ -452,7 +452,7 @@ mark_packages_for_removal(struct razor_transaction *trans,
        int matches = 0;
 
        pi = razor_package_iterator_create(set);
-       while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, 0)) {
+       while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, NULL)) {
                if (pattern && fnmatch(pattern, name, 0) == 0) {
                        razor_transaction_remove_package(trans, package);
                        matches++;
@@ -662,7 +662,7 @@ download_packages(struct razor_set *system, struct razor_set *next)
        while (razor_package_iterator_next(pi, &package,
                                           RAZOR_DETAIL_NAME, &name,
                                           RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch, 0)) {
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                snprintf(url, sizeof url,
                         "%s/Packages/%s",
                         yum_url, rpm_filename(name, version, arch));
@@ -694,7 +694,7 @@ install_packages(struct razor_set *system, struct razor_set *next)
        while (razor_package_iterator_next(pi, &package,
                                           RAZOR_DETAIL_NAME, &name,
                                           RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch, 0)) {
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                printf("install %s-%s\n", name, version);
 
                snprintf(file, sizeof file,
@@ -802,7 +802,7 @@ command_download(int argc, const char *argv[])
        while (razor_package_iterator_next(pi, &package,
                                           RAZOR_DETAIL_NAME, &name,
                                           RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch, 0)) {
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                if (pattern && fnmatch(pattern, name, 0) != 0)
                        continue;
 
@@ -845,7 +845,7 @@ command_info(int argc, const char *argv[])
        while (razor_package_iterator_next(pi, &package,
                                           RAZOR_DETAIL_NAME, &name,
                                           RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch, 0)) {
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                if (pattern && fnmatch(pattern, name, 0) != 0)
                        continue;
 
@@ -854,7 +854,7 @@ command_info(int argc, const char *argv[])
                                           RAZOR_DETAIL_DESCRIPTION, &description,
                                           RAZOR_DETAIL_URL, &url,
                                           RAZOR_DETAIL_LICENSE, &license,
-                                          0);
+                                          NULL);
 
                printf ("Name:        %s\n", name);
                printf ("Arch:        %s\n", arch);
@@ -899,13 +899,18 @@ command_search(int argc, const char *argv[])
 
        pi = razor_package_iterator_create(set);
        while (razor_package_iterator_next(pi, &package,
-                                          &name, &version, &arch)) {
+                                          RAZOR_DETAIL_NAME, &name,
+                                          RAZOR_DETAIL_VERSION, &version,
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                if (!fnmatch(pattern, name, 0))
                        printf("%s-%s.%s\n", name, version, arch);
                else {
-                       razor_package_get_details (set, package, &summary,
-                                                  &description, &url,
-                                                  &license);
+                       razor_package_get_details (set, package,
+                                                  RAZOR_DETAIL_SUMMARY, &summary,
+                                                  RAZOR_DETAIL_DESCRIPTION, &description,
+                                                  RAZOR_DETAIL_URL, &url,
+                                                  RAZOR_DETAIL_LICENSE, &license,
+                                                  NULL);
                        if (!fnmatch(pattern, url, 0) ||
                            !fnmatch(pattern, summary, 0) ||
                            !fnmatch(pattern, description, 0))
index 76f2414..f752aa9 100644 (file)
--- a/src/rpm.c
+++ b/src/rpm.c
@@ -313,7 +313,7 @@ add_command_line_packages(struct razor_set *set,
        pi = razor_package_iterator_create(set);
 
        while (razor_package_iterator_next(pi, &package,
-                                          RAZOR_DETAIL_NAME, &name, 0)) {
+                                          RAZOR_DETAIL_NAME, &name, NULL)) {
                while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
                        fprintf(stderr, "error: package %s is not installed\n",
                                argv[i]);
@@ -422,7 +422,7 @@ print_package_info(struct razor_set *set, struct razor_package *package,
                                   RAZOR_DETAIL_DESCRIPTION, &description,
                                   RAZOR_DETAIL_URL, &url,
                                   RAZOR_DETAIL_LICENSE, &license,
-                                  0);
+                                  NULL);
 
        printf("Name:        %s\n", name);
        printf("Arch:        %s\n", arch);
@@ -494,7 +494,7 @@ command_query(int argc, const char *argv[])
        while (razor_package_iterator_next(pi, &package,
                                           RAZOR_DETAIL_NAME, &name,
                                           RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch, 0)) {
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                if (option_conflicts)
                        print_package_properties(set, package,
                                                 RAZOR_PROPERTY_CONFLICTS);
@@ -548,7 +548,7 @@ command_verify(int argc, const char *argv[])
        while (razor_package_iterator_next(pi, &package,
                                           RAZOR_DETAIL_NAME, &name,
                                           RAZOR_DETAIL_VERSION, &version,
-                                          RAZOR_DETAIL_ARCH, &arch, 0)) {
+                                          RAZOR_DETAIL_ARCH, &arch, NULL)) {
                printf("verify %s-%s.%s - not implemented\n",
                       name, version, arch);
        }
@@ -593,7 +593,7 @@ command_erase(int argc, const char *argv[])
        add_command_line_packages(set, query, argc, argv);
 
        pi = razor_package_query_finish(query);
-       while (razor_package_iterator_next(pi, &package, 0))
+       while (razor_package_iterator_next(pi, &package, NULL))
                razor_transaction_remove_package(trans, package);
        razor_package_iterator_destroy(pi);
 
@@ -635,7 +635,7 @@ command_install(int argc, const char *argv[])
        trans = razor_transaction_create(set, upstream);
 
        pi = razor_package_iterator_create(upstream);
-       while (razor_package_iterator_next(pi, &package, 0))
+       while (razor_package_iterator_next(pi, &package, NULL))
                razor_transaction_install_package(trans, package);
        razor_package_iterator_destroy(pi);
 
@@ -677,7 +677,7 @@ command_update(int argc, const char *argv[])
        trans = razor_transaction_create(set, upstream);
 
        pi = razor_package_iterator_create(upstream);
-       while (razor_package_iterator_next(pi, &package, 0))
+       while (razor_package_iterator_next(pi, &package, NULL))
                razor_transaction_update_package(trans, package);
        razor_package_iterator_destroy(pi);