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. 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. For patch2: Q1) I'm not sure if x=realloc(x,len) is OK. Better solution? Q2) Should I include an updated debian/rules too (or remove patch 2 completely)?
--- a/configure.in 2012-06-20 17:53:17.000000000 +0200 +++ b/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]) --- 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) { + 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,23 +372,26 @@ 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; } - int pst_close(pst_file *pf) { DEBUG_ENT("pst_close"); if (!pf->fp) {
--- 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 @@ -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,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; + 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); } } @@ -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; + snprintf(pdf_name, len, "dii%06d", ++email_sequence); fprintf(dii_file, "\n@T %s\n", pdf_name); + len = strlen(output_directory) + 3 + 7; + pdf_name = (char *)pst_realloc(pdf_name,len) + 1; snprintf(pdf_name, sizeof(pdf_name), "%s/dii%06d.pdf", output_directory, email_sequence); } @@ -382,6 +389,7 @@ remove((*i).c_str()); } fprintf(dii_file, "@D %s\n", pdf_name); + free(pdf_name); }