mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Memory leaks, from David CARLIER.
This commit is contained in:
		@@ -127,6 +127,7 @@ error:
 | 
			
		||||
	free(pdata);
 | 
			
		||||
	if (f != NULL)
 | 
			
		||||
		fclose(f);
 | 
			
		||||
	free(file);
 | 
			
		||||
	return (CMD_RETURN_ERROR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -112,6 +112,7 @@ cmd_save_buffer_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
	if (fwrite(bufdata, 1, bufsize, f) != bufsize) {
 | 
			
		||||
		cmdq_error(item, "%s: write error", file);
 | 
			
		||||
		fclose(f);
 | 
			
		||||
		free(file);
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,8 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
	enum options_table_scope	 scope;
 | 
			
		||||
	struct options			*oo;
 | 
			
		||||
	struct options_entry		*parent, *o;
 | 
			
		||||
	const char			*name, *value, *target;
 | 
			
		||||
	char				*name;
 | 
			
		||||
	const char			*value, *target;
 | 
			
		||||
	int				 window, idx, already, error, ambiguous;
 | 
			
		||||
	char				*cause;
 | 
			
		||||
 | 
			
		||||
@@ -121,7 +122,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
			return (CMD_RETURN_NORMAL);
 | 
			
		||||
		cmdq_error(item, "%s", cause);
 | 
			
		||||
		free(cause);
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
		goto fail;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Which table should this option go into? */
 | 
			
		||||
@@ -136,7 +137,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
				cmdq_error(item, "no such session: %s", target);
 | 
			
		||||
			else
 | 
			
		||||
				cmdq_error(item, "no current session");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		} else
 | 
			
		||||
			oo = s->options;
 | 
			
		||||
	} else if (scope == OPTIONS_TABLE_WINDOW) {
 | 
			
		||||
@@ -148,7 +149,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
				cmdq_error(item, "no such window: %s", target);
 | 
			
		||||
			else
 | 
			
		||||
				cmdq_error(item, "no current window");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		} else
 | 
			
		||||
			oo = wl->window->options;
 | 
			
		||||
	}
 | 
			
		||||
@@ -159,7 +160,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
	if (idx != -1) {
 | 
			
		||||
		if (*name == '@' || options_array_size(parent, NULL) == -1) {
 | 
			
		||||
			cmdq_error(item, "not an array: %s", args->argv[0]);
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -177,14 +178,14 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
			if (args_has(args, 'q'))
 | 
			
		||||
				return (CMD_RETURN_NORMAL);
 | 
			
		||||
			cmdq_error(item, "already set: %s", args->argv[0]);
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Change the option. */
 | 
			
		||||
	if (args_has(args, 'u')) {
 | 
			
		||||
		if (o == NULL)
 | 
			
		||||
			return (CMD_RETURN_NORMAL);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		if (idx == -1) {
 | 
			
		||||
			if (oo == global_options ||
 | 
			
		||||
			    oo == global_s_options ||
 | 
			
		||||
@@ -197,17 +198,17 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
	} else if (*name == '@') {
 | 
			
		||||
		if (value == NULL) {
 | 
			
		||||
			cmdq_error(item, "empty value");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		}
 | 
			
		||||
		options_set_string(oo, name, append, "%s", value);
 | 
			
		||||
	} else if (idx == -1 && options_array_size(parent, NULL) == -1) {
 | 
			
		||||
		error = cmd_set_option_set(self, item, oo, parent, value);
 | 
			
		||||
		if (error != 0)
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
	} else {
 | 
			
		||||
		if (value == NULL) {
 | 
			
		||||
			cmdq_error(item, "empty value");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		}
 | 
			
		||||
		if (o == NULL)
 | 
			
		||||
			o = options_empty(oo, options_table_entry(parent));
 | 
			
		||||
@@ -217,7 +218,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
			options_array_assign(o, value);
 | 
			
		||||
		} else if (options_array_set(o, idx, value, append) != 0) {
 | 
			
		||||
			cmdq_error(item, "invalid index: %s", args->argv[0]);
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
			goto fail;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -261,7 +262,12 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
			server_redraw_client(c);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	free(name);
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
 | 
			
		||||
fail:
 | 
			
		||||
	free(name);
 | 
			
		||||
	return (CMD_RETURN_ERROR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
 
 | 
			
		||||
@@ -433,7 +433,7 @@ options_match(const char *s, int *idx, int* ambiguous)
 | 
			
		||||
 | 
			
		||||
	if (*name == '@') {
 | 
			
		||||
		*ambiguous = 0;
 | 
			
		||||
		return (xstrdup(name));
 | 
			
		||||
		return (name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	found = NULL;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								server.c
									
									
									
									
									
								
							@@ -119,12 +119,16 @@ server_create_socket(void)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	mask = umask(S_IXUSR|S_IXGRP|S_IRWXO);
 | 
			
		||||
	if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1)
 | 
			
		||||
	if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
 | 
			
		||||
		close(fd);
 | 
			
		||||
		return (-1);
 | 
			
		||||
	}
 | 
			
		||||
	umask(mask);
 | 
			
		||||
 | 
			
		||||
	if (listen(fd, 128) == -1)
 | 
			
		||||
	if (listen(fd, 128) == -1) {
 | 
			
		||||
		close(fd);
 | 
			
		||||
		return (-1);
 | 
			
		||||
	}
 | 
			
		||||
	setblocking(fd, 0);
 | 
			
		||||
 | 
			
		||||
	return (fd);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user