[systemd-devel] [PATCH 2/2] journal: get rid of LINE_MAX in sd_journal_printv*()

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Mon Apr 15 14:30:31 PDT 2013


On Mon, Apr 15, 2013 at 11:21:03PM +0200, Zbigniew Jędrzejewski-Szmek wrote:
> On Mon, Apr 15, 2013 at 10:17:45PM +0200, Harald Hoyer wrote:
> > Am 15.04.2013 21:29, schrieb Zbigniew Jędrzejewski-Szmek:
> > > On Mon, Apr 15, 2013 at 06:41:52PM +0200, harald at redhat.com wrote:
> > >> From: Harald Hoyer <harald at redhat.com>
> > >>
> > >> use stack_size_guess() to get rid of LINE_MAX
> > >> ---
> > >>  src/journal/journal-send.c      | 99 +++++++++++++++++++++++++++++++----------
> > >>  src/journal/test-journal-send.c | 92 +++++++++++++++++++++++++++++++++-----
> > >>  2 files changed, 156 insertions(+), 35 deletions(-)
> > >>
> > >> diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
> > >> index 4b9109a..2ff04b4 100644
> > >> --- a/src/journal/journal-send.c
> > >> +++ b/src/journal/journal-send.c
> > >> @@ -26,6 +26,7 @@
> > >>  #include <unistd.h>
> > >>  #include <fcntl.h>
> > >>  #include <printf.h>
> > >> +#include <sys/resource.h>
> > >>  
> > >>  #define SD_JOURNAL_SUPPRESS_LOCATION
> > >>  
> > >> @@ -35,15 +36,17 @@
> > >>  
> > >>  #define SNDBUF_SIZE (8*1024*1024)
> > >>  
> > >> -#define ALLOCA_CODE_FUNC(f, func)                 \
> > >> -        do {                                      \
> > >> -                size_t _fl;                       \
> > >> -                const char *_func = (func);       \
> > >> -                char **_f = &(f);                 \
> > >> -                _fl = strlen(_func) + 1;          \
> > >> -                *_f = alloca(_fl + 10);           \
> > >> -                memcpy(*_f, "CODE_FUNC=", 10);    \
> > >> -                memcpy(*_f + 10, _func, _fl);     \
> > >> +#define ALLOCA_CODE_FUNC(f, func)                    \
> > >> +        do {                                         \
> > >> +                size_t _fl;                          \
> > >> +                const char *_func = (func);          \
> > >> +                char **_f = &(f);                    \
> > >> +                _fl = strlen(_func) + 1;             \
> > >> +                if (stack_size_guess() < (_fl + 10)) \
> > > Can't _fl + 10 overflow (on 32 bit)?
> > 
> > You mean signed vs unsigned?
> No, I mean _fl can be 4×2³² - 9, and, then _fl+10 == 1.
> C99 says size_t is "at least 16 bits", although I don't
> think that less than 32 bits is common.
> On a modern machine strlen() on a 4GB string should take
> about a second, so it seems plausible to feed this function
> with a big enough string, maybe on a kernel with PAE.
Hm, I've now read the wikipedia page ;), and I see
that it's not possible. So I guess that's not a valid concern.

Zbyszek


More information about the systemd-devel mailing list