Svante Signell, le Mon 23 Apr 2012 15:42:47 +0200, a écrit :
> +#else
> +char* xreadlink(const char *filename) {
> +     int nchars, size = 128;
> +     char *buffer;
> +     if ((buffer=(char*)malloc(size)) == NULL) {
> +             errno = ENOMEM;

No need to set errno, malloc should have done so already.

> +             return NULL;
> +     }
> +     while ((nchars = readlink(filename,buffer,size)) == size) {
> +             size *= 2;
> +             if ((buffer = (char*)realloc(buffer,size)) == NULL) {

This loses the previous value of buffer. You need to store the the
result of realloc in another variable, and free the original buffer in
the error condition.

> +                     errno = ENOMEM;
> +                     return NULL;
> +             }
> +     }
> +     if (nchars < 0) {
> +             free (buffer);
> +             errno = EINVAL;
> +             return NULL;
> +     }
> +     buffer[nchars]='\0';
> +     return buffer;
> +}
> +#endif
> +
>  char* expandpath(const char * path)
>  {
> +#ifndef __GNU__
>       char tmpbuf[PATH_MAX+1];
> +#else
> +     char *tmpbuf=NULL;
> +#endif
>       const char *start, *end;
>       char *curr, *dest;
>       int deep = MAXSYMLINKS;
> @@ -1962,6 +1992,7 @@
>       if (!path || *path == '\0')
>               return (char*)0;
>  
> +#ifndef __GNU__
>       curr = &real[0];
>  
>       if (*path != '/') {
> @@ -1972,6 +2003,17 @@
>               *curr = '/';
>               dest = curr + 1;
>       }
> +#else
> +     if (*path != '/') {
> +             if ((curr = get_current_dir_name()) == NULL)
> +                     return (char*)0;
> +             dest = rawmemchr(curr, '\0');
> +     } else {
> +             curr = malloc(1 + 1);
> +             *curr = '/';
> +             dest = curr + 1;
> +     }
> +#endif

I'd say rather put ifndef around initial curr = , and use #ifndef/#else
around the getcwd() call, only, so that the rest of the code can be kept
factorized.

> @@ -1990,27 +2032,37 @@
>                               while ((--dest)[-1] != '/')
>                                       ;
>               } else {
> +#ifndef __GNU__
>                       char lnkbuf[PATH_MAX+1];
> +#else
> +                     char *lnkbuf = NULL;
> +#endif
>                       size_t len;
>                       ssize_t n;
>  
>                       if (dest[-1] != '/')
>                               *dest++ = '/';
>  
> +#ifndef __GNU__
>                       if (dest + (end - start) > curr + PATH_MAX) {
>                               errno = ENAMETOOLONG;
>                               return (char*)0;
>                       }
> +#endif
>  
>                       dest = mempcpy(dest, start, end - start);
>                       *dest = '\0';
>  
>                       if (deep-- < 0) {
>                               errno = ELOOP;
> +#ifdef __GNU__
> +                             free(curr);
> +#endif
>                               return (char*)0;
>                       }
>  
>                       errno = 0;
> +#ifndef __GNU__
>                       if ((n = readlink(curr, lnkbuf, PATH_MAX)) < 0) {
>                               deep = MAXSYMLINKS;
>                               if (errno == EINVAL)
> @@ -2024,6 +2076,21 @@
>                               errno = ENAMETOOLONG;
>                               return (char*)0;
>                       }
> +#else
> +                     lnkbuf = xreadlink(curr);
> +                     if (lnkbuf == NULL) {
> +                             deep = MAXSYMLINKS;
> +                             if (errno == EINVAL)
> +                                     continue;       /* Not a symlink */
> +                             free(lnkbuf);
> +                             free(curr);
> +                             return (char*)0;
> +                     }
> +
> +                     len = strlen(end);
> +                     n = strlen(lnkbuf);
> +                     tmpbuf = malloc(n + len + 1);
> +#endif
>  
>                       memmove(&tmpbuf[n], end, len + 1);
>                       path = end = memcpy(tmpbuf, lnkbuf, n);
> @@ -2033,6 +2100,9 @@
>                       else if (dest > curr + 1)
>                           while ((--dest)[-1] != '/');
>                       
> +#ifdef __GNU__
> +     free(lnkbuf);

indentation issue


All that being said, fuser will not work for now since we don't have the
corresponding files in /proc.  Should we perhaps rather just disable the
build of fuser, instead trying to get a PATH_MAX patch applied?

Samuel


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: http://lists.debian.org/[email protected]

Reply via email to