On Fri, 2011-09-09 at 17:29:58 +0200, Svante Signell wrote: > Package: libdvdnav > Version: 4.1.4-1219 > Severity: important > Tags: patch > User: [email protected] > Usertags: hurd
> The libdvdnav package currently fails to build from source on the Hurd due > to a condition missing to define MAXPATHLEN. The patch below fixes this issue. > > diff -ur libdvdnav-4.1.4-1219/src/remap.c > libdvdnav-4.1.4-1219.modified//src/remap.c > --- libdvdnav-4.1.4-1219/src/remap.c 2008-12-30 15:48:46.000000000 +0100 > +++ libdvdnav-4.1.4-1219.modified//src/remap.c 2011-09-09 > 17:11:47.000000000 +0200 > @@ -27,6 +27,9 @@ > #ifndef _MSC_VER > #include <sys/param.h> > #include <sys/fcntl.h> > +#ifdef __GNU__ > +#define MAXPATHLEN 255 > +#endif > #else > #ifndef MAXPATHLEN > #define MAXPATHLEN 255 Removing the arbitrary path limits seems more correct to me, here's a patch doing that, only build tested. The change in dvdnav_s should be safe as that's an opaque data type, used through pointers, which should not be exposed to applications. thanks, guillem
>From ea5682d40ba7ed027c5bc6770a1195bccc270ea8 Mon Sep 17 00:00:00 2001 From: Guillem Jover <[email protected]> Date: Sat, 10 Sep 2011 03:28:51 +0200 Subject: [PATCH] Use dynamically allocated strings instead of hardcoded size ones --- src/dvdnav.c | 3 +-- src/dvdnav_internal.h | 9 +-------- src/remap.c | 13 +++++++------ 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/dvdnav.c b/src/dvdnav.c index 0f5db84..0c7fc0d 100644 --- a/src/dvdnav.c +++ b/src/dvdnav.c @@ -110,8 +110,7 @@ dvdnav_status_t dvdnav_open(dvdnav_t** dest, const char *path) { } /* Set the path. FIXME: Is a deep copy 'right' */ - strncpy(this->path, path, MAX_PATH_LEN - 1); - this->path[MAX_PATH_LEN - 1] = '\0'; + this->path = strdup(path); /* Pre-open and close a file so that the CSS-keys are cached. */ this->file = DVDOpenFile(vm_get_dvd_reader(this->vm), 0, DVD_READ_MENU_VOBS); diff --git a/src/dvdnav_internal.h b/src/dvdnav_internal.h index 0cb148e..1603ffe 100644 --- a/src/dvdnav_internal.h +++ b/src/dvdnav_internal.h @@ -68,13 +68,6 @@ static inline int _private_gettimeofday( struct timeval *tv, void *tz ) /* Maximum length of an error string */ #define MAX_ERR_LEN 255 -/* Use the POSIX PATH_MAX if available */ -#ifdef PATH_MAX -#define MAX_PATH_LEN PATH_MAX -#else -#define MAX_PATH_LEN 255 /* Arbitrary */ -#endif - #ifndef DVD_VIDEO_LB_LEN #define DVD_VIDEO_LB_LEN 2048 #endif @@ -139,7 +132,7 @@ typedef struct dvdnav_vobu_s { struct dvdnav_s { /* General data */ - char path[MAX_PATH_LEN]; /* Path to DVD device/dir */ + char *path; /* Path to DVD device/dir */ dvd_file_t *file; /* Currently opened file */ /* Position data */ diff --git a/src/remap.c b/src/remap.c index 5601605..7a35f72 100644 --- a/src/remap.c +++ b/src/remap.c @@ -29,10 +29,6 @@ #ifndef _MSC_VER #include <sys/param.h> #include <sys/fcntl.h> -#else -#ifndef MAXPATHLEN -#define MAXPATHLEN 255 -#endif #endif /* _MSC_VER */ #include <inttypes.h> @@ -193,7 +189,7 @@ static int parseblock(char *buf, int *dom, int *tt, int *pg, remap_t* remap_loadmap( char *title) { char buf[160]; - char fname[MAXPATHLEN]; + char *fname; char *home; int res; FILE *fp; @@ -207,14 +203,19 @@ remap_t* remap_loadmap( char *title) { fprintf(MSG_OUT, "libdvdnav: Unable to find home directory" ); return NULL; } - snprintf(fname, sizeof(fname), "%s/.dvdnav/%s.map", home, title); + fname = malloc(strlen("/.dvdnav/.map") + strlen(home) + strlen(title) + 1); + if (!fname) + return NULL; + sprintf(fname, "%s/.dvdnav/%s.map", home, title); /* Open the map file */ fp = fopen( fname, "r"); if (!fp) { fprintf(MSG_OUT, "libdvdnav: Unable to find map file '%s'\n", fname); + free(fname); return NULL; } + free(fname); /* Load the map file */ map = remap_new( title); -- 1.7.5.4

