Make the caller responsible for allocating memory for the paste buffer data

(needed by the load-buffer command when dealing with big files since it'll
prevent tmux from dying due to memory exhaustion). From nicm.
pull/1/head
Tiago Cunha 2009-01-25 18:51:28 +00:00
parent 32903241a2
commit d60ad6f483
4 changed files with 15 additions and 15 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-set-buffer.c,v 1.6 2009-01-19 18:23:40 nicm Exp $ */ /* $Id: cmd-set-buffer.c,v 1.7 2009-01-25 18:51:28 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -52,12 +52,13 @@ cmd_set_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
return (-1); return (-1);
limit = options_get_number(&s->options, "buffer-limit"); limit = options_get_number(&s->options, "buffer-limit");
if (data->buffer == -1) if (data->buffer == -1) {
paste_add(&s->buffers, data->arg, limit); paste_add(&s->buffers, xstrdup(data->arg), limit);
else if (paste_replace(&s->buffers, data->buffer, data->arg) != 0) { return (0);
}
if (paste_replace(&s->buffers, data->buffer, xstrdup(data->arg)) != 0) {
ctx->error(ctx, "no buffer %d", data->buffer); ctx->error(ctx, "no buffer %d", data->buffer);
return (-1); return (-1);
} }
return (0); return (0);
} }

10
paste.c
View File

@ -1,4 +1,4 @@
/* $Id: paste.c,v 1.5 2009-01-23 16:19:41 nicm Exp $ */ /* $Id: paste.c,v 1.6 2009-01-25 18:51:28 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -97,7 +97,7 @@ paste_free_index(struct paste_stack *ps, u_int idx)
} }
void void
paste_add(struct paste_stack *ps, const char *data, u_int limit) paste_add(struct paste_stack *ps, char *data, u_int limit)
{ {
struct paste_buffer *pb; struct paste_buffer *pb;
@ -107,13 +107,13 @@ paste_add(struct paste_stack *ps, const char *data, u_int limit)
pb = xmalloc(sizeof *pb); pb = xmalloc(sizeof *pb);
ARRAY_INSERT(ps, 0, pb); ARRAY_INSERT(ps, 0, pb);
pb->data = xstrdup(data); pb->data = data;
if (gettimeofday(&pb->tv, NULL) != 0) if (gettimeofday(&pb->tv, NULL) != 0)
fatal("gettimeofday"); fatal("gettimeofday");
} }
int int
paste_replace(struct paste_stack *ps, u_int idx, const char *data) paste_replace(struct paste_stack *ps, u_int idx, char *data)
{ {
struct paste_buffer *pb; struct paste_buffer *pb;
@ -123,7 +123,7 @@ paste_replace(struct paste_stack *ps, u_int idx, const char *data)
pb = ARRAY_ITEM(ps, idx); pb = ARRAY_ITEM(ps, idx);
xfree(pb->data); xfree(pb->data);
pb->data = xstrdup(data); pb->data = data;
if (gettimeofday(&pb->tv, NULL) != 0) if (gettimeofday(&pb->tv, NULL) != 0)
fatal("gettimeofday"); fatal("gettimeofday");

6
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.248 2009-01-23 16:59:14 nicm Exp $ */ /* $Id: tmux.h,v 1.249 2009-01-25 18:51:28 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -1074,8 +1074,8 @@ struct paste_buffer *paste_get_top(struct paste_stack *);
struct paste_buffer *paste_get_index(struct paste_stack *, u_int); struct paste_buffer *paste_get_index(struct paste_stack *, u_int);
int paste_free_top(struct paste_stack *); int paste_free_top(struct paste_stack *);
int paste_free_index(struct paste_stack *, u_int); int paste_free_index(struct paste_stack *, u_int);
void paste_add(struct paste_stack *, const char *, u_int); void paste_add(struct paste_stack *, char *, u_int);
int paste_replace(struct paste_stack *, u_int, const char *); int paste_replace(struct paste_stack *, u_int, char *);
/* clock.c */ /* clock.c */
void clock_draw(struct screen_write_ctx *, u_int, int); void clock_draw(struct screen_write_ctx *, u_int, int);

View File

@ -1,4 +1,4 @@
/* $Id: window-copy.c,v 1.44 2009-01-23 20:50:58 nicm Exp $ */ /* $Id: window-copy.c,v 1.45 2009-01-25 18:51:28 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -419,7 +419,6 @@ window_copy_copy_selection(struct window_pane *wp, struct client *c)
/* Add the buffer to the stack. */ /* Add the buffer to the stack. */
limit = options_get_number(&c->session->options, "buffer-limit"); limit = options_get_number(&c->session->options, "buffer-limit");
paste_add(&c->session->buffers, buf, limit); paste_add(&c->session->buffers, buf, limit);
xfree(buf);
} }
void void