Re: libpst: FTBFS on hurd-i386 (for review)
Hi!
On Wed, 2012-06-27 at 20:43:15 +0200, Svante Signell wrote:
> Source: libpst
> Version: 0.6.54-3
> Severity: important
> Tags: patch
> User: debian-hurd@lists.debian.org
> Usertags: hurd
> Hi, libpst does not build for GNU/Hurd due to PATH_MAX issues. Attached
> are three small patches to enable a successful build.
I only see two, is there one missing?
> libpst.c.patch checks for the availability of get_current_dir_name and
> user that function if available.
> pst2dii.cpp.in.patch avoids usage of PATH_MAX by dynamically allocating
> string buffers as needed. pst2dii will be built if imagemagick
> (providing /usr/bin/convert) and libgd2-noxpm-dev | libgd2-xpm-dev
> (providing gd.h and libgd) are installed, so a dependency on these needs
> to be added to debian/rules if building that executable.
I'm guessing you mean debian/control (maybe some flags need to be
enabled in debian/rules too though).
> For patch2:
> Q1) I'm not sure if x=realloc(x,len) is OK. Better solution?
It's ok, but see above.
> Q2) Should I include an updated debian/rules too (or remove patch 2
> completely)?
If patch2 is pst2dii.cpp.in.patch, then I think it's good to include
that and the other needed changes.
> --- a/src/libpst.c 2011-12-25 00:19:11.000000000 +0100
> +++ b/src/libpst.c 2012-06-27 09:59:41.000000000 +0200
> @@ -289,6 +289,17 @@
> static char* pst_wide_to_single(char *wt, size_t size);
>
>
> +char *pst_getcwd(void) {
If the function is not being used anywhere else, just make it static.
Otherwise this can produce warnings as there will be a missing prototype
in the headers.
> --- a/src/pst2dii.cpp.in 2011-12-25 00:19:11.000000000 +0100
> +++ b/src/pst2dii.cpp.in 2012-06-27 11:08:02.000000000 +0200
> @@ -344,8 +344,10 @@
> {
> if (png_open) {
> png_open = false;
> - char fn[PATH_MAX];
> - snprintf(fn, sizeof(fn), "page%d.png", ++page_sequence);
> + char *fn = NULL;
> + int len = 4 + 4 + 4;
> + fn = (char*)pst_malloc(len) + 1;
Switch these two lines from tabs to spaces. I think you want
“pst_malloc(len + 1)” instead of “pst_malloc(len) + 1”. Also why only 4
for the decimal from page_sequence? is that delimited somewhere else?
And you might as well assign directly to fn, instead of first
initializing it to NULL and immediately overwriting it.
> + snprintf(fn, len, "page%d.png", ++page_sequence);
> FILE *pngout = fopen(fn, "wb");
> if (pngout) {
> gdImagePng(image, pngout);
> @@ -354,6 +356,7 @@
> gdImageDestroy(image); // free memory
> png_names.push_back(fn);
> conversion += string(" ") + fn;
> + free(fn);
Switch from tab to spaces.
> }
> }
>
> @@ -366,8 +369,12 @@
> conversion = string(convert);
> png_names.clear();
> open_png();
> - snprintf(pdf_name, sizeof(pdf_name), "dii%06d", ++email_sequence);
> + int len = 3 + 7;
> + pdf_name = (char*)pst_malloc(len) + 1;
pst_malloc(len + 1)
> + snprintf(pdf_name, len, "dii%06d", ++email_sequence);
> fprintf(dii_file, "\n@T %s\n", pdf_name);
> + len = strlen(output_directory) + 3 + 7;
I think you mean something like:
len = strlen(output_directory) + 1 + 3 + 6 + 4;
> + pdf_name = (char *)pst_realloc(pdf_name,len) + 1;
Yeah, I guess you could just allocate once, but to avoid confusion
you'd better add a comment mentioning why the bigger size, etc.
> snprintf(pdf_name, sizeof(pdf_name), "%s/dii%06d.pdf", output_directory, email_sequence);
> }
thanks,
guillem
Reply to: