{
struct stat st;
- stat(path, &st);
+ if (stat(path, &st) < 0)
+ return 0;
return S_ISREG(st.st_mode);
}
p->data_sources = calloc(data_sources_get_n(), sizeof(struct data_source));
if (!p->data_sources) {
_E("Unable to allocate memory");
+ free(p);
return -ENOMEM;
}
ret = ds_mod->init(ds);
if (ret) {
_E("Unable to initialize new %s data source: %d", ds_mod->name, ret);
+ process_cleanup(p);
return ret;
}
}
static int process_get_exe(struct proc_info *process)
{
- char buf[NAME_MAX];
+ char buf[NAME_MAX + 1]; // +1 for null terminator
int ret;
free(process->exe);
process->exe = NULL;
- ret = pid_to_basename(process->pid, buf);
+ ret = pid_to_basename(process->pid, buf, sizeof(buf));
if (ret) {
if (ret != -EEXIST)
_E("pid_to_basename() failed, pid: %d, ret: %d", process->pid, ret);
return ret;
}
- process->exe = strndup(buf, NAME_MAX);
+ process->exe = strndup(buf, sizeof(buf));
if (!process->exe) {
_E("Unable to allocate memory");
return -ENOMEM;
for (int i = 0; i < data_sources_get_n(); i++) {
ds = &(process->data_sources[i]);
+ /* Uninitialized list elements can happen if the object
+ * failed halfway through its initialisation. */
+ if (!ds->data_fg.samples.next)
+ continue;
+
/* Remove samples */
list_for_each_entry_safe(sample, sample_next, &ds->data_fg.samples, node) {
list_del(&sample->node);
}
ret = finit_module(fd, "", 0);
- close(fd);
- if (ret) {
+ if (ret)
_E("Unable to load kernel module: %m");
- return ret;
- }
-
- return 0;
+ close(fd);
+ return ret;
}
static void cleanup(void)
return base ? base+1 : path;
}
-int pid_to_basename(int pid, char *basename)
+int pid_to_basename(int pid, char *basename, size_t basename_buflen)
{
- char path[PATH_MAX];
+ char path[PATH_MAX + 1];
char link_name[NAME_MAX];
char *basename_ptr;
- int basename_len;
+ size_t basename_len;
int ret;
/* Assembly /proc/pid/exe */
return -1;
}
- /* Readlink /proc/pid/exe */
- ret = readlink(link_name, path, PATH_MAX);
+ /* Readlink /proc/pid/exe (leaving space for the null terminator
+ * which readlink never appends on its own) */
+ ret = readlink(link_name, path, sizeof(path) - 1);
if (ret <= 0) {
_DD("readlink() failed, pid: %d, ret: %d\n", pid, ret);
return -EEXIST;
basename_ptr = get_basename(path);
basename_len = strlen(basename_ptr);
- strncpy(basename, basename_ptr, basename_len);
+ if (basename_len >= basename_buflen)
+ return -ENAMETOOLONG;
+
+ strncpy(basename, basename_ptr, basename_buflen);
basename[basename_len] = 0;
return 0;
unsigned long long time_now(void);
char *get_basename(char *path);
-int pid_to_basename(int pid, char *basename);
+int pid_to_basename(int pid, char *basename, size_t basename_buflen);
const char *smpl2str(struct sample_s *s);
int _json_object_object_merge(json_object *obj1, char *key, json_object *obj2_node);