mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 16:12:59 +02:00
tracing fixes for v7.1:
- 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. -----BEGIN PGP SIGNATURE----- iIoEABYKADIWIQRRSw7ePDh/lE+zeZMp5XQQmuv6qgUCag+BVhQccm9zdGVkdEBn b29kbWlzLm9yZwAKCRAp5XQQmuv6qor+AP94efFkLGAxuv7YIZsPrrkz+dh0XI/N 5asQe9sTnrfGiAD8DhE77S0DkZpMO+OE0J6mqTWmOVqds4RcuCWABxx12Ag= =F67c -----END PGP SIGNATURE----- Merge tag 'trace-v7.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace 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
This commit is contained in:
commit
23884007af
|
|
@ -1369,10 +1369,8 @@ 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;
|
||||
|
||||
field_name = full_name;
|
||||
if (len < sizeof(full_name))
|
||||
field_name = full_name;
|
||||
} else
|
||||
field_name = field->name;
|
||||
} else if (field->flags & HIST_FIELD_FL_TIMESTAMP)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user