svn commit: r418537 - in head/ports-mgmt/portfind: . files

Garrett Cooper ngie at FreeBSD.org
Thu Jul 14 15:46:42 UTC 2016


Author: ngie (src committer)
Date: Thu Jul 14 15:46:41 2016
New Revision: 418537
URL: https://svnweb.freebsd.org/changeset/ports/418537

Log:
  Fix ports-mgmt/portfind string management/searching issues
  
  Makefile:
  
    Bump `PORT_REVISION` for the change.
  
  portfind.c:
  
    get_release(..):
  
    The function was incorrectly modifying a pointer that wasn't the original
    calloc'ed pointer, tripping asserts when MALLOC_PRODUCTION wasn't enabled
    in jemalloc [*].
  
    - Use one temporary buffer (`release`) instead of two (`release` and
      `version`).
    - Improve temporary memory idiom for managing memory used with
      sysctlbyname(3) by first checking the length, mallocing the buffer,
      then filling it with a second call to sysctlbyname(3).
    - Use strchr(3) instead of handrolling it in a while-loop and to
      avoid the improper free(3) of the memory allocated for `release`.
  
    main(..):
  
    - Use asprintf instead of calloc + sprintf.
    - Use constant `pasting` with `INDEX_FILE` instead of passing it in to
      asprintf(3).
    - Fix error message when unable to open `INDEX_FILE`.
  
  Approved by: brd
  Differential Revision: https://reviews.freebsd.org/D7198
  PR: 211032 [*]
  Reported by: Michael Zhilin <mizhka at gmail.com>
  Reviewed by: Michael Zhilin <mizhka at gmail.com>
  Sponsored by: EMC / Isilon Storage Division

Added:
  head/ports-mgmt/portfind/files/
  head/ports-mgmt/portfind/files/patch-portfind.c   (contents, props changed)
Modified:
  head/ports-mgmt/portfind/Makefile

Modified: head/ports-mgmt/portfind/Makefile
==============================================================================
--- head/ports-mgmt/portfind/Makefile	Thu Jul 14 15:43:08 2016	(r418536)
+++ head/ports-mgmt/portfind/Makefile	Thu Jul 14 15:46:41 2016	(r418537)
@@ -2,6 +2,7 @@
 
 PORTNAME=	portfind
 PORTVERSION=	1.6.1
+PORTREVISION=	1
 CATEGORIES=	ports-mgmt perl5
 MASTER_SITES=	http://dynsoft.com/files/
 

Added: head/ports-mgmt/portfind/files/patch-portfind.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/ports-mgmt/portfind/files/patch-portfind.c	Thu Jul 14 15:46:41 2016	(r418537)
@@ -0,0 +1,80 @@
+--- portfind.c.orig	2014-08-24 15:54:28 UTC
++++ portfind.c
+@@ -103,20 +103,25 @@ int main(int argc, char **argv) {
+ 		return 0;
+ 	}
+ 
++	char *filename;
+ 	char *release = get_release();
++
+ 	if(!release) {
+ 		fprintf(stderr, "Could not determine release\n");
+ 		return 1;
+ 	}
+ 
+-	char *filename = calloc(strlen(release) + strlen(INDEX_FILE) + 1, sizeof(char));
+-	sprintf(filename, "%s%s", INDEX_FILE, release);
++	asprintf(&filename, INDEX_FILE "%s", release);
++	if (filename == NULL) {
++		fprintf(stderr, "Could not allocate memory for `filename`\n");
++		return 1;
++	}
+ 	free(release);
+ 
+ 	FILE *file = fopen(filename, "r");
+ 	free(filename);
+ 	if(!file) {
+-		fprintf(stderr, "Could not open %s\n", INDEX_FILE);
++		fprintf(stderr, "Could not open %s\n", filename);
+ 		return 1;
+ 	}
+ 
+@@ -435,25 +440,32 @@ char *get_installed_version(const char *
+ 	return version;
+ }
+ 
+-char *get_release() {
+-	size_t length = 0;
+-	sysctlbyname("kern.osrelease", NULL, &length, NULL, 0);
+-	if(length == 0)
+-		return NULL;
+-	
+-	char *release = calloc(length, sizeof(char));
+-	char *version = calloc(length, sizeof(char));
+-	char *tmp     = version;
+-	sysctlbyname("kern.osrelease", release, &length, NULL, 0);
+-	char c = *release;
+-	while(c != '.' && c != '\0') {
+-		*tmp++ = c;
+-		c = *(++release);
+-	}
++char *get_release(void) {
++	char *first_dot, *release;
++	size_t length;
+ 
++	release = NULL;
++
++	if (sysctlbyname("kern.osrelease", NULL, &length, NULL, 0) == -1)
++		goto fail;
++
++	if ((release = malloc(sizeof(char) * length)) == NULL)
++		goto fail;
++
++	if (sysctlbyname("kern.osrelease", release, &length, NULL, 0) == -1)
++		goto fail;
++
++	if ((first_dot = strchr(release, '.')) == NULL)
++		goto fail;
++
++	*first_dot = '\0';
++
++	return release;
++
++fail:
+ 	free(release);
+ 
+-	return version;
++	return NULL;
+ }
+ 
+ void help(const char *program) {


More information about the svn-ports-all mailing list