Package: libdjvulibre15
Version: 3.5.20-3
Severity: important

Due to an unfortunate upstream change[1], the ddjvu_document_save function is
badly broken.

The attached program used to work fine with DjVuLibre 3.5.20-2.


$ gcc djvusave.c -ldjvulibre -o save_bundled
$ gcc djvusave.c -DINDIRECT -ldjvulibre -o save_indirect
$ ./save_bundled /usr/share/doc/libdjvulibre-dev/djvu2spec.djvu
  0%
 97%
100%
$ wc -c tmp.djvu
0 tmp.djvu

$ ./save_indirect /usr/share/doc/libdjvulibre-dev/djvu2spec.djvu
  0%
 97%
<lots-of-garbage>
terminate called after throwing an instance of 'DJVU::GException'
<even-more-garbage>


The bug has been already fixed upstream. [2]

[1] 
http://djvu.cvs.sourceforge.net/djvu/djvulibre-3.5/libdjvu/ddjvuapi.cpp?r1=1.86&r2=1.87
[2] 
http://djvu.cvs.sourceforge.net/djvu/djvulibre-3.5/libdjvu/ddjvuapi.cpp?r1=1.87&r2=1.88

-- System Information:
Debian Release: lenny/sid
  APT prefers testing
  APT policy: (900, 'testing'), (600, 'unstable'), (500, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.22-3-686 (SMP w/1 CPU core)
Locale: LANG=C, LC_CTYPE=pl_PL (charmap=ISO-8859-2)
Shell: /bin/sh linked to /bin/dash

Versions of packages libdjvulibre15 depends on:
ii  libc6                   2.7-6            GNU C Library: Shared libraries
ii  libgcc1                 1:4.3-20080202-1 GCC support library
ii libjpeg62 6b-14 The Independent JPEG Group's JPEG ii libstdc++6 4.3-20080202-1 The GNU Standard C++ Library v3
ii  xdg-utils               1.0.2-3          desktop integration utilities from

libdjvulibre15 recommends no packages.

-- debconf-show failed

--
Jakub Wilk
#include <libdjvu/ddjvuapi.h>

void handle_messages(ddjvu_context_t *ctx, int wait)
{
  const ddjvu_message_t *msg;
  if (wait)
    ddjvu_message_wait(ctx);
  while ((msg = ddjvu_message_peek(ctx)))
  {
    switch (msg->m_any.tag)
    {
    case DDJVU_ERROR:
      fprintf(stderr, "DDJVU_ERROR: %s\n", msg->m_error.message);
      exit(4);
    case DDJVU_PROGRESS:
			fprintf(stderr, "%3d%%\n", msg->m_progress.percent);	
    }
    ddjvu_message_pop(ctx);
  }
}

int die(const char *message)
{
  fprintf(stderr, "%s\n", message);
  return 1;
}

int main(int argc, char * const argv[])
{
  ddjvu_context_t *ctx;
  ddjvu_document_t *doc;
  ddjvu_status_t r;
  ddjvu_pageinfo_t info;
  ddjvu_job_t *job;
  const char* optv[] = { "-indirect=/tmp/index.djvu" };
	FILE * f;

	f = fopen("/tmp/index.djvu", "w");

  if (argc != 2)
    return die("Usage: ddjvu <djvu-file>");
  if (!(ctx = ddjvu_context_create(argv[0])))
    return die("Cannot create djvu context.");
  if (!(doc = ddjvu_document_create_by_filename(ctx, argv[1], 1)))
    return die("Cannot open djvu document.");
  while (!ddjvu_document_decoding_done(doc))
    handle_messages(ctx, 1);
#ifdef INDIRECT  
  job = ddjvu_document_save(doc, NULL, 1, optv);
#else
  {
    FILE* f;
    f = fopen("tmp.djvu", "wb");
    job = ddjvu_document_save(doc, f, 0, optv);
  }
#endif
  if (!job)
    return die("Cannot create job.");
  while (!ddjvu_job_done(job))
    handle_messages(ctx, 1);
  handle_messages(ctx, 0);
  return 0;
}

Reply via email to