# HG changeset patch # User Richard Hughes # Date 1214819180 -3600 # Node ID bf23ba00db03aa741af9f09eb22e5b8bef71aed6 # Parent 2d450078e46ec48cf10256e840c4233fcdc4d564 the vararg list must be terminated with zero else 64bit machines may crash 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. diff -r 2d450078e46e -r bf23ba00db03 librazor/iterator.c --- a/librazor/iterator.c Mon Jun 30 09:47:32 2008 +0100 +++ b/librazor/iterator.c Mon Jun 30 10:46:20 2008 +0100 @@ -112,7 +112,7 @@ * @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 @@ 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; } diff -r 2d450078e46e -r bf23ba00db03 librazor/razor.c --- a/librazor/razor.c Mon Jun 30 09:47:32 2008 +0100 +++ b/librazor/razor.c Mon Jun 30 10:46:20 2008 +0100 @@ -394,7 +394,7 @@ 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 @@ * @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_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_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); diff -r 2d450078e46e -r bf23ba00db03 librazor/razor.h --- a/librazor/razor.h Mon Jun 30 09:47:32 2008 +0100 +++ b/librazor/razor.h Mon Jun 30 10:46:20 2008 +0100 @@ -22,6 +22,13 @@ #include +/* 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_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 @@ 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 @@ 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 * diff -r 2d450078e46e -r bf23ba00db03 librazor/transaction.c --- a/librazor/transaction.c Mon Jun 30 09:47:32 2008 +0100 +++ b/librazor/transaction.c Mon Jun 30 10:46:20 2008 +0100 @@ -318,7 +318,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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), diff -r 2d450078e46e -r bf23ba00db03 src/main.c --- a/src/main.c Mon Jun 30 09:47:32 2008 +0100 +++ b/src/main.c Mon Jun 30 10:46:20 2008 +0100 @@ -59,7 +59,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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)) diff -r 2d450078e46e -r bf23ba00db03 src/rpm.c --- a/src/rpm.c Mon Jun 30 09:47:32 2008 +0100 +++ b/src/rpm.c Mon Jun 30 10:46:20 2008 +0100 @@ -313,7 +313,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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);