fix invalid free in if_up
[monky] / src / core.c
index eef425d..be3fb2a 100644 (file)
@@ -36,7 +36,9 @@
 #include "colours.h"
 #include "combine.h"
 #include "diskio.h"
+#include "entropy.h"
 #include "exec.h"
+#include "proc.h"
 #ifdef X11
 #include "fonts.h"
 #endif
@@ -74,9 +76,6 @@
 #include "openbsd.h"
 #endif
 
-/* OS specific prototypes to be implemented by linux.c & Co. */
-void update_entropy(void);
-
 #include <string.h>
 #include <ctype.h>
 
@@ -524,8 +523,6 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
                parse_platform_sensor(obj, arg);
        END OBJ_ARG(hwmon, 0, "hwmon needs argumanets")
                parse_hwmon_sensor(obj, arg);
-#endif /* __linux__ */
-
        END
        /* we have four different types of top (top, top_mem, top_time and top_io). To
         * avoid having almost-same code four times, we have this special
@@ -538,7 +535,6 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
                }
        } else OBJ(addr, &update_net_stats)
                parse_net_stat_arg(obj, arg, free_at_crash);
-#if defined(__linux__)
        END OBJ(addrs, &update_net_stats)
                parse_net_stat_arg(obj, arg, free_at_crash);
 #endif /* __linux__ */
@@ -643,9 +639,116 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
        END OBJ(desktop_name, &update_x11info)
 #endif
        END OBJ(nodename, 0)
