1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-20 00:21:35 +00:00

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@gmail.com>
Reviewed by: Michael Zhilin <mizhka@gmail.com>
Sponsored by: EMC / Isilon Storage Division
This commit is contained in:
Enji Cooper 2016-07-14 15:46:41 +00:00
parent e3c418cce4
commit b2eb1410b4
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=418537
2 changed files with 81 additions and 0 deletions

View File

@ -2,6 +2,7 @@
PORTNAME= portfind
PORTVERSION= 1.6.1
PORTREVISION= 1
CATEGORIES= ports-mgmt perl5
MASTER_SITES= http://dynsoft.com/files/

View File

@ -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) {