Re: libpst: FTBFS on hurd-i386 (for review)
On Sun, 2012-07-29 at 05:23 +0200, Guillem Jover wrote:
> Hi!
>
> On Wed, 2012-06-27 at 20:43:15 +0200, Svante Signell wrote:
> > Source: libpst
> > Version: 0.6.54-3
Version: 0.6.53-4
> > 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?
You are right, the first patch consists of two parts I combined into
one.
> > 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).
debian/control of course!
> > For patch2:
> > Q1) I'm not sure if x=realloc(x,len) is OK. Better solution?
>
> It's ok, but see above.
I assume you mean below?
> > 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.
In version 0.6.53-4 the dependency is added already to the control file
so pst2dii is built.
> > --- 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.
Done!
> > --- 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.
Done. Yes the 4 bytes should be increased to 11 to hold the longest
string for an int -2^31.
> > + 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.
Done!
> > }
> > }
> >
> > @@ -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)
Yes, of course.
> > + 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.
Used this version.
New patch attached.
diff -ur libpst-0.6.54/configure.in libpst-0.6.54.new/configure.in
--- libpst-0.6.54/configure.in 2012-08-25 18:59:16.000000000 +0200
+++ libpst-0.6.54.new/configure.in 2012-06-27 10:05:54.000000000 +0200
@@ -185,7 +185,7 @@
fi
AC_FUNC_STRFTIME
AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([chdir getcwd memchr memmove memset regcomp strcasecmp strncasecmp strchr strdup strerror strpbrk strrchr strstr strtol])
+AC_CHECK_FUNCS([chdir getcwd memchr memmove memset regcomp strcasecmp strncasecmp strchr strdup strerror strpbrk strrchr strstr strtol get_current_dir_name])
AM_ICONV
if test "$am_cv_func_iconv" != "yes"; then
AC_MSG_ERROR([libpst requires iconv which is missing])
diff -ur libpst-0.6.54/src/libpst.c libpst-0.6.54.new/src/libpst.c
--- libpst-0.6.54/src/libpst.c 2011-12-25 00:19:11.000000000 +0100
+++ libpst-0.6.54.new/src/libpst.c 2012-08-25 19:07:30.000000000 +0200
@@ -289,6 +289,17 @@
static char* pst_wide_to_single(char *wt, size_t size);
+static char *pst_getcwd(void) {
+ char *cwd;
+
+#ifdef HAVE_GET_CURRENT_DIR_NAME
+ cwd = get_current_dir_name();
+#else
+ cwd = pst_malloc(PATH_MAX+1);
+ getcwd(cwd, PATH_MAX+1);
+#endif
+ return cwd;
+}
int pst_open(pst_file *pf, const char *name, const char *charset) {
int32_t sig;
@@ -361,20 +372,24 @@
DEBUG_RET();
- pf->cwd = pst_malloc(PATH_MAX+1);
- getcwd(pf->cwd, PATH_MAX+1);
+ pf->cwd = pst_getcwd();
pf->fname = strdup(name);
return 0;
}
int pst_reopen(pst_file *pf) {
- char cwd[PATH_MAX];
- if (!getcwd(cwd, PATH_MAX)) return -1;
- if (chdir(pf->cwd)) return -1;
- if (!freopen(pf->fname, "rb", pf->fp)) return -1;
- if (chdir(cwd)) return -1;
+ char *cwd;
+ cwd = pst_getcwd();
+ if (cwd == NULL) return -1;
+ if (chdir(pf->cwd)) goto err;
+ if (!freopen(pf->fname, "rb", pf->fp)) goto err;
+ if (chdir(cwd)) goto err;
+ free(cwd);
return 0;
+err:
+ free(cwd);
+ return -1;
}
diff -ur libpst-0.6.54/src/pst2dii.cpp.in libpst-0.6.54.new/src/pst2dii.cpp.in
--- libpst-0.6.54/src/pst2dii.cpp.in 2011-12-25 00:19:11.000000000 +0100
+++ libpst-0.6.54.new/src/pst2dii.cpp.in 2012-08-25 17:01:53.000000000 +0200
@@ -42,7 +42,7 @@
char* font_file = NULL;
int bates_color = 0xff0000; // color of bates header stamp
int email_sequence = 0; // current pdf sequence number
-char pdf_name[PATH_MAX]; // current pdf file name
+char* pdf_name = NULL; // current pdf file name
FILE* dii_file = NULL; // the output dii load file
pst_file pstfile; // the input pst file
@@ -344,8 +344,9 @@
{
if (png_open) {
png_open = false;
- char fn[PATH_MAX];
- snprintf(fn, sizeof(fn), "page%d.png", ++page_sequence);
+ int len = 4 + 11 + 4;
+ char *fn = (char*)pst_malloc(len + 1);
+ snprintf(fn, len, "page%d.png", ++page_sequence);
FILE *pngout = fopen(fn, "wb");
if (pngout) {
gdImagePng(image, pngout);
@@ -354,6 +355,7 @@
gdImageDestroy(image); // free memory
png_names.push_back(fn);
conversion += string(" ") + fn;
+ free(fn);
}
}
@@ -366,9 +368,12 @@
conversion = string(convert);
png_names.clear();
open_png();
- snprintf(pdf_name, sizeof(pdf_name), "dii%06d", ++email_sequence);
+ /* Note; allocating the largest string length to pdf_name */
+ int len = strlen(output_directory) + 4 + 6 + 4;
+ pdf_name = (char*)pst_malloc(len + 1);
+ snprintf(pdf_name, 3 + 6 + 1, "dii%06d", ++email_sequence);
fprintf(dii_file, "\n@T %s\n", pdf_name);
- snprintf(pdf_name, sizeof(pdf_name), "%s/dii%06d.pdf", output_directory, email_sequence);
+ snprintf(pdf_name, len, "%s/dii%06d.pdf", output_directory, email_sequence);
}
@@ -382,6 +387,7 @@
remove((*i).c_str());
}
fprintf(dii_file, "@D %s\n", pdf_name);
+ free(pdf_name);
}
Reply to: