From 0c69b75f425d0ef25ef27d83e26f755d8f61c53f Mon Sep 17 00:00:00 2001 From: HEQING YAN Date: Mon, 18 Sep 2017 12:39:14 -0400 Subject: [PATCH 1/5] fix to https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=219689 --- usr.bin/systat/devs.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/usr.bin/systat/devs.c b/usr.bin/systat/devs.c index e6b1e48eb10ebf..2ae8109d9702cb 100644 --- a/usr.bin/systat/devs.c +++ b/usr.bin/systat/devs.c @@ -197,6 +197,9 @@ dsmatchselect(const char *args, devstat_select_mode select_mode, int maxshowdevs * Break the (pipe delimited) input string out into separate * strings. */ + if (!args) + err(1, "missing argument to match"); + tmpstr = tmpstr1 = strdup(args); for (tempstr = tstr, num_args = 0; (*tempstr = strsep(&tmpstr1, "|")) != NULL && (num_args < 100); @@ -266,6 +269,11 @@ dsselect(const char *args, devstat_select_mode select_mode, int maxshowdevs, /* do an initial malloc */ specified_devices = (char **)malloc(sizeof(char *)); + if (!args) { + error("missing arguement for option"); + return(0); + } + tmpstr = tmpstr1 = strdup(args); cp = strchr(tmpstr1, '\n'); if (cp) From 42e43620f7de20c83bd5787678cbca0bbf781c4d Mon Sep 17 00:00:00 2001 From: HEQING YAN Date: Tue, 14 Nov 2017 12:40:26 -0500 Subject: [PATCH 2/5] fixed kernel panic for setting time that exceeds year 9999 updated documents --- lib/libc/sys/clock_gettime.2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/libc/sys/clock_gettime.2 b/lib/libc/sys/clock_gettime.2 index c0713e5cbccb11..14908d436758cf 100644 --- a/lib/libc/sys/clock_gettime.2 +++ b/lib/libc/sys/clock_gettime.2 @@ -68,7 +68,7 @@ as well as the following values: .It Dv CLOCK_REALTIME .It Dv CLOCK_REALTIME_PRECISE .It Dv CLOCK_REALTIME_FAST -Increments as a wall clock should. +Increments with consideration of leap seconds and leap years. .It Dv CLOCK_MONOTONIC .It Dv CLOCK_MONOTONIC_PRECISE .It Dv CLOCK_MONOTONIC_FAST @@ -117,6 +117,8 @@ struct timespec { }; .Ed .Pp +Its time represents seconds and nanoseconds since the Epoch. +.Pp Only the super-user may set the time of day, using only .Fa CLOCK_REALTIME . If the system securelevel is greater than 1 (see From 8ffff88d26b18b1883b6a6748db2e07f25e92861 Mon Sep 17 00:00:00 2001 From: HEQING YAN Date: Fri, 1 Dec 2017 18:08:30 -0500 Subject: [PATCH 3/5] added recursive feature for setfacl use NULL terminator for array to prevent crash --- bin/setfacl/setfacl.c | 158 +++++++++++++++++++++++++----------------- 1 file changed, 93 insertions(+), 65 deletions(-) diff --git a/bin/setfacl/setfacl.c b/bin/setfacl/setfacl.c index c69f0baf6f1fb5..0fb84b4f122f75 100644 --- a/bin/setfacl/setfacl.c +++ b/bin/setfacl/setfacl.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include "setfacl.h" @@ -59,35 +60,13 @@ struct sf_entry { }; static TAILQ_HEAD(, sf_entry) entrylist; -/* TAILQ entry for files */ -struct sf_file { - const char *filename; - TAILQ_ENTRY(sf_file) next; -}; -static TAILQ_HEAD(, sf_file) filelist; - uint have_mask; uint need_mask; uint have_stdin; uint n_flag; -static void add_filename(const char *filename); static void usage(void); -static void -add_filename(const char *filename) -{ - struct sf_file *file; - - if (strlen(filename) > PATH_MAX - 1) { - warn("illegal filename"); - return; - } - file = zmalloc(sizeof(struct sf_file)); - file->filename = filename; - TAILQ_INSERT_TAIL(&filelist, file, next); -} - static void usage(void) { @@ -104,22 +83,24 @@ main(int argc, char *argv[]) acl_type_t acl_type; acl_entry_t unused_entry; char filename[PATH_MAX]; - int local_error, carried_error, ch, i, entry_number, ret; - int h_flag; - struct sf_file *file; + int local_error, carried_error, ch, entry_number, ret, fts_options; + int R_flag, h_flag; struct sf_entry *entry; - const char *fn_dup; + char *fn_dup; char *end; struct stat sb; + FTS *ftsp; + FTSENT *p; + char ** filelist; + size_t size, len; acl_type = ACL_TYPE_ACCESS; carried_error = local_error = 0; - h_flag = have_mask = have_stdin = n_flag = need_mask = 0; + R_flag = h_flag = have_mask = have_stdin = n_flag = need_mask = 0; TAILQ_INIT(&entrylist); - TAILQ_INIT(&filelist); - while ((ch = getopt(argc, argv, "M:X:a:bdhkm:nx:")) != -1) + while ((ch = getopt(argc, argv, "M:RX:a:bdhkm:nx:")) != -1) switch(ch) { case 'M': entry = zmalloc(sizeof(struct sf_entry)); @@ -129,6 +110,9 @@ main(int argc, char *argv[]) entry->op = OP_MERGE_ACL; TAILQ_INSERT_TAIL(&entrylist, entry, next); break; + case 'R': + R_flag = 1; + break; case 'X': entry = zmalloc(sizeof(struct sf_entry)); entry->acl = get_acl_from_file(optarg); @@ -213,43 +197,86 @@ main(int argc, char *argv[]) err(1, "cannot have more than one stdin"); have_stdin = 1; bzero(&filename, sizeof(filename)); + size = 16; + len = 0; + filelist = realloc(NULL, sizeof(char *) * size); while (fgets(filename, (int)sizeof(filename), stdin)) { /* remove the \n */ filename[strlen(filename) - 1] = '\0'; fn_dup = strdup(filename); if (fn_dup == NULL) err(1, "strdup() failed"); - add_filename(fn_dup); + //filelist + filelist[len++] = fn_dup; + if (size == len) { + filelist = realloc(filelist, sizeof(char *) * (size += 16)); + if (!filelist) { + err(1, "realloc() failed"); + } + } } - } else - for (i = 0; i < argc; i++) - add_filename(argv[i]); - - /* cycle through each file */ - TAILQ_FOREACH(file, &filelist, next) { + filelist[len++] = NULL; + filelist = realloc(filelist, sizeof(char *) * len); + } else { + filelist = argv; + } + + if (R_flag) { + if (h_flag) + errx(1, "the -R and -h options may not be " + "specified together."); + fts_options = FTS_PHYSICAL; + } else { + fts_options = FTS_LOGICAL; + } + + if ((ftsp = fts_open(filelist, fts_options, 0)) == NULL) + err(1, "fts_open"); + for (ret = 0;(p = fts_read(ftsp)) != NULL;) { + switch(p->fts_info) { + case FTS_D: + if (!R_flag) + fts_set(ftsp,p,FTS_SKIP); + break; + case FTS_DNR: + warnx("%s: %s", p->fts_accpath, strerror(p->fts_errno)); + ret = 1; + break; + case FTS_DP: + continue; + case FTS_ERR: + case FTS_NS: + warnx("%s: %s", p->fts_accpath, strerror(p->fts_errno)); + ret = 1; + continue; + default: + break; + } + + /* cycle through each file */ local_error = 0; - if (stat(file->filename, &sb) == -1) { - warn("%s: stat() failed", file->filename); + if (stat(p->fts_accpath, &sb) == -1) { + warn("%s: stat() failed", p->fts_accpath); carried_error++; continue; } if (acl_type == ACL_TYPE_DEFAULT && S_ISDIR(sb.st_mode) == 0) { warnx("%s: default ACL may only be set on a directory", - file->filename); + p->fts_accpath); carried_error++; continue; } if (h_flag) - ret = lpathconf(file->filename, _PC_ACL_NFS4); + ret = lpathconf(p->fts_accpath, _PC_ACL_NFS4); else - ret = pathconf(file->filename, _PC_ACL_NFS4); + ret = pathconf(p->fts_accpath, _PC_ACL_NFS4); if (ret > 0) { if (acl_type == ACL_TYPE_DEFAULT) { warnx("%s: there are no default entries " - "in NFSv4 ACLs", file->filename); + "in NFSv4 ACLs", p->fts_accpath); carried_error++; continue; } @@ -259,20 +286,20 @@ main(int argc, char *argv[]) acl_type = ACL_TYPE_ACCESS; } else if (ret < 0 && errno != EINVAL) { warn("%s: pathconf(..., _PC_ACL_NFS4) failed", - file->filename); + p->fts_accpath); } if (h_flag) - acl = acl_get_link_np(file->filename, acl_type); + acl = acl_get_link_np(p->fts_accpath, acl_type); else - acl = acl_get_file(file->filename, acl_type); + acl = acl_get_file(p->fts_accpath, acl_type); if (acl == NULL) { if (h_flag) warn("%s: acl_get_link_np() failed", - file->filename); + p->fts_accpath); else warn("%s: acl_get_file() failed", - file->filename); + p->fts_accpath); carried_error++; continue; } @@ -285,11 +312,11 @@ main(int argc, char *argv[]) switch(entry->op) { case OP_ADD_ACL: local_error += add_acl(entry->acl, - entry->entry_number, &acl, file->filename); + entry->entry_number, &acl, p->fts_accpath); break; case OP_MERGE_ACL: local_error += merge_acl(entry->acl, &acl, - file->filename); + p->fts_accpath); need_mask = 1; break; case OP_REMOVE_EXT: @@ -301,37 +328,37 @@ main(int argc, char *argv[]) acl_get_entry(acl, ACL_FIRST_ENTRY, &unused_entry) == 0) { local_error += remove_default(&acl, - file->filename); + p->fts_accpath); break; } - remove_ext(&acl, file->filename); + remove_ext(&acl, p->fts_accpath); need_mask = 0; break; case OP_REMOVE_DEF: if (acl_type == ACL_TYPE_NFS4) { warnx("%s: there are no default entries in NFSv4 ACLs; " - "cannot remove", file->filename); + "cannot remove", p->fts_accpath); local_error++; break; } - if (acl_delete_def_file(file->filename) == -1) { + if (acl_delete_def_file(p->fts_accpath) == -1) { warn("%s: acl_delete_def_file() failed", - file->filename); + p->fts_accpath); local_error++; } if (acl_type == ACL_TYPE_DEFAULT) local_error += remove_default(&acl, - file->filename); + p->fts_accpath); need_mask = 0; break; case OP_REMOVE_ACL: local_error += remove_acl(entry->acl, &acl, - file->filename); + p->fts_accpath); need_mask = 1; break; case OP_REMOVE_BY_NUMBER: local_error += remove_by_number(entry->entry_number, - &acl, file->filename); + &acl, p->fts_accpath); need_mask = 1; break; } @@ -343,9 +370,9 @@ main(int argc, char *argv[]) */ if (acl_type == ACL_TYPE_DEFAULT && acl_get_entry(acl, ACL_FIRST_ENTRY, &unused_entry) == 0) { - if (acl_delete_def_file(file->filename) == -1) { + if (acl_delete_def_file(p->fts_accpath) == -1) { warn("%s: acl_delete_def_file() failed", - file->filename); + p->fts_accpath); carried_error++; } continue; @@ -358,27 +385,28 @@ main(int argc, char *argv[]) } if (acl_type != ACL_TYPE_NFS4 && need_mask && - set_acl_mask(&acl, file->filename) == -1) { - warnx("%s: failed to set ACL mask", file->filename); + set_acl_mask(&acl, p->fts_accpath) == -1) { + warnx("%s: failed to set ACL mask", p->fts_accpath); carried_error++; } else if (h_flag) { - if (acl_set_link_np(file->filename, acl_type, + if (acl_set_link_np(p->fts_accpath, acl_type, acl) == -1) { carried_error++; warn("%s: acl_set_link_np() failed", - file->filename); + p->fts_accpath); } } else { - if (acl_set_file(file->filename, acl_type, + if (acl_set_file(p->fts_accpath, acl_type, acl) == -1) { carried_error++; warn("%s: acl_set_file() failed", - file->filename); + p->fts_accpath); } } acl_free(acl); } + free(filelist); return (carried_error); } From 085c7c6371759afade80474c49744a0e8458087b Mon Sep 17 00:00:00 2001 From: HEQING YAN Date: Tue, 5 Dec 2017 15:23:16 -0500 Subject: [PATCH 4/5] mock up brk test --- lib/libc/tests/sys/brk_test.c | 87 +++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 lib/libc/tests/sys/brk_test.c diff --git a/lib/libc/tests/sys/brk_test.c b/lib/libc/tests/sys/brk_test.c new file mode 100644 index 00000000000000..8904bf135aff5f --- /dev/null +++ b/lib/libc/tests/sys/brk_test.c @@ -0,0 +1,87 @@ +/*- + * Copyright (c) 20XX NAME + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +__FBSDID("$FreeBSD$"); + +#include +#include + +#include + +#define OFFSET 16 +static void +test_brk() +{ + void * origin_brk; + int i; + origin_brk = sbrk(0); + + for (i = 0; i < 100; i++) { + assert(brk(origin_brk + i * OFFSET) == 0); + assert(sbrk(0) == origin_brk + i * OFFSET); + assert(brk(origin_brk) == 0); + assert(sbrk(0) == origin_brk); + } +} + +static void +test_sbrk() +{ + void * origin_brk; + int i; + + origin_brk = sbrk(0); + + for (i = 0; i < 100; i++) { + assert(sbrk(i * OFFSET) == origin_brk); + assert(sbrk(0) == origin_brk + i * OFFSET); + assert(sbrk(-i * OFFSET) == origin_brk + i * OFFSET); + assert(sbrk(0) == origin_brk); + } +} + +ATF_TC_WITHOUT_HEAD(brk); +ATF_TC_BODY(brk, tc) +{ + + test_brk(); +} + + +ATF_TC_WITHOUT_HEAD(sbrk); +ATF_TC_BODY(sbrk, tc) +{ + + test_sbrk(); +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp,brk); + ATF_TP_ADD_TC(tp,sbrk); + + return (atf_no_error()); +} From e7ba071ed8d71e5be5e016f5dc7e09db2e149981 Mon Sep 17 00:00:00 2001 From: HEQING YAN Date: Tue, 5 Dec 2017 16:18:03 -0500 Subject: [PATCH 5/5] used ATF_REQUIRE instead of assert changed test data set --- lib/libc/tests/sys/brk_test.c | 38 +++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/lib/libc/tests/sys/brk_test.c b/lib/libc/tests/sys/brk_test.c index 8904bf135aff5f..40a30fd31e30e7 100644 --- a/lib/libc/tests/sys/brk_test.c +++ b/lib/libc/tests/sys/brk_test.c @@ -23,26 +23,33 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ + + +// Assume ATF_REQUIRE would not use malloc with positive assertion case. + __FBSDID("$FreeBSD$"); #include #include - #include -#define OFFSET 16 +int[] test_data = {1, 8, 1024, 4096, 1024*1024}; + static void test_brk() { void * origin_brk; - int i; + int i , data, len; + len = sizeof(test_data) / sizeof(int); origin_brk = sbrk(0); - for (i = 0; i < 100; i++) { - assert(brk(origin_brk + i * OFFSET) == 0); - assert(sbrk(0) == origin_brk + i * OFFSET); - assert(brk(origin_brk) == 0); - assert(sbrk(0) == origin_brk); + for (i = 0; i < len; i++) { + data = test_data[i]; + + ATF_REQUIRE(brk(origin_brk + data) == 0); + ATF_REQUIRE(sbrk(0) == origin_brk + data); + ATF_REQUIRE(brk(origin_brk) == 0); + ATF_REQUIRE(sbrk(0) == origin_brk); } } @@ -50,15 +57,16 @@ static void test_sbrk() { void * origin_brk; - int i; - + int i , data, len; + len = sizeof(test_data) / sizeof(int); origin_brk = sbrk(0); - for (i = 0; i < 100; i++) { - assert(sbrk(i * OFFSET) == origin_brk); - assert(sbrk(0) == origin_brk + i * OFFSET); - assert(sbrk(-i * OFFSET) == origin_brk + i * OFFSET); - assert(sbrk(0) == origin_brk); + for (i = 0; i < len; i++) { + data = test_data[i]; + ATF_REQUIRE(sbrk(data) == origin_brk); + ATF_REQUIRE(sbrk(0) == origin_brk + data); + ATF_REQUIRE(sbrk(-data) == origin_brk + data); + ATF_REQUIRE(sbrk(0) == origin_brk); } }