Bug in Win32::GetShortPathName
Gurusamy Sarathy [Fri, 5 Sep 1997 00:00:00 +0000 (00:00 +0000)]
On Thu, 09 Oct 1997 08:30:55 PDT, "Greg Chapman" wrote:
>I'm using Perl 5.004_02 under WIndows 95 (the latest binary distribution
>available on CPAN).  The Win32::GetShortPathName function does not properly
>truncate the returned string when the short file name is shorter than the
>long name.  Specifically, the returned string looks like:
><ShortFileName><NULL char><characters from the end of the long name (the
>original buffer)>.

Thanks for that report, and here's a patch.

p5p-msgid: 199710092229.SAA21556@aatma.engin.umich.edu

win32/win32.c

index 7a4c285..7cbfae8 100644 (file)
@@ -1564,6 +1564,7 @@ XS(w32_GetShortPathName)
 {
     dXSARGS;
     SV *shortpath;
+    DWORD len;
 
     if(items != 1)
        croak("usage: Win32::GetShortPathName($longPathName)");
@@ -1571,8 +1572,15 @@ XS(w32_GetShortPathName)
     shortpath = sv_mortalcopy(ST(0));
     SvUPGRADE(shortpath, SVt_PV);
     /* src == target is allowed */
-    if (GetShortPathName(SvPVX(shortpath), SvPVX(shortpath), SvCUR(shortpath)))
+    do {
+       len = GetShortPathName(SvPVX(shortpath),
+                              SvPVX(shortpath),
+                              SvLEN(shortpath));
+    } while (len >= SvLEN(shortpath) && sv_grow(shortpath,len+1));
+    if (len) {
+       SvCUR_set(shortpath,len);
        ST(0) = shortpath;
+    }
     else
        ST(0) = &sv_undef;
     XSRETURN(1);