From bc827c9083cdf7e6b4e6931f2eecfa7192baa48f Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 2 Jun 2009 01:09:18 +0200 Subject: Don't use the plain char type for data buffers Buffers which are used for holding arbitrary data should be referenced using pointers to void and accessed using pointers to unsigned char. Signed-off-by: Holger Weiss diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index 845fc95..ecf3d08 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c @@ -184,14 +184,14 @@ static u_int get_timevar(const char *); static u_int get_timevaldiff(struct timeval *, struct timeval *); static in_addr_t get_ip_address(const char *); static int wait_for_reply(int, u_int); -static int recvfrom_wto(int, char *, unsigned int, struct sockaddr *, u_int *); +static int recvfrom_wto(int, void *, unsigned int, struct sockaddr *, u_int *); static int send_icmp_ping(int, struct rta_host *); static int get_threshold(char *str, threshold *th); static void run_checks(void); static void set_source_ip(char *); static int add_target(char *); static int add_target_ip(char *, struct in_addr *); -static int handle_random_icmp(char *, struct sockaddr_in *); +static int handle_random_icmp(unsigned char *, struct sockaddr_in *); static unsigned short icmp_checksum(unsigned short *, int); static void finish(int); static void crash(const char *, ...); @@ -300,7 +300,7 @@ get_icmp_error_msg(unsigned char icmp_type, unsigned char icmp_code) } static int -handle_random_icmp(char *packet, struct sockaddr_in *addr) +handle_random_icmp(unsigned char *packet, struct sockaddr_in *addr) { struct icmp p, sent_icmp; struct rta_host *host = NULL; @@ -694,7 +694,7 @@ static int wait_for_reply(int sock, u_int t) { int n, hlen; - static char buf[4096]; + static unsigned char buf[4096]; struct sockaddr_in resp_addr; struct ip *ip; struct icmp icp; @@ -814,7 +814,7 @@ static int send_icmp_ping(int sock, struct rta_host *host) { static union { - char *buf; /* re-use so we prevent leaks */ + void *buf; /* re-use so we prevent leaks */ struct icmp *icp; u_short *cksum_in; } packet = { NULL }; @@ -867,7 +867,7 @@ send_icmp_ping(int sock, struct rta_host *host) } static int -recvfrom_wto(int sock, char *buf, unsigned int len, struct sockaddr *saddr, +recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, u_int *timo) { u_int slen; -- cgit v0.10-9-g596f From 9eabd8d054f003960daa150324873474df7aab60 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 2 Jun 2009 01:11:19 +0200 Subject: Fix the memory allocation for the thresholds data Allocate the appropriate amount of memory for storing the thresholds data. Before, we allocated the amount of memory required for storing a _pointer_ to the thresholds data. This crashed (at least) check_mysql when using its "-S" option on FreeBSD/amd64 (as reported and analyzed by Nikita Kalabukhov - 2797757). Signed-off-by: Holger Weiss diff --git a/THANKS.in b/THANKS.in index 189ba26..aba48c6 100644 --- a/THANKS.in +++ b/THANKS.in @@ -254,3 +254,4 @@ Ben Timby Martin Foster Joe Presbrey Will Preston +Nikita Kalabukhov diff --git a/lib/utils_base.c b/lib/utils_base.c index 77700f5..4303e15 100644 --- a/lib/utils_base.c +++ b/lib/utils_base.c @@ -101,7 +101,9 @@ _set_thresholds(thresholds **my_thresholds, char *warn_string, char *critical_st { thresholds *temp_thresholds = NULL; - temp_thresholds = malloc(sizeof(temp_thresholds)); + if ((temp_thresholds = malloc(sizeof(thresholds))) == NULL) + die(STATE_UNKNOWN, _("Cannot allocate memory: %s\n"), + strerror(errno)); temp_thresholds->warning = NULL; temp_thresholds->critical = NULL; -- cgit v0.10-9-g596f From 6e5d12b5d0345e61425399aff22c5a54fbebaf9e Mon Sep 17 00:00:00 2001 From: Thomas Guyot-Sionnest Date: Wed, 10 Jun 2009 23:16:12 -0400 Subject: Use a more "natural" way of writing argument lists in extra-opts tests. diff --git a/lib/extra_opts.h b/lib/extra_opts.h index 0cb47fb..4bb7b73 100644 --- a/lib/extra_opts.h +++ b/lib/extra_opts.h @@ -8,11 +8,14 @@ /* np_extra_opts: Process the --extra-opts arguments and create a new argument * array with ini-processed and argument-passed arguments together. The - * ini-procesed arguments always come first (in the ord of --extra-opts + * ini-procesed arguments always come first (in the order of --extra-opts * arguments). If no --extra-opts arguments are provided or returned nothing * it returns **argv otherwise the new array is returned. --extra-opts are * always removed from **argv. The original pointers from **argv are kept in * the new array to preserve ability to overwrite arguments in processlist. + * + * The new array can be easily freed as long as a pointer to the original one + * is kept. See my_free() in lib/tests/test_opts1.c for an example. */ char **np_extra_opts(int *argc, char **argv, const char *plugin_name); diff --git a/lib/tests/test_opts1.c b/lib/tests/test_opts1.c index 0b91622..077c5b6 100644 --- a/lib/tests/test_opts1.c +++ b/lib/tests/test_opts1.c @@ -21,14 +21,44 @@ #include "tap.h" -void my_free(int *argc, char **argv) { +/* This my_free would be the most efficient way of freeing an extra-opts array, + * provided as an example */ +#if 0 +void my_free(int *argc, char **newargv, char **argv) { int i; - printf (" Arg(%i): ", *argc); - for (i=1; i<*argc; i++) printf ("'%s' ", argv[i]); + /* Return if both arrays are the same */ + if (newargv == argv) return; + + for (i=1; i<*argc; i++) { + /* Free array items until we reach the start of the original argv */ + if (newargv[i] == argv[1]) break; + free(newargv[i]); + } + /* Free the array itself */ + free(newargv); +} +#else +void my_free(int *argc, char **newargv, char **argv) { + /* Free stuff (and print while we're at it) */ + int i, freeflag=1; + printf (" Arg(%i): ", *argc+1); + printf ("'%s' ", newargv[0]); + for (i=1; i<*argc; i++) { + printf ("'%s' ", newargv[i]); + /* Stop freeing when we get to the start of the original array */ + if (freeflag) { + if (newargv[i] == argv[1]) + freeflag=0; + else + free(newargv[i]); + } + } printf ("\n"); - free(argv); + /* Free only if it's a different array */ + if (newargv != argv) free(newargv); *argc=0; } +#endif int array_diff(int i1, char **a1, int i2, char **a2) { int i; @@ -54,94 +84,55 @@ int array_diff(int i1, char **a1, int i2, char **a2) { int main (int argc, char **argv) { - char **argv_test=NULL, **argv_known=NULL; + char **argv_new=NULL; int i, argc_test; plan_tests(5); - argv_test=(char **)malloc(2*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = NULL; - argc_test=1; - argv_known=(char **)realloc(argv_known, 2*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 1, argv_known), "No opts, returns correct argv/argc"); - my_free(&argc_test, argv_test); + { + char *argv_test[] = {"prog_name", (char *) NULL}; + argc_test=1; + char *argv_known[] = {"prog_name", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 1, argv_known), "No opts, returns correct argv/argc"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(6*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "arg1"; - argv_test[2] = "--arg2=val1"; - argv_test[3] = "--arg3"; - argv_test[4] = "val2"; - argv_test[5] = NULL; - argc_test=5; - argv_known=(char **)realloc(argv_known, 6*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "arg1"; - argv_known[2] = "--arg2=val1"; - argv_known[3] = "--arg3"; - argv_known[4] = "val2"; - argv_known[5] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 5, argv_known), "No extra opts, verbatim copy of argv"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"prog_name", "arg1", "--arg2=val1", "--arg3", "val2", (char *) NULL}; + argc_test=5; + char *argv_known[] = {"prog_name", "arg1", "--arg2=val1", "--arg3", "val2", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 5, argv_known), "No extra opts, verbatim copy of argv"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(3*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "--extra-opts=@./config-opts.ini"; - argv_test[2] = NULL; - argc_test=2; - argv_known=(char **)realloc(argv_known, 5*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "--foo=Bar"; - argv_known[2] = "--this=Your Mother!"; - argv_known[3] = "--blank"; - argv_known[4] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 4, argv_known), "Only extra opts using default section"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"prog_name", "--extra-opts=@./config-opts.ini", (char *) NULL}; + argc_test=2; + char *argv_known[] = {"prog_name", "--foo=Bar", "--this=Your Mother!", "--blank", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 4, argv_known), "Only extra opts using default section"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(5*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "--extra-opts=sect1@./config-opts.ini"; - argv_test[2] = "--extra-opts"; - argv_test[3] = "sect2@./config-opts.ini"; - argv_test[4] = NULL; - argc_test=4; - argv_known=(char **)realloc(argv_known, 5*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "--one=two"; - argv_known[2] = "--something else=oops"; - argv_known[3] = "--this=that"; - argv_known[4] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 4, argv_known), "Only extra opts specified twice"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"prog_name", "--extra-opts=sect1@./config-opts.ini", "--extra-opts", "sect2@./config-opts.ini", (char *) NULL}; + argc_test=4; + char *argv_known[] = {"prog_name", "--one=two", "--something else=oops", "--this=that", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 4, argv_known), "Only extra opts specified twice"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(7*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "--arg1=val1"; - argv_test[2] = "--extra-opts=@./config-opts.ini"; - argv_test[3] = "--extra-opts"; - argv_test[4] = "sect1@./config-opts.ini"; - argv_test[5] = "--arg2"; - argv_test[6] = NULL; - argc_test=6; - argv_known=(char **)realloc(argv_known, 8*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "--foo=Bar"; - argv_known[2] = "--this=Your Mother!"; - argv_known[3] = "--blank"; - argv_known[4] = "--one=two"; - argv_known[5] = "--arg1=val1"; - argv_known[6] = "--arg2"; - argv_known[7] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 7, argv_known), "twice extra opts using two sections"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"prog_name", "--arg1=val1", "--extra-opts=@./config-opts.ini", "--extra-opts", "sect1@./config-opts.ini", "--arg2", (char *) NULL}; + argc_test=6; + char *argv_known[] = {"prog_name", "--foo=Bar", "--this=Your Mother!", "--blank", "--one=two", "--arg1=val1", "--arg2", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 7, argv_known), "twice extra opts using two sections"); + my_free(&argc_test, argv_new, argv_test); + } return exit_status(); } diff --git a/lib/tests/test_opts2.c b/lib/tests/test_opts2.c index e50f23e..c3d2067 100644 --- a/lib/tests/test_opts2.c +++ b/lib/tests/test_opts2.c @@ -21,12 +21,24 @@ #include "tap.h" -void my_free(int *argc, char **argv) { - int i; - printf (" Arg(%i): ", *argc); - for (i=1; i<*argc; i++) printf ("'%s' ", argv[i]); +void my_free(int *argc, char **newargv, char **argv) { + /* Free stuff (and print while we're at it) */ + int i, freeflag=1; + printf (" Arg(%i): ", *argc+1); + printf ("'%s' ", newargv[0]); + for (i=1; i<*argc; i++) { + printf ("'%s' ", newargv[i]); + /* Stop freeing when we get to the start of the original array */ + if (freeflag) { + if (newargv[i] == argv[1]) + freeflag=0; + else + free(newargv[i]); + } + } printf ("\n"); - free(argv); + /* Free only if it's a different array */ + if (newargv != argv) free(newargv); *argc=0; } @@ -54,97 +66,55 @@ int array_diff(int i1, char **a1, int i2, char **a2) { int main (int argc, char **argv) { - char **argv_test=NULL, **argv_known=NULL; + char **argv_new=NULL; int i, argc_test; plan_tests(5); - argv_test=(char **)malloc(6*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "arg1"; - argv_test[2] = "--extra-opts"; - argv_test[3] = "--arg3"; - argv_test[4] = "val2"; - argv_test[5] = NULL; - argc_test=5; - argv_known=(char **)realloc(argv_known, 6*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "--foo=bar"; - argv_known[2] = "arg1"; - argv_known[3] = "--arg3"; - argv_known[4] = "val2"; - argv_known[5] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 1"); + { + char *argv_test[] = {"prog_name", "arg1", "--extra-opts", "--arg3", "val2", (char *) NULL}; + argc_test=5; + char *argv_known[] = {"prog_name", "--foo=bar", "arg1", "--arg3", "val2", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 5, argv_known), "Default section 1"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(3*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "--extra-opts"; - argv_test[2] = NULL; - argc_test=2; - argv_known=(char **)realloc(argv_known, 3*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "--foo=bar"; - argv_known[2] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 2, argv_known), "Default section 2"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"prog_name", "--extra-opts", (char *) NULL}; + argc_test=2; + char *argv_known[] = {"prog_name", "--foo=bar", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 2, argv_known), "Default section 2"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(6*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "arg1"; - argv_test[2] = "--extra-opts=section1"; - argv_test[3] = "--arg3"; - argv_test[4] = "val2"; - argv_test[5] = NULL; - argc_test=5; - argv_known=(char **)realloc(argv_known, 6*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "--foobar=baz"; - argv_known[2] = "arg1"; - argv_known[3] = "--arg3"; - argv_known[4] = "val2"; - argv_known[5] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 3"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"prog_name", "arg1", "--extra-opts=section1", "--arg3", "val2", (char *) NULL}; + argc_test=5; + char *argv_known[] = {"prog_name", "--foobar=baz", "arg1", "--arg3", "val2", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 5, argv_known), "Default section 3"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(6*sizeof(char **)); - argv_test[0] = "prog_name"; - argv_test[1] = "arg1"; - argv_test[2] = "--extra-opts"; - argv_test[3] = "-arg3"; - argv_test[4] = "val2"; - argv_test[5] = NULL; - argc_test=5; - argv_known=(char **)realloc(argv_known, 6*sizeof(char **)); - argv_known[0] = "prog_name"; - argv_known[1] = "--foo=bar"; - argv_known[2] = "arg1"; - argv_known[3] = "-arg3"; - argv_known[4] = "val2"; - argv_known[5] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); - ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 4"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"prog_name", "arg1", "--extra-opts", "-arg3", "val2", (char *) NULL}; + argc_test=5; + char *argv_known[] = {"prog_name", "--foo=bar", "arg1", "-arg3", "val2", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_disk"); + ok(array_diff(argc_test, argv_new, 5, argv_known), "Default section 4"); + my_free(&argc_test, argv_new, argv_test); + } - argv_test=(char **)malloc(4*sizeof(char **)); - argv_test[0] = "check_tcp"; - argv_test[1] = "--extra-opts"; - argv_test[2] = "--extra-opts=tcp_long_lines"; - argv_test[3] = NULL; - argc_test=3; - argv_known=(char **)realloc(argv_known, 7*sizeof(char **)); - argv_known[0] = "check_tcp"; - argv_known[1] = "--timeout=10"; - argv_known[2] = "--escape"; - argv_known[3] = "--send=Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda"; - argv_known[4] = "--expect=Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda"; - argv_known[5] = "--jail"; - argv_known[6] = NULL; - argv_test=np_extra_opts(&argc_test, argv_test, "check_tcp"); - ok(array_diff(argc_test, argv_test, 6, argv_known), "Long lines test"); - my_free(&argc_test,argv_test); + { + char *argv_test[] = {"check_tcp", "--extra-opts", "--extra-opts=tcp_long_lines", (char *) NULL}; + argc_test=3; + char *argv_known[] = {"check_tcp", "--timeout=10", "--escape", "--send=Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda", "--expect=Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda", "--jail", (char *) NULL}; + argv_new=np_extra_opts(&argc_test, argv_test, "check_tcp"); + ok(array_diff(argc_test, argv_new, 6, argv_known), "Long lines test"); + my_free(&argc_test, argv_new, argv_test); + } return exit_status(); } -- cgit v0.10-9-g596f