From patchwork Tue Oct 5 13:56:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 45892 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AA7A3385AC0A for ; Tue, 5 Oct 2021 14:00:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AA7A3385AC0A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1633442435; bh=kby5eZjPTsZbLXzdMXI7EFqJayrA/s4sBRJTRG60zJo=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=LosjePJo+SLBxwG0DhXLG+64QJxmYEsfDi9yAdkKjTXW2CWFDJlX51OzYJdYdYizf 8/jLEjmmzNiYkEyF/IH86VYkivkRV3dtLoBBhs5JD2TEKiYV77wGARHI1WnBatNBEY E2YHXcPhFFo/GTpWFMaLoGjrq6d6+ab/WRv2ODys= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-ua1-x92b.google.com (mail-ua1-x92b.google.com [IPv6:2607:f8b0:4864:20::92b]) by sourceware.org (Postfix) with ESMTPS id DB6A0385AC08 for ; Tue, 5 Oct 2021 13:56:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DB6A0385AC08 Received: by mail-ua1-x92b.google.com with SMTP id c33so14909967uae.9 for ; Tue, 05 Oct 2021 06:56:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kby5eZjPTsZbLXzdMXI7EFqJayrA/s4sBRJTRG60zJo=; b=C5m6UKkiU/J4VA0glMC7EsuqlfdzUH08P3HNg55kF3YfASJATIw3aYWBIJGTjsl444 cltDEKSsBLxVvpQgPYwHXxXocs7dPMrQWeR9JyZIDvOkidneG5FWaNUEQ1lovMki1AMn OjWGgsqoqxh8ncmstbw/Ut1fYFlyJnyMhpe5FWMPitd7wVAYAru3g7DHGO6SaO8hNtGT MwIXiwk3OTV8A5KDH0dHqEZZdYZ19wGKsDA5QWX1DLVy5RjH2jayvEVrsM8OcKebKlsp eGcKM6YY8NKLool/YGbx9aTgDBGI2nFGQr/9k4x7RZNXYKhQ0Of8WdKXW3eGDqlvqhtA fWTA== X-Gm-Message-State: AOAM532Dt6ex7wyph9MGX3aDqHDdN8+mes2n1HAsw24TdfAhmpvpxVsv H8yNIWf2KEUbc1jv729CGjbwyGZgdoXXMQ== X-Google-Smtp-Source: ABdhPJyQ+ViXkdMc2AM5AZ1MVxDgznX9tpEF7zSJ73EaFEKSNV0BRd/rjn/zShyV1FKnsZFPvxWJgw== X-Received: by 2002:a05:6130:3a7:: with SMTP id az39mr4530151uab.8.1633442200183; Tue, 05 Oct 2021 06:56:40 -0700 (PDT) Received: from birita.. ([2804:431:c7cb:807a:9735:fcf:f170:1c20]) by smtp.gmail.com with ESMTPSA id g204sm3204902vkg.1.2021.10.05.06.56.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Oct 2021 06:56:39 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 5/7] misc: syslog: Use static buffer Date: Tue, 5 Oct 2021 10:56:29 -0300 Message-Id: <20211005135631.3209020-6-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211005135631.3209020-1-adhemerval.zanella@linaro.org> References: <20211005135631.3209020-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The static buffer is used instead of memstream for messages up to 1024 bytes to avoid the potential BUFSIZ (8K) malloc and free for each syslog call. The memstream is still used as fallback for larger messages. Checked on x86_64-linux-gnu. --- misc/syslog.c | 105 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 37 deletions(-) diff --git a/misc/syslog.c b/misc/syslog.c index 8365e16128..99fa595b40 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -121,12 +121,11 @@ void __vsyslog_internal(int pri, const char *fmt, va_list ap, unsigned int mode_flags) { - FILE *f; - char *buf = 0; + char *buf = NULL; size_t bufsize = 0; + bool buf_malloced = false; int msgoff; int saved_errno = errno; - char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"]; #define INTERNALLOG LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID /* Check for invalid bits. */ @@ -150,46 +149,78 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, if ((pri & LOG_FACMASK) == 0) pri |= LogFacility; - /* Build the message in a memory-buffer stream. */ - f = __open_memstream (&buf, &bufsize); - if (f != NULL) + pid_t pid = LogStat & LOG_PID ? __getpid () : 0; + + enum + { + timebuf_size = 3+1 /* "%h " */ + + 2+1 /* "%e " */ + + 2+1 + 2+1 + 2+1 + 1, /* "%T " */ + + bufs_size = 1024 + }; + + /* "%h %e %H:%M:%S " */ + char timestamp[timebuf_size]; + time_t now = time_now (); + struct tm now_tm; + __localtime_r (&now, &now_tm); + __strftime_l (timestamp, sizeof (timestamp), "%h %e %T ", &now_tm, + _nl_C_locobj_ptr); + +#define SYSLOG_HEADER(__pri, __timestamp, __msgoff, pid) \ + "<%d>%s %n%s%s%.0d%s: ", \ + __pri, __timestamp, __msgoff, \ + LogTag == NULL ? __progname : LogTag, \ + pid != 0 ? "[" : "", pid, pid != 0 ? "]" : "" + + /* Try to use a static buffer as an optimization. */ + char bufs[bufs_size]; + int l = __snprintf (bufs, sizeof bufs, + SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + if (l < sizeof (bufs)) { - __fsetlocking (f, FSETLOCKING_BYCALLER); - /* "%h %e %H:%M:%S " */ - char timebuf[3+1 /* "%h " */ - + 2+1 /* "%e " */ - + 2+1 + 2+1 + 2+1 + 1 /* "%T " */]; - time_t now = time_now (); - struct tm now_tm; - __localtime_r (&now, &now_tm); - __strftime_l (timebuf, sizeof (timebuf), "%h %e %T ", &now_tm, - _nl_C_locobj_ptr); - - pid_t pid = LogStat & LOG_PID ? __getpid () : 0; - - fprintf (f, "<%d>%s %n%s%s%.0d%s: ", pri, timebuf, &msgoff, - LogTag == NULL ? __progname : LogTag, - pid != 0 ? "[" : "", pid, pid != 0 ? "]" : ""); + va_list apc; + va_copy (apc, ap); + /* Restore errno for %m format. */ __set_errno (saved_errno); - /* We have the header. Print the user's format into the buffer. */ - __vfprintf_internal (f, fmt, ap, mode_flags); + int vl = __vsnprintf_internal (bufs + l, sizeof (bufs) - l, fmt, apc, + mode_flags); + if (l + vl < sizeof (bufs)) + { + buf = bufs; + bufsize = l + vl; + } - /* Close the memory stream; this will finalize the data into a malloc'd - buffer in BUF. */ - fclose (f); - - /* Tell the cancellation handler to free this buffer. */ - clarg.buf = buf; + va_end (apc); } - else + + /* If the required size is larger than buffer size fallbacks to + open_memstream. */ + if (buf == NULL) { - /* We cannot get a stream. There is not much we can do but emitting an - error messages. */ - bufsize = __snprintf (failbuf, sizeof failbuf, "out of memory[%d]", - __getpid ()); - buf = failbuf; + FILE *f = __open_memstream (&buf, &bufsize); + if (f != NULL) + { + __fsetlocking (f, FSETLOCKING_BYCALLER); + fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + /* Restore errno for %m format. */ + __set_errno (saved_errno); + __vfprintf_internal (f, fmt, ap, mode_flags); + fclose (f); + + /* Tell the cancellation handler to free this buffer. */ + buf_malloced = true; + clarg.buf = buf; + } + else + { + bufsize = __snprintf (bufs, sizeof bufs, + "out of memory[%d]", __getpid ()); + buf = bufs; + } } /* Output to stderr if requested. */ @@ -241,7 +272,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, __libc_cleanup_pop (0); __libc_lock_unlock (syslog_lock); - if (buf != failbuf) + if (buf_malloced) free (buf); }