Commit 23884007 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull tracing fixes from Steven Rostedt:

 - Avoid NULL return from hist_field_name()

   The function hist_field_name() is directly passed to a strcat() which
   does not handle "NULL" characters. Return a zero length string when
   size is greater than the limit.

   This is used only to output already created histograms and no field
   currently is greater than the limit. But it should still not return
   NULL.

 - Do not call map->ops->elt_free() on allocation failure

   When elt_alloc() fails, it should not call the map->ops->elt_free()
   function if it exists, as that function may not be able to handle the
   free on allocation failures. The ->elt_free() should only be called
   when elt_alloc() succeeds.

* tag 'trace-v7.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
  tracing: Do not call map->ops->elt_free() if elt_alloc() fails
  tracing: Avoid NULL return from hist_field_name() on truncation
parents 6779b50f 8f0f5c4f
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -1369,9 +1369,7 @@ static const char *hist_field_name(struct hist_field *field,
			len = snprintf(full_name, sizeof(full_name), fmt,
				       field->system, field->event_name,
				       field->name);
			if (len >= sizeof(full_name))
				return NULL;

			if (len < sizeof(full_name))
				field_name = full_name;
		} else
			field_name = field->name;
+13 −4
Original line number Diff line number Diff line
@@ -386,13 +386,11 @@ static void tracing_map_elt_init_fields(struct tracing_map_elt *elt)
	}
}

static void tracing_map_elt_free(struct tracing_map_elt *elt)
static void __tracing_map_elt_free(struct tracing_map_elt *elt)
{
	if (!elt)
		return;

	if (elt->map->ops && elt->map->ops->elt_free)
		elt->map->ops->elt_free(elt);
	kfree(elt->fields);
	kfree(elt->vars);
	kfree(elt->var_set);
@@ -400,6 +398,17 @@ static void tracing_map_elt_free(struct tracing_map_elt *elt)
	kfree(elt);
}

static void tracing_map_elt_free(struct tracing_map_elt *elt)
{
	if (!elt)
		return;

	/* Only objects initialized with alloc_elt() should be passed to free_elt().*/
	if (elt->map->ops && elt->map->ops->elt_free)
		elt->map->ops->elt_free(elt);
	__tracing_map_elt_free(elt);
}

static struct tracing_map_elt *tracing_map_elt_alloc(struct tracing_map *map)
{
	struct tracing_map_elt *elt;
@@ -444,7 +453,7 @@ static struct tracing_map_elt *tracing_map_elt_alloc(struct tracing_map *map)
	}
	return elt;
 free:
	tracing_map_elt_free(elt);
	__tracing_map_elt_free(elt);

	return ERR_PTR(err);
}