Fix conversion of SWATCH flags to string form

This was broken in commit [07cdd587], where 'sizeof' was used on a pointer
instead of the buffer pointed-to.

Fix this by having the caller of ircop_flags_to_str() supply a buffer and
length, since there's only two callers and both can use happily use stack
objects.
This commit is contained in:
Kevin Easton
2016-04-10 21:38:38 +10:00
parent 9e4602360a
commit 0b91d61496
2 changed files with 19 additions and 20 deletions

View File

@@ -1,5 +1,7 @@
[Changes 1.2.2] [Changes 1.2.2]
* Fix display of the OperView SWATCH flags variable. (caf)
* Update default /fset SERVER_NOTICE value to remove extra space. (caf) * Update default /fset SERVER_NOTICE value to remove extra space. (caf)
* Treat all NOTICEs before registration as local server notices. (caf) * Treat all NOTICEs before registration as local server notices. (caf)

View File

@@ -1004,38 +1004,36 @@ int i, j;
return flag; return flag;
} }
char *ircop_flags_to_str(long flag) char *ircop_flags_to_str(long flag, char *buffer, size_t len)
{ {
int i, p; int i;
char *buffer = new_malloc(IRCD_BUFFER_SIZE);
for (i = 0, p = 1; opflags[i]; i++, p <<= 1) buffer[0] = 0;
for (i = 0; opflags[i]; i++)
{ {
if (flag & p) if (flag & (1L << i))
{ {
strlcat(buffer, opflags[i], sizeof buffer); strlcat(buffer, opflags[i], len);
strlcat(buffer, ",", sizeof buffer); strlcat(buffer, ",", len);
} }
} }
if (*buffer) return chop(buffer, 1);
chop(buffer, 1);
return buffer;
} }
void print_ircop_flags(int server) void print_ircop_flags(int server)
{ {
long flag; char buffer[200];
char *buffer = NULL; long flag = get_server_ircop_flags(server);
flag = get_server_ircop_flags(server);
buffer = ircop_flags_to_str(flag); ircop_flags_to_str(flag, buffer, sizeof buffer);
put_it("%s", convert_output_format("$G %bOper%BView%n: $0-", "%s", *buffer ? flag == -1 ? "ALL" : buffer : "NONE")); put_it("%s", convert_output_format("$G %bOper%BView%n: $0-", "%s", *buffer ? flag == -1 ? "ALL" : buffer : "NONE"));
new_free(&buffer);
} }
void convert_swatch(Window *win, char *str, int unused) void convert_swatch(Window *win, char *str, int unused)
{ {
unsigned long flag; unsigned long flag;
char *p; char buffer[200];
if (from_server != -1) if (from_server != -1)
{ {
flag = ircop_str_to_flags(get_server_ircop_flags(from_server), str); flag = ircop_str_to_flags(get_server_ircop_flags(from_server), str);
@@ -1044,9 +1042,8 @@ char *p;
else else
flag = ircop_str_to_flags(default_swatch, str); flag = ircop_str_to_flags(default_swatch, str);
default_swatch = flag; default_swatch = flag;
p = ircop_flags_to_str(flag); ircop_flags_to_str(flag, buffer, sizeof buffer);
set_string_var(SWATCH_VAR, p); set_string_var(SWATCH_VAR, buffer);
new_free(&p);
} }
void set_operview_flags(int server, unsigned long flags, int neg) void set_operview_flags(int server, unsigned long flags, int neg)