va_copy() problem

Johannes Hofmann Johannes.Hofmann at gmx.de
Mon Nov 12 10:58:30 PST 2007


Hello,

I see crashes with a string handling library on DragonFly.
The problem can be reduced to the test program below. It crashes on
DragonFly when compiled with "gcc -O2 -o foo foo.c". Without -O2 it 
runs fine. No problems on Linux with or without -O2.
Can anyone spot the problem? I think its related to the use of
va_copy().

Thanks,
Johannes


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

struct string {
	char *str;
	int size;
	int len;
};

void
string_resize(struct string *s, int n) {
	if (n > 0 && n > s->size) {
		if (!s->str) {
			s->str = malloc(n);
			s->str[0] = '\0';
		} else {
			s->str = realloc(s->str, n);
		}

		s->size = n;
	}
}

void
string_printfa(struct string *s, char *format, ...) {
	va_list va, va1;
	int n;

	va_start(va, format);

	for (;;) {
		va_copy(va1, va);
		n = vsnprintf(s->str + s->len, s->size - s->len, format, va);
		va_end(va1);

		if (n < s->size - s->len) {
			s->len += n;
			break;
		}

		string_resize(s, s->len + n + 1);
	}

	va_end(va);
}

int main(int argc, char **argv) {
	struct string s = {NULL, 0, 0};

	string_resize(&s, 1);
	string_printfa(&s, "%s %s ", "foo", "bar");
	string_printfa(&s, "%s %s ", "foo", "bar");
	printf("%s\n", s.str);

	return 0;
}






More information about the Users mailing list