+       END OBJ_ARG(cmdline_to_pid, 0, "cmdline_to_pid needs a command line as argument")
+               scan_cmdline_to_pid_arg(obj, arg, free_at_crash);
+       END OBJ_ARG(pid_chroot, 0, "pid_chroot needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_cmdline, 0, "pid_cmdline needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_cwd, 0, "pid_cwd needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_environ, 0, "pid_environ needs arguments")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_environ_list, 0, "pid_environ_list needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_exe, 0, "pid_exe needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_openfiles, 0, "pid_openfiles needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_parent, 0, "pid_parent needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_state, 0, "pid_state needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_state_short, 0, "pid_state_short needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_stderr, 0, "pid_stderr needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_stdin, 0, "pid_stdin needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_stdout, 0, "pid_stdout needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_uid, 0, "pid_uid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_euid, 0, "pid_euid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_suid, 0, "pid_suid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_fsuid, 0, "pid_fsuid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_gid, 0, "pid_gid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_egid, 0, "pid_egid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_sgid, 0, "pid_sgid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_fsgid, 0, "pid_fsgid needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(gid_name, 0, "gid_name needs a gid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(uid_name, 0, "uid_name needs a uid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmpeak, 0, "pid_vmpeak needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmsize, 0, "pid_vmsize needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmlck, 0, "pid_vmlck needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmhwm, 0, "pid_vmhwm needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmrss, 0, "pid_vmrss needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmdata, 0, "pid_vmdata needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmstk, 0, "pid_vmstk needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmexe, 0, "pid_vmexe needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmlib, 0, "pid_vmlib needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
+       END OBJ_ARG(pid_vmpte, 0, "pid_vmpte needs a pid as argument")
+               obj->sub = malloc(sizeof(struct text_object));
+               extract_variable_text_internal(obj->sub, arg);
        END OBJ(processes, &update_total_processes)
-       END OBJ(running_processes, &update_running_processes)
+#ifdef __linux__
+       END OBJ(running_processes, &update_top)
+               top_running = 1;
        END OBJ(threads, &update_threads)
+       END OBJ(running_threads, &update_stat)
+#else
+       END OBJ(running_processes, &update_running_processes)
+#endif /* __linux__ */
        END OBJ(shadecolor, 0)
 #ifdef X11
                obj->data.l = arg ? get_x11_color(arg) : default_bg_color;
@@ -700,18 +803,16 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
 #endif
        END OBJ(uptime_short, &update_uptime)
        END OBJ(uptime, &update_uptime)
+#if defined(__linux__)
        END OBJ(user_names, &update_users)
        END OBJ(user_times, &update_users)
+       END OBJ_ARG(user_time, 0, "user time needs a console name as argument")
+               obj->data.s = strndup(arg, text_buffer_size);
        END OBJ(user_terms, &update_users)
        END OBJ(user_number, &update_users)
-#if defined(__linux__)
        END OBJ(gw_iface, &update_gateway_info)
        END OBJ(gw_ip, &update_gateway_info)
 #endif /* !__linux__ */
-#ifndef __OpenBSD__
-       END OBJ(adt746xcpu, 0)
-       END OBJ(adt746xfan, 0)
-#endif /* !__OpenBSD__ */
 #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
                || defined(__OpenBSD__)) && (defined(i386) || defined(__i386__))
        END OBJ(apm_adapter, 0)
@@ -1235,6 +1336,52 @@ void free_text_objects(struct text_object *root, int internal)
                                free_sysfs_sensor(obj);
                                break;
 #endif /* __linux__ */
+                       case OBJ_cmdline_to_pid:
+                               free(data.s);
+                               break;
+                       case OBJ_pid_environ:
+                       case OBJ_pid_chroot:
+                       case OBJ_pid_cmdline:
+                       case OBJ_pid_cwd:
+                       case OBJ_pid_environ_list:
+                       case OBJ_pid_exe:
+                       case OBJ_pid_openfiles:
+                       case OBJ_pid_parent:
+                       case OBJ_pid_state:
+                       case OBJ_pid_state_short:
+                       case OBJ_pid_stderr:
+                       case OBJ_pid_stdin:
+                       case OBJ_pid_stdout:
+                       case OBJ_pid_uid:
+                       case OBJ_pid_euid:
+                       case OBJ_pid_suid:
+                       case OBJ_pid_fsuid:
+                       case OBJ_pid_gid:
+                       case OBJ_pid_egid:
+                       case OBJ_pid_sgid:
+                       case OBJ_pid_fsgid:
+                       case OBJ_pid_vmpeak:
+                       case OBJ_pid_vmsize:
+                       case OBJ_pid_vmlck:
+                       case OBJ_pid_vmhwm:
+                       case OBJ_pid_vmrss:
+                       case OBJ_pid_vmdata:
+                       case OBJ_pid_vmstk:
+                       case OBJ_pid_vmexe:
+                       case OBJ_pid_vmlib:
+                       case OBJ_pid_vmpte:
+                       case OBJ_gid_name:
+                               if(obj->sub) {
+                                       free_text_objects(obj->sub, 1);
+                                       free(obj->sub);
+                               }
+                               break;
+                       case OBJ_uid_name:
+                               if(obj->sub) {
+                                       free_text_objects(obj->sub, 1);
+                                       free(obj->sub);
+                               }
+                               break;
                        case OBJ_read_tcp:
                                free_read_tcp(obj);
                                break;
@@ -1462,6 +1609,7 @@ void free_text_objects(struct text_object *root, int internal)
                        case OBJ_nameserver:
                                free_dns_data();
                                break;
+#ifdef __linux__
                        case OBJ_top:
                        case OBJ_top_mem:
                        case OBJ_top_time:
@@ -1470,6 +1618,7 @@ void free_text_objects(struct text_object *root, int internal)
 #endif
                                free_top(obj, internal);
                                break;
+#endif /* __linux__ */
 #ifdef HDDTEMP
                        case OBJ_hddtemp:
                                if (data.s) {
@@ -1502,6 +1651,15 @@ void free_text_objects(struct text_object *root, int internal)
                                        info.users.times = 0;
                                }
                                break;
+                       case OBJ_user_time:
+                               if (info.users.ctime) {
+                                       free(info.users.ctime);
+                                       info.users.ctime = 0;
+                               }
+                               if (data.s) {
+                                       free(data.s);
+                               }
+                               break;
 #ifdef IBM
                        case OBJ_smapi:
                        case OBJ_smapi_bat_perc:
@@ -1608,6 +1766,7 @@ void free_text_objects(struct text_object *root, int internal)
                                break;
 #endif /* X11 */
                }
+               if(obj->type != OBJ_if_up && obj->special_data) free(obj->special_data);
                free(obj);
        }
 #undef data