the vararg list must be terminated with zero else 64bit machines may crash
authorRichard Hughes <richard@hughsie.com>
Mon Jun 30 10:46:20 2008 +0100 (2008-06-30)
changeset 304bf23ba00db03
parent 303 2d450078e46e
child 305 e10b4f060a9d
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.
librazor/iterator.c
librazor/razor.c
librazor/razor.h
librazor/transaction.c
src/main.c
src/rpm.c
     1.1 --- a/librazor/iterator.c	Mon Jun 30 09:47:32 2008 +0100
     1.2 +++ b/librazor/iterator.c	Mon Jun 30 10:46:20 2008 +0100
     1.3 @@ -112,7 +112,7 @@
     1.4   * @package: a %razor_package
     1.5   *
     1.6   * Gets the next iteratr along with any vararg data.
     1.7 - * The vararg must be terminated with zero.
     1.8 + * The vararg must be terminated with NULL.
     1.9   *
    1.10   * Example: razor_package_iterator_next (pi, package, RAZOR_DETAIL_NAME, &name, 0);
    1.11   **/
    1.12 @@ -273,7 +273,7 @@
    1.13  	assert (pi != NULL);
    1.14  
    1.15  	packages = pq->set->packages.data;
    1.16 -	while (razor_package_iterator_next(pi, &p, 0)) {
    1.17 +	while (razor_package_iterator_next(pi, &p, NULL)) {
    1.18  		pq->count += pq->vector[p - packages] ^ 1;
    1.19  		pq->vector[p - packages] = 1;
    1.20  	}
     2.1 --- a/librazor/razor.c	Mon Jun 30 09:47:32 2008 +0100
     2.2 +++ b/librazor/razor.c	Mon Jun 30 10:46:20 2008 +0100
     2.3 @@ -394,7 +394,7 @@
     2.4  	assert (package != NULL);
     2.5  
     2.6  	pi = razor_package_iterator_create(set);
     2.7 -	while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, 0)) {
     2.8 +	while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, NULL)) {
     2.9  		if (strcmp(package, name) == 0)
    2.10  			break;
    2.11  	}
    2.12 @@ -476,7 +476,7 @@
    2.13   * @package: a %razor_package
    2.14   *
    2.15   * Gets details about a package using a varg interface
    2.16 - * The vararg must be terminated with zero.
    2.17 + * The vararg must be terminated with %NULL.
    2.18   *
    2.19   * Example: razor_package_get_details (set, package, RAZOR_DETAIL_URL, &url, 0);
    2.20   **/
    2.21 @@ -721,12 +721,12 @@
    2.22  				    RAZOR_DETAIL_NAME, &name1,
    2.23  				    RAZOR_DETAIL_VERSION, &version1,
    2.24  				    RAZOR_DETAIL_ARCH, &arch1,
    2.25 -				    0);
    2.26 +				    NULL);
    2.27  	razor_package_iterator_next(pi2, &p2,
    2.28  				    RAZOR_DETAIL_NAME, &name2,
    2.29  				    RAZOR_DETAIL_VERSION, &version2,
    2.30  				    RAZOR_DETAIL_ARCH, &arch2,
    2.31 -				    0);
    2.32 +				    NULL);
    2.33  
    2.34  	while (p1 || p2) {
    2.35  		if (p1 && p2) {
    2.36 @@ -749,13 +749,13 @@
    2.37  						    RAZOR_DETAIL_NAME, &name1,
    2.38  						    RAZOR_DETAIL_VERSION, &version1,
    2.39  						    RAZOR_DETAIL_ARCH, &arch1,
    2.40 -						    0);
    2.41 +						    NULL);
    2.42  		if (p2 != NULL && res >= 0)
    2.43  			razor_package_iterator_next(pi2, &p2,
    2.44  						    RAZOR_DETAIL_NAME, &name2,
    2.45  						    RAZOR_DETAIL_VERSION, &version2,
    2.46  						    RAZOR_DETAIL_ARCH, &arch2,
    2.47 -						    0);
    2.48 +						    NULL);
    2.49  	}
    2.50  
    2.51  	razor_package_iterator_destroy(pi1);
     3.1 --- a/librazor/razor.h	Mon Jun 30 09:47:32 2008 +0100
     3.2 +++ b/librazor/razor.h	Mon Jun 30 10:46:20 2008 +0100
     3.3 @@ -22,6 +22,13 @@
     3.4  
     3.5  #include <stdint.h>
     3.6  
     3.7 +/* GCC sentinel */
     3.8 +#if defined(__GNUC__) && __GNUC__ >= 4
     3.9 +#define RAZOR_SENTINEL __attribute__ ((__sentinel__(0)));
    3.10 +#else
    3.11 +#define RAZOR_SENTINEL
    3.12 +#endif
    3.13 +
    3.14  enum razor_repo_file_type {
    3.15  	RAZOR_REPO_FILE_MAIN,
    3.16  	RAZOR_REPO_FILE_DETAILS,
    3.17 @@ -29,7 +36,7 @@
    3.18  };
    3.19  
    3.20  enum razor_detail_type {
    3.21 -	RAZOR_DETAIL_NAME = 1, /* 0 is the marker for the vararg */
    3.22 +	RAZOR_DETAIL_NAME = 1, /* NULL (0 on 32 bit) is the sentinel */
    3.23  	RAZOR_DETAIL_VERSION,
    3.24  	RAZOR_DETAIL_ARCH,
    3.25  	RAZOR_DETAIL_SUMMARY,
    3.26 @@ -94,7 +101,9 @@
    3.27  razor_set_get_package(struct razor_set *set, const char *package);
    3.28  
    3.29  void
    3.30 -razor_package_get_details(struct razor_set *set, struct razor_package *package, ...);
    3.31 +razor_package_get_details(struct razor_set *set,
    3.32 +			  struct razor_package *package, ...)
    3.33 +			  RAZOR_SENTINEL;
    3.34  
    3.35  
    3.36  /**
    3.37 @@ -144,7 +153,8 @@
    3.38  				       const char *filename);
    3.39  
    3.40  int razor_package_iterator_next(struct razor_package_iterator *pi,
    3.41 -				struct razor_package **package, ...);
    3.42 +				struct razor_package **package, ...)
    3.43 +				RAZOR_SENTINEL;
    3.44  void razor_package_iterator_destroy(struct razor_package_iterator *pi);
    3.45  
    3.46  struct razor_package_query *
     4.1 --- a/librazor/transaction.c	Mon Jun 30 09:47:32 2008 +0100
     4.2 +++ b/librazor/transaction.c	Mon Jun 30 10:46:20 2008 +0100
     4.3 @@ -318,7 +318,7 @@
     4.4  		razor_package_iterator_init_for_property(&pkg_iter, set, p);
     4.5  		while (razor_package_iterator_next(&pkg_iter, &pkg,
     4.6  						   RAZOR_DETAIL_NAME, &n,
     4.7 -						   RAZOR_DETAIL_VERSION, &v, 0)) {
     4.8 +						   RAZOR_DETAIL_VERSION, &v, NULL)) {
     4.9  			fprintf(stderr, "removing %s-%s\n", n, v);
    4.10  			razor_transaction_remove_package(trans, pkg);
    4.11  		}
    4.12 @@ -364,7 +364,7 @@
    4.13  		razor_package_iterator_init_for_property(&pkg_iter, set, p);
    4.14  		while (razor_package_iterator_next(&pkg_iter, &pkg,
    4.15  						   RAZOR_DETAIL_NAME, &name,
    4.16 -						   RAZOR_DETAIL_VERSION, &version, 0)) {
    4.17 +						   RAZOR_DETAIL_VERSION, &version, NULL)) {
    4.18  
    4.19  			fprintf(stderr, "flagging %s-%s for providing %s matching %s %s\n",
    4.20  				name, version,
    4.21 @@ -526,7 +526,7 @@
    4.22  							 trans->system.set,
    4.23  							 sp);
    4.24  		while (razor_package_iterator_next(&pkg_iter, &pkg,
    4.25 -						   RAZOR_DETAIL_NAME, &name, 0)) {
    4.26 +						   RAZOR_DETAIL_NAME, &name, NULL)) {
    4.27  			fprintf(stderr, "updating %s because %s %s %s "
    4.28  				"isn't satisfied\n",
    4.29  				name, spi.pool + sp->name,
    4.30 @@ -578,7 +578,7 @@
    4.31  							 sp);
    4.32  		while (razor_package_iterator_next(&pkg_iter, &pkg,
    4.33  						   RAZOR_DETAIL_NAME, &name,
    4.34 -						   RAZOR_DETAIL_VERSION, &version, 0)) {
    4.35 +						   RAZOR_DETAIL_VERSION, &version, NULL)) {
    4.36  			fprintf(stderr, "updating %s %s because it "
    4.37  				"conflicts with %s\n",
    4.38  				name, version, spi.pool + sp->name);
    4.39 @@ -668,7 +668,7 @@
    4.40  
    4.41  	while (razor_package_iterator_next(pi, &p,
    4.42  					   RAZOR_DETAIL_NAME, &name,
    4.43 -					   RAZOR_DETAIL_VERSION, &version, 0)) {
    4.44 +					   RAZOR_DETAIL_VERSION, &version, NULL)) {
    4.45  		if (!(trans->system.packages[p - spkgs] & TRANS_PACKAGE_UPDATE))
    4.46  			continue;
    4.47  
    4.48 @@ -705,7 +705,7 @@
    4.49  
    4.50  	while (razor_package_iterator_next(pi, &p,
    4.51  					   RAZOR_DETAIL_NAME, &name,
    4.52 -					   RAZOR_DETAIL_VERSION, &version, 0)) {
    4.53 +					   RAZOR_DETAIL_VERSION, &version, NULL)) {
    4.54  		if (!(trans->upstream.packages[p - upkgs] & TRANS_PACKAGE_UPDATE))
    4.55  			continue;
    4.56  
    4.57 @@ -754,7 +754,7 @@
    4.58  		while (razor_package_iterator_next(&pi, &pkg,
    4.59  						   RAZOR_DETAIL_NAME, &name,
    4.60  						   RAZOR_DETAIL_VERSION, &version,
    4.61 -						   RAZOR_DETAIL_ARCH, &arch, 0))
    4.62 +						   RAZOR_DETAIL_ARCH, &arch, NULL))
    4.63  			fprintf(stderr, "%s is needed by %s-%s.%s\n",
    4.64  				&pool[rp->name],
    4.65  				name, version, arch);
    4.66 @@ -763,7 +763,7 @@
    4.67  		while (razor_package_iterator_next(&pi, &pkg,
    4.68  						   RAZOR_DETAIL_NAME, &name,
    4.69  						   RAZOR_DETAIL_VERSION, &version,
    4.70 -						   RAZOR_DETAIL_ARCH, &arch, 0))
    4.71 +						   RAZOR_DETAIL_ARCH, &arch, NULL))
    4.72  			fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
    4.73  				&pool[rp->name],
    4.74  				razor_property_relation_to_string(rp),
     5.1 --- a/src/main.c	Mon Jun 30 09:47:32 2008 +0100
     5.2 +++ b/src/main.c	Mon Jun 30 10:46:20 2008 +0100
     5.3 @@ -59,7 +59,7 @@
     5.4  		iter = razor_package_iterator_create(set);
     5.5  		pattern = argv[i];
     5.6  		count = 0;
     5.7 -		while (razor_package_iterator_next(iter, &package, RAZOR_DETAIL_NAME, &name, 0)) {
     5.8 +		while (razor_package_iterator_next(iter, &package, RAZOR_DETAIL_NAME, &name, NULL)) {
     5.9  			if (fnmatch(pattern, name, 0) != 0)
    5.10  				continue;
    5.11  
    5.12 @@ -87,7 +87,7 @@
    5.13  	while (razor_package_iterator_next(iter, &package,
    5.14  					   RAZOR_DETAIL_NAME, &name,
    5.15  					   RAZOR_DETAIL_VERSION, &version,
    5.16 -					   RAZOR_DETAIL_ARCH, &arch, 0)) {
    5.17 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    5.18  		if (flags & LIST_PACKAGES_ONLY_NAMES)
    5.19  			printf("%s\n", name);
    5.20  		else
    5.21 @@ -431,7 +431,7 @@
    5.22  
    5.23  	pi = razor_package_iterator_create(set);
    5.24  	while (razor_package_iterator_next(pi, &package,
    5.25 -					   RAZOR_DETAIL_NAME, &name, 0)) {
    5.26 +					   RAZOR_DETAIL_NAME, &name, NULL)) {
    5.27  		if (pattern && fnmatch(pattern, name, 0) == 0) {
    5.28  			razor_transaction_update_package(trans, package);
    5.29  			matches++;
    5.30 @@ -452,7 +452,7 @@
    5.31  	int matches = 0;
    5.32  
    5.33  	pi = razor_package_iterator_create(set);
    5.34 -	while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, 0)) {
    5.35 +	while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, NULL)) {
    5.36  		if (pattern && fnmatch(pattern, name, 0) == 0) {
    5.37  			razor_transaction_remove_package(trans, package);
    5.38  			matches++;
    5.39 @@ -662,7 +662,7 @@
    5.40  	while (razor_package_iterator_next(pi, &package,
    5.41  					   RAZOR_DETAIL_NAME, &name,
    5.42  					   RAZOR_DETAIL_VERSION, &version,
    5.43 -					   RAZOR_DETAIL_ARCH, &arch, 0)) {
    5.44 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    5.45  		snprintf(url, sizeof url,
    5.46  			 "%s/Packages/%s",
    5.47  			 yum_url, rpm_filename(name, version, arch));
    5.48 @@ -694,7 +694,7 @@
    5.49  	while (razor_package_iterator_next(pi, &package,
    5.50  					   RAZOR_DETAIL_NAME, &name,
    5.51  					   RAZOR_DETAIL_VERSION, &version,
    5.52 -					   RAZOR_DETAIL_ARCH, &arch, 0)) {
    5.53 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    5.54  		printf("install %s-%s\n", name, version);
    5.55  
    5.56  		snprintf(file, sizeof file,
    5.57 @@ -802,7 +802,7 @@
    5.58  	while (razor_package_iterator_next(pi, &package,
    5.59  					   RAZOR_DETAIL_NAME, &name,
    5.60  					   RAZOR_DETAIL_VERSION, &version,
    5.61 -					   RAZOR_DETAIL_ARCH, &arch, 0)) {
    5.62 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    5.63  		if (pattern && fnmatch(pattern, name, 0) != 0)
    5.64  			continue;
    5.65  
    5.66 @@ -845,7 +845,7 @@
    5.67  	while (razor_package_iterator_next(pi, &package,
    5.68  					   RAZOR_DETAIL_NAME, &name,
    5.69  					   RAZOR_DETAIL_VERSION, &version,
    5.70 -					   RAZOR_DETAIL_ARCH, &arch, 0)) {
    5.71 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    5.72  		if (pattern && fnmatch(pattern, name, 0) != 0)
    5.73  			continue;
    5.74  
    5.75 @@ -854,7 +854,7 @@
    5.76  					   RAZOR_DETAIL_DESCRIPTION, &description,
    5.77  					   RAZOR_DETAIL_URL, &url,
    5.78  					   RAZOR_DETAIL_LICENSE, &license,
    5.79 -					   0);
    5.80 +					   NULL);
    5.81  
    5.82  		printf ("Name:        %s\n", name);
    5.83  		printf ("Arch:        %s\n", arch);
    5.84 @@ -899,13 +899,18 @@
    5.85  
    5.86  	pi = razor_package_iterator_create(set);
    5.87  	while (razor_package_iterator_next(pi, &package,
    5.88 -					   &name, &version, &arch)) {
    5.89 +					   RAZOR_DETAIL_NAME, &name,
    5.90 +					   RAZOR_DETAIL_VERSION, &version,
    5.91 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    5.92  		if (!fnmatch(pattern, name, 0))
    5.93  			printf("%s-%s.%s\n", name, version, arch);
    5.94  		else {
    5.95 -			razor_package_get_details (set, package, &summary,
    5.96 -						   &description, &url,
    5.97 -						   &license);
    5.98 +			razor_package_get_details (set, package,
    5.99 +						   RAZOR_DETAIL_SUMMARY, &summary,
   5.100 +						   RAZOR_DETAIL_DESCRIPTION, &description,
   5.101 +						   RAZOR_DETAIL_URL, &url,
   5.102 +						   RAZOR_DETAIL_LICENSE, &license,
   5.103 +						   NULL);
   5.104  			if (!fnmatch(pattern, url, 0) ||
   5.105  			    !fnmatch(pattern, summary, 0) ||
   5.106  			    !fnmatch(pattern, description, 0))
     6.1 --- a/src/rpm.c	Mon Jun 30 09:47:32 2008 +0100
     6.2 +++ b/src/rpm.c	Mon Jun 30 10:46:20 2008 +0100
     6.3 @@ -313,7 +313,7 @@
     6.4  	pi = razor_package_iterator_create(set);
     6.5  
     6.6  	while (razor_package_iterator_next(pi, &package,
     6.7 -					   RAZOR_DETAIL_NAME, &name, 0)) {
     6.8 +					   RAZOR_DETAIL_NAME, &name, NULL)) {
     6.9  		while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
    6.10  			fprintf(stderr, "error: package %s is not installed\n",
    6.11  				argv[i]);
    6.12 @@ -422,7 +422,7 @@
    6.13  				   RAZOR_DETAIL_DESCRIPTION, &description,
    6.14  				   RAZOR_DETAIL_URL, &url,
    6.15  				   RAZOR_DETAIL_LICENSE, &license,
    6.16 -				   0);
    6.17 +				   NULL);
    6.18  
    6.19  	printf("Name:        %s\n", name);
    6.20  	printf("Arch:        %s\n", arch);
    6.21 @@ -494,7 +494,7 @@
    6.22  	while (razor_package_iterator_next(pi, &package,
    6.23  					   RAZOR_DETAIL_NAME, &name,
    6.24  					   RAZOR_DETAIL_VERSION, &version,
    6.25 -					   RAZOR_DETAIL_ARCH, &arch, 0)) {
    6.26 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    6.27  		if (option_conflicts)
    6.28  			print_package_properties(set, package,
    6.29  						 RAZOR_PROPERTY_CONFLICTS);
    6.30 @@ -548,7 +548,7 @@
    6.31  	while (razor_package_iterator_next(pi, &package,
    6.32  					   RAZOR_DETAIL_NAME, &name,
    6.33  					   RAZOR_DETAIL_VERSION, &version,
    6.34 -					   RAZOR_DETAIL_ARCH, &arch, 0)) {
    6.35 +					   RAZOR_DETAIL_ARCH, &arch, NULL)) {
    6.36  		printf("verify %s-%s.%s - not implemented\n",
    6.37  		       name, version, arch);
    6.38  	}
    6.39 @@ -593,7 +593,7 @@
    6.40  	add_command_line_packages(set, query, argc, argv);
    6.41  
    6.42  	pi = razor_package_query_finish(query);
    6.43 -	while (razor_package_iterator_next(pi, &package, 0))
    6.44 +	while (razor_package_iterator_next(pi, &package, NULL))
    6.45  		razor_transaction_remove_package(trans, package);
    6.46  	razor_package_iterator_destroy(pi);
    6.47  
    6.48 @@ -635,7 +635,7 @@
    6.49  	trans = razor_transaction_create(set, upstream);
    6.50  
    6.51  	pi = razor_package_iterator_create(upstream);
    6.52 -	while (razor_package_iterator_next(pi, &package, 0))
    6.53 +	while (razor_package_iterator_next(pi, &package, NULL))
    6.54  		razor_transaction_install_package(trans, package);
    6.55  	razor_package_iterator_destroy(pi);
    6.56  
    6.57 @@ -677,7 +677,7 @@
    6.58  	trans = razor_transaction_create(set, upstream);
    6.59  
    6.60  	pi = razor_package_iterator_create(upstream);
    6.61 -	while (razor_package_iterator_next(pi, &package, 0))
    6.62 +	while (razor_package_iterator_next(pi, &package, NULL))
    6.63  		razor_transaction_update_package(trans, package);
    6.64  	razor_package_iterator_destroy(pi);
    6.65