This is the mail archive of the mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

cygpath bug?

I'm trying to use cygpath to convert a windows path with
long directory and filenames to a unix style path with only
short directory and filenames.

dos_pathname=cygpath -d "$1"
# check for errors
unix_pathname=cygpath -u "$dos_pathname"
# check for errors

I expected cygpath to return non-zero if the input path is invalid, but it

$ cygpath -d "c:\doesnt exist"

After looking at the code for cygpath, it looks like functions that call the
windows api functions GetLongPathName() and GetShortPathName() only
return an error if the functions return 0 length and GetLastError() =
ERROR_INVALID_PARAMETER  Both of these functions can return 0
length for other reasons such as an invlalid directory or filename.

As you can see in the code below, if GetShortPathName() returns 0,
the function allocates 1 byte and copies unitialized data to it.

Shouldn't GetShortPathName() == 0 always cause the get_short_name()
function to fail?  There are many other calls to these two functions.

static char *
get_short_name (const char *filename)
  char *sbuf, buf[MAX_PATH];
  DWORD len = GetShortPathName (filename, buf, MAX_PATH);
  if (len == 0 && GetLastError () == ERROR_INVALID_PARAMETER)
      fprintf (stderr, "%s: cannot create short name of %s\n", prog_name,
      exit (2);
  sbuf = (char *) malloc (++len);
  if (sbuf == NULL)
      fprintf (stderr, "%s: out of memory\n", prog_name);
      exit (1);
  return strcpy (sbuf, buf);

Unsubscribe info:
Problem reports:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]