Skip to content

Commit 002cdcb

Browse files
committed
Add support for zlog_limit to zlog stream
1 parent f86907e commit 002cdcb

File tree

2 files changed

+49
-11
lines changed

2 files changed

+49
-11
lines changed

sapi/fpm/fpm/zlog.c

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -326,10 +326,10 @@ static zlog_bool zlog_stream_buf_alloc_ex(struct zlog_stream *stream, size_t nee
326326
size_t size;
327327

328328
if (stream->buf) {
329-
size = MAX(stream->buf_size * 2, needed);
329+
size = MIN(zlog_limit, MAX(stream->buf_size * 2, needed));
330330
buf = realloc(stream->buf, size);
331331
} else {
332-
size = MAX(stream->buf_size, needed);
332+
size = MIN(zlog_limit, MAX(stream->buf_size, needed));
333333
buf = malloc(size);
334334
}
335335

@@ -352,24 +352,61 @@ inline static zlog_bool zlog_stream_buf_alloc(struct zlog_stream *stream) /* {{
352352

353353
static ssize_t zlog_stream_buf_append(struct zlog_stream *stream, const char *str, size_t len) /* {{{ */
354354
{
355-
if (stream->buf_size - stream->buf_len <= len && !zlog_stream_buf_alloc_ex(stream, len)) {
355+
int finished = 0;
356+
357+
if (stream->finished) {
358+
return 0;
359+
}
360+
361+
if (stream->len + len > zlog_limit) {
362+
stream->finished = finished = 1;
363+
len = zlog_limit - stream->len;
364+
}
365+
366+
if (stream->buf_size - stream->len <= len && !zlog_stream_buf_alloc_ex(stream, len)) {
356367
return -1;
357368
}
358369

359370
memcpy(stream->buf, str, len);
360-
stream->buf_len += len;
371+
stream->len += len;
372+
373+
if (finished) {
374+
stream->len = zlog_truncate_buf(stream->buf, stream->len);
375+
}
361376

362377
return len;
363378
}
364379

365-
static inline size_t zlog_stream_write(struct zlog_stream *stream, const char *buf, size_t len) /* {{{ */
380+
static inline ssize_t zlog_stream_write(struct zlog_stream *stream, const char *buf, size_t len) /* {{{ */
366381
{
382+
int finished = 0;
383+
const char *append;
384+
size_t append_len;
385+
386+
if (stream->finished) {
387+
return 0;
388+
}
389+
390+
if (stream->len + len >= zlog_limit) {
391+
stream->finished = finished = 1;
392+
append = (stream->len + len == zlog_limit) ? "\n" : "...\n";
393+
append_len = sizeof(append) - 1;
394+
len = zlog_limit - stream->len - append_len;
395+
}
396+
367397
if (stream->use_fd) {
368-
zend_quiet_write(zlog_fd > -1 ? zlog_fd : STDERR_FILENO, buf, len);
398+
int write_fd = zlog_fd > -1 ? zlog_fd : STDERR_FILENO;
399+
zend_quiet_write(write_fd, buf, len);
400+
if (finished) {
401+
zend_quiet_write(write_fd, append, append_len);
402+
}
369403
}
370404

371405
if (stream->use_stderr) {
372406
zend_quiet_write(STDERR_FILENO, buf, len);
407+
if (finished) {
408+
zend_quiet_write(STDERR_FILENO, append, append_len);
409+
}
373410
}
374411

375412
return len;
@@ -409,7 +446,7 @@ ssize_t zlog_stream_prefix_ex(struct zlog_stream *stream, const char *function,
409446
return -1;
410447
}
411448
len = zlog_buf_prefix(function, line, stream->flags, stream->buf, stream->buf_size);
412-
stream->buf_len = stream->prefix_len = len;
449+
stream->len = stream->prefix_len = len;
413450
return len;
414451
} else {
415452
char sbuf[1024];
@@ -466,12 +503,12 @@ zlog_bool zlog_stream_finish(struct zlog_stream *stream) /* {{{ */
466503
if (stream->use_buffer) {
467504
#ifdef HAVE_SYSLOG_H
468505
if (zlog_fd == ZLOG_SYSLOG) {
469-
stream->buf[stream->buf_len] = '\0';
506+
stream->buf[stream->len] = '\0';
470507
php_syslog(syslog_priorities[zlog_level], "%s", stream->buf);
471508
}
472509
#endif
473-
stream->buf[stream->buf_len++] = '\n';
474-
zlog_stream_write(stream, stream->buf, stream->buf_len);
510+
stream->buf[stream->len++] = '\n';
511+
zlog_stream_write(stream, stream->buf, stream->len);
475512
} else {
476513
zlog_stream_write(stream, "\n", 1);
477514
}

sapi/fpm/fpm/zlog.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ struct zlog_stream {
6969
unsigned int use_buffer:1;
7070
unsigned int use_stderr:1;
7171
unsigned int prefix_buffer:1;
72-
size_t buf_len;
72+
unsigned int finished:1;
73+
size_t len;
7374
size_t buf_size;
7475
char *buf;
7576
size_t prefix_len;

0 commit comments

Comments
 (0)