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:
parent
e3c418cce4
commit
b2eb1410b4
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=418537
@ -2,6 +2,7 @@
|
||||
|
||||
PORTNAME= portfind
|
||||
PORTVERSION= 1.6.1
|
||||
PORTREVISION= 1
|
||||
CATEGORIES= ports-mgmt perl5
|
||||
MASTER_SITES= http://dynsoft.com/files/
|
||||
|
||||
|
80
ports-mgmt/portfind/files/patch-portfind.c
Normal file
80
ports-mgmt/portfind/files/patch-portfind.c
Normal 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) {
|
Loading…
Reference in New Issue
Block a user