Re: dwarves-dfsg: FTBFS on hurd-i386 (for review)
Updated patch. Thanks to Lancelot Six for comments.
On Wed, 2014-04-02 at 12:51 +0200, Lancelot SIX wrote:
> there wan a mistake in my last comment.... (sorry for that).
>
> out_unlink will be reached by the 'normal flow'. You can still
> end up trying to free cmd at a point where it have not been initialized.
> The same is true for the 'regular' out_close since it can be reached
> from line 734.
>
> Therefore, I would suggest that the simplest way is to free 'cmd'
> between line 743 and 744 since it is not necessary after that.
>
> Sorry for the previous message.
>
> BR
> Lancelot
>
>
>
> On Wed, Apr 02, 2014 at 11:54:06AM +0200, Svante Signell wrote:
> > Source: dwarves-dfsg
> > Version: 1.10-2
> > Severity: important
> > Tags: patch
> > User: debian-hurd@lists.debian.org
> > Usertags: hurd
> >
> > Hi,
> >
> > Currently dwarves-dfsg fails to build from source due to PATH_MAX being
> > used, and that constant is not defined on GNU/Hurd. The attached patch
> > avoid using PATH_MAX by allocating strings by malloc and free them when
> > not needed any longer.
> >
> > Thanks!
>
> > --- a/dwarves.c.orig 2012-03-20 17:17:25.000000000 +0100
> > +++ b/dwarves.c 2014-04-02 11:05:36.000000000 +0200
> > @@ -1365,14 +1365,17 @@
> >
> > err = 0;
> > while ((entry = readdir(dir)) != NULL) {
> > - char pathname[PATH_MAX];
> > + char *pathname;
> > + int len;
> > struct stat st;
> >
> > if (strcmp(entry->d_name, ".") == 0 ||
> > strcmp(entry->d_name, "..") == 0)
> > continue;
> >
> > - snprintf(pathname, sizeof(pathname), "%s/%s",
> > + len = strlen(dirname) + 1 + strlen(entry->d_name) + 1;
> > + pathname = malloc(len);
> > + snprintf(pathname, len, "%s/%s",
> > dirname, entry->d_name);
> >
> > err = lstat(pathname, &st);
> > @@ -1392,6 +1395,7 @@
> > if (err != 0)
> > break;
> > }
> > + free (pathname);
> > }
> >
> > if (err == -1)
> > --- a/libctf.c.orig 2012-03-20 17:17:25.000000000 +0100
> > +++ b/libctf.c 2014-04-02 11:09:04.000000000 +0200
> > @@ -723,8 +723,11 @@ found_SUNW_ctf_str:
> > gelf_update_shdr(newscn, &shdr_mem);
> > elf_flagshdr(newscn, ELF_C_SET, ELF_F_DIRTY);
> > #else
> > - char pathname[PATH_MAX];
> > - snprintf(pathname, sizeof(pathname), "%s.SUNW_ctf", self->filename);
> > + int len;
> > + char *pathname;
> > + len = strlen(self->filename) + 9 + 1;
> > + pathname = malloc(len);
> > + snprintf(pathname, len, "%s.SUNW_ctf", self->filename);
> > fd = creat(pathname, S_IRUSR | S_IWUSR);
> > if (fd == -1) {
> > fprintf(stderr, "%s: open(%s) failed!\n", __func__, pathname);
> > @@ -736,13 +739,16 @@ found_SUNW_ctf_str:
> > if (close(fd) < 0)
> > goto out_unlink;
> >
> > - char cmd[PATH_MAX];
> > + char *cmd;
> > + len = 32 + strlen(pathname) + 1 + strlen(self->filename) + 1;
> > snprintf(cmd, sizeof(cmd), "objcopy --add-section .SUNW_ctf=%s %s",
> > pathname, self->filename);
> > if (system(cmd) == 0)
> > err = 0;
> > out_unlink:
> > unlink(pathname);
> > + free(pathname);
> > + free(cmd);
> > return err;
> > #endif
> > out_update:
> > @@ -758,6 +764,8 @@ out_update:
> > elf_end(elf);
> > err = 0;
> > out_close:
> > + free(pathname);
> > + free(cmd);
> > if (bf != self->buf)
> > free(bf);
> > close(fd);
> > --- a/ctracer.c.orig 2012-03-20 17:17:25.000000000 +0100
> > +++ b/ctracer.c 2014-04-02 11:12:09.000000000 +0200
> > @@ -964,14 +964,14 @@ static struct argp ctracer__argp = {
> >
> > int main(int argc, char *argv[])
> > {
> > - int remaining, err;
> > + int remaining, err, len;
> > struct tag *class;
> > struct cu *cu;
> > char *filename;
> > - char functions_filename[PATH_MAX];
> > - char methods_filename[PATH_MAX];
> > - char collector_filename[PATH_MAX];
> > - char classes_filename[PATH_MAX];
> > + char *functions_filename;
> > + char *methods_filename;
> > + char *collector_filename;
> > + char *classes_filename;
> > struct structure *pos;
> > FILE *fp_functions;
> > int rc = EXIT_FAILURE;
> > @@ -1048,7 +1048,10 @@ failure:
> > goto out;
> > }
> >
> > - snprintf(functions_filename, sizeof(functions_filename),
> > + len = strlen(src_dir) + 1 +
> > + strlen(class__name(tag__class(class), cu)) + 10 + 1;
> > + functions_filename = malloc(len);
> > + snprintf(functions_filename, len,
> > "%s/%s.functions", src_dir, class__name(tag__class(class), cu));
> > fp_functions = fopen(functions_filename, "w");
> > if (fp_functions == NULL) {
> > @@ -1057,7 +1060,9 @@ failure:
> > goto out;
> > }
> >
> > - snprintf(methods_filename, sizeof(methods_filename),
> > + len = strlen(src_dir) + 20 + 1;
> > + methods_filename = malloc(len);
> > + snprintf(methods_filename, len,
> > "%s/ctracer_methods.stp", src_dir);
> > fp_methods = fopen(methods_filename, "w");
> > if (fp_methods == NULL) {
> > @@ -1066,7 +1071,9 @@ failure:
> > goto out;
> > }
> >
> > - snprintf(collector_filename, sizeof(collector_filename),
> > + len = strlen(src_dir) + 20 + 1;
> > + collector_filename = malloc(len);
> > + snprintf(collector_filename, len,
> > "%s/ctracer_collector.c", src_dir);
> > fp_collector = fopen(collector_filename, "w");
> > if (fp_collector == NULL) {
> > @@ -1075,7 +1082,9 @@ failure:
> > goto out;
> > }
> >
> > - snprintf(classes_filename, sizeof(classes_filename),
> > + len = strlen(src_dir) + 18 + 1;
> > + classes_filename = malloc(len);
> > + snprintf(classes_filename, len,
> > "%s/ctracer_classes.h", src_dir);
> > fp_classes = fopen(classes_filename, "w");
> > if (fp_classes == NULL) {
> > @@ -1144,6 +1153,10 @@ failure:
> >
> > rc = EXIT_SUCCESS;
> > out:
> > + free(functions_filename);
> > + free(methods_filename);
> > + free(collector_filename);
> > + free(classes_filename);
> > cus__delete(methods_cus);
> > dwarves__exit();
> > return rc;
>
--- a/dwarves.c
+++ b/dwarves.c
@@ -1365,33 +1365,42 @@ int cus__load_dir(struct cus *self, stru
err = 0;
while ((entry = readdir(dir)) != NULL) {
- char pathname[PATH_MAX];
+ char *pathname;
+ int len;
struct stat st;
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
- snprintf(pathname, sizeof(pathname), "%s/%s",
+ len = strlen(dirname) + 1 + strlen(entry->d_name) + 1;
+ pathname = malloc(len);
+ snprintf(pathname, len, "%s/%s",
dirname, entry->d_name);
err = lstat(pathname, &st);
- if (err != 0)
+ if (err != 0) {
+ free(pathname);
break;
-
+ }
if (S_ISDIR(st.st_mode)) {
if (!recursive)
continue;
err = cus__load_dir(self, conf, pathname,
filename_mask, recursive);
- if (err != 0)
+ if (err != 0) {
+ free(pathname);
break;
+ }
} else if (fnmatch(filename_mask, entry->d_name, 0) == 0) {
err = cus__load_file(self, conf, pathname);
- if (err != 0)
+ if (err != 0) {
+ free(pathname);
break;
+ }
}
+ free (pathname);
}
if (err == -1)
--- a/libctf.c
+++ b/libctf.c
@@ -723,8 +723,11 @@ found_SUNW_ctf_str:
gelf_update_shdr(newscn, &shdr_mem);
elf_flagshdr(newscn, ELF_C_SET, ELF_F_DIRTY);
#else
- char pathname[PATH_MAX];
- snprintf(pathname, sizeof(pathname), "%s.SUNW_ctf", self->filename);
+ int len;
+ char *pathname;
+ len = strlen(self->filename) + 9 + 1;
+ pathname = malloc(len);
+ snprintf(pathname, len, "%s.SUNW_ctf", self->filename);
fd = creat(pathname, S_IRUSR | S_IWUSR);
if (fd == -1) {
fprintf(stderr, "%s: open(%s) failed!\n", __func__, pathname);
@@ -736,13 +739,16 @@ found_SUNW_ctf_str:
if (close(fd) < 0)
goto out_unlink;
- char cmd[PATH_MAX];
+ char *cmd;
+ len = 32 + strlen(pathname) + 1 + strlen(self->filename) + 1;
snprintf(cmd, sizeof(cmd), "objcopy --add-section .SUNW_ctf=%s %s",
pathname, self->filename);
if (system(cmd) == 0)
err = 0;
+ free(cmd);
out_unlink:
unlink(pathname);
+ free(pathname);
return err;
#endif
out_update:
@@ -758,6 +764,7 @@ out_update:
elf_end(elf);
err = 0;
out_close:
+ free(pathname);
if (bf != self->buf)
free(bf);
close(fd);
--- a/ctracer.c
+++ b/ctracer.c
@@ -964,14 +964,14 @@ static struct argp ctracer__argp = {
int main(int argc, char *argv[])
{
- int remaining, err;
+ int remaining, err, len;
struct tag *class;
struct cu *cu;
char *filename;
- char functions_filename[PATH_MAX];
- char methods_filename[PATH_MAX];
- char collector_filename[PATH_MAX];
- char classes_filename[PATH_MAX];
+ char *functions_filename;
+ char *methods_filename;
+ char *collector_filename;
+ char *classes_filename;
struct structure *pos;
FILE *fp_functions;
int rc = EXIT_FAILURE;
@@ -1048,7 +1048,10 @@ failure:
goto out;
}
- snprintf(functions_filename, sizeof(functions_filename),
+ len = strlen(src_dir) + 1 +
+ strlen(class__name(tag__class(class), cu)) + 10 + 1;
+ functions_filename = malloc(len);
+ snprintf(functions_filename, len,
"%s/%s.functions", src_dir, class__name(tag__class(class), cu));
fp_functions = fopen(functions_filename, "w");
if (fp_functions == NULL) {
@@ -1057,7 +1060,9 @@ failure:
goto out;
}
- snprintf(methods_filename, sizeof(methods_filename),
+ len = strlen(src_dir) + 20 + 1;
+ methods_filename = malloc(len);
+ snprintf(methods_filename, len,
"%s/ctracer_methods.stp", src_dir);
fp_methods = fopen(methods_filename, "w");
if (fp_methods == NULL) {
@@ -1066,7 +1071,9 @@ failure:
goto out;
}
- snprintf(collector_filename, sizeof(collector_filename),
+ len = strlen(src_dir) + 20 + 1;
+ collector_filename = malloc(len);
+ snprintf(collector_filename, len,
"%s/ctracer_collector.c", src_dir);
fp_collector = fopen(collector_filename, "w");
if (fp_collector == NULL) {
@@ -1075,7 +1082,9 @@ failure:
goto out;
}
- snprintf(classes_filename, sizeof(classes_filename),
+ len = strlen(src_dir) + 18 + 1;
+ classes_filename = malloc(len);
+ snprintf(classes_filename, len,
"%s/ctracer_classes.h", src_dir);
fp_classes = fopen(classes_filename, "w");
if (fp_classes == NULL) {
@@ -1144,6 +1153,10 @@ failure:
rc = EXIT_SUCCESS;
out:
+ free(functions_filename);
+ free(methods_filename);
+ free(collector_filename);
+ free(classes_filename);
cus__delete(methods_cus);
dwarves__exit();
return rc;
Reply to: