[DTrace-devel] [PATCH v2 14/20] fbt, syscall: use getline(), not fgets()
Kris Van Hees
kris.van.hees at oracle.com
Thu Sep 22 20:37:27 UTC 2022
On Wed, Sep 07, 2022 at 02:00:01PM +0100, Nick Alcock via DTrace-devel wrote:
> This lets us drop lots of code to handle too-long lines. (Done for
> consistency with the pid provider, which will do the same thing in a
> subsequent commit.)
>
> Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
> Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_prov_fbt.c | 20 +++++---------------
> libdtrace/dt_prov_syscall.c | 20 ++++----------------
> libdtrace/dt_provider_tp.c | 14 +++++++++-----
> 3 files changed, 18 insertions(+), 36 deletions(-)
>
> diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
> index 2a12e4ec49ea..72c31469df61 100644
> --- a/libdtrace/dt_prov_fbt.c
> +++ b/libdtrace/dt_prov_fbt.c
> @@ -62,10 +62,10 @@ static int populate(dtrace_hdl_t *dtp)
> {
> dt_provider_t *prv;
> FILE *f;
> - char buf[256];
> + char *buf = NULL;
> char *p;
> const char *mod = modname;
> - int n = 0;
> + size_t n;
> dtrace_syminfo_t sip;
> dtrace_probedesc_t pd;
>
> @@ -77,27 +77,16 @@ static int populate(dtrace_hdl_t *dtp)
> if (f == NULL)
> return 0;
>
> - while (fgets(buf, sizeof(buf), f)) {
> + while (getline(&buf, &n, f) >= 0) {
> /*
> * Here buf is either "funcname\n" or "funcname [modname]\n".
> + * The last line may not have a linefeed.
> */
> p = strchr(buf, '\n');
> if (p) {
> *p = '\0';
> if (p > buf && *(--p) == ']')
> *p = '\0';
> - } else {
> - /*
> - * If we didn't see a newline, the line was too long.
> - * Report it, and skip until the end of the line.
> - */
> - fprintf(stderr, "%s: Line too long: %s\n",
> - PROBE_LIST, buf);
> -
> - do
> - fgets(buf, sizeof(buf), f);
> - while (strchr(buf, '\n') == NULL);
> - continue;
> }
>
> /*
> @@ -142,6 +131,7 @@ static int populate(dtrace_hdl_t *dtp)
> n++;
> }
>
> + free(buf);
> fclose(f);
>
> return n;
> diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
> index d62c0e113d57..518340a9ad02 100644
> --- a/libdtrace/dt_prov_syscall.c
> +++ b/libdtrace/dt_prov_syscall.c
> @@ -72,8 +72,8 @@ static int populate(dtrace_hdl_t *dtp)
> {
> dt_provider_t *prv;
> FILE *f;
> - char buf[256];
> - int n = 0;
> + char *buf = NULL;
> + size_t n;
>
> prv = dt_provider_create(dtp, prvname, &dt_syscall, &pattr);
> if (prv == NULL)
> @@ -83,26 +83,13 @@ static int populate(dtrace_hdl_t *dtp)
> if (f == NULL)
> return 0;
>
> - while (fgets(buf, sizeof(buf), f)) {
> + while (getline(&buf, &n, f) >= 0) {
> char *p;
>
> /* Here buf is "group:event". */
> p = strchr(buf, '\n');
> if (p)
> *p = '\0';
> - else {
> - /*
> - * If we didn't see a newline, the line was too long.
> - * Report it, and skip until the end of the line.
> - */
> - fprintf(stderr, "%s: Line too long: %s\n",
> - PROBE_LIST, buf);
> - do
> - fgets(buf, sizeof(buf), f);
> - while (strchr(buf, '\n') == NULL);
> - continue;
> - }
> -
> /* We need "group:" to match "syscalls:". */
> p = buf;
> if (memcmp(p, PROV_PREFIX, sizeof(PROV_PREFIX) - 1) != 0)
> @@ -127,6 +114,7 @@ static int populate(dtrace_hdl_t *dtp)
> }
> }
>
> + free(buf);
> fclose(f);
>
> return n;
> diff --git a/libdtrace/dt_provider_tp.c b/libdtrace/dt_provider_tp.c
> index 38504ed04f54..fdd7f9c5d4b3 100644
> --- a/libdtrace/dt_provider_tp.c
> +++ b/libdtrace/dt_provider_tp.c
> @@ -1,6 +1,6 @@
> /*
> * Oracle Linux DTrace.
> - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
> * Licensed under the Universal Permissive License v 1.0 as shown at
> * http://oss.oracle.com/licenses/upl.
> *
> @@ -120,7 +120,8 @@ int
> dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
> int *argcp, dt_argdesc_t **argvp)
> {
> - char buf[1024];
> + char *buf = NULL;
> + size_t bufsz;
> int argc;
> size_t argsz = 0;
> dt_argdesc_t *argv = NULL;
> @@ -139,7 +140,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
> * total size of all type strings together).
> */
> argc = -skip;
> - while (fgets(buf, sizeof(buf), f)) {
> + while (getline(&buf, &bufsz, f) >= 0) {
> char *p = buf;
>
> if (sscanf(buf, "ID: %d\n", &tpp->event_id) == 1)
> @@ -159,6 +160,8 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
> */
> argsz += strlen(p) + 1;
> }
> + free(buf);
> + buf = NULL;
>
> /*
> * If we saw less fields than expected, we flag an error.
> @@ -183,7 +186,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
> */
> rewind(f);
> argc = -skip;
> - while (fgets(buf, sizeof(buf), f)) {
> + while (getline(&buf, &bufsz, f) >= 0) {
> char *p = buf;
> size_t l;
>
> @@ -255,6 +258,7 @@ skip:
> }
>
> done:
> + free(buf);
> *argcp = argc;
> *argvp = argv;
>
> @@ -263,7 +267,7 @@ done:
>
> /*
> * Detach from a tracepoint for a tracepoint-based probe. The caller should
> - * still call dt_tp_destroy() to free the tracepointe-specific probe data.
> + * still call dt_tp_destroy() to free the tracepoint-specific probe data.
> */
> void
> dt_tp_detach(dtrace_hdl_t *dtp, tp_probe_t *tpp)
> --
> 2.37.1.265.g363c192786.dirty
>
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list