Hi!

[Automakers, this is from the libtool-patches list...]

Den 2010-09-02 15:06 skrev Peter Rosin:
> 112: Test 24 33 34 45 47 99 100 are "new" failures with low max_cmd_len
> and I think the reason is that the file name conversion adds escapes for
> the backslashes. I.e. .libs/a1.obj -> .libs\\a1.obj when in this case
> .libs\a1.obj is desired. 25 also fails earlier, probably due to the same
> thing. However, my previous suggestion with a naive_slashify instead of
> naive_backslashify doesn't work either since MSYS turns @c:/foobar into
> @c;c:\msys\1.0\foobar (or something similar, that was from memory) which
> we must avoid at all cost. cygpath -m (instead of -w) is fine on Cygwin
> though since Cygwin doesn't clobber @c:/foobar "for us".
> 
> Maybe we can work around this by sanitizing the input files in ar-lib,
> but that seems a bit horrible to me... I'll see if I can fix this
> somehow. Suggestions welcome.

It is actually a bug in ar-lib. When you issue
        .../ar-lib lib x foo.lib
it runs this loop:

    $AR -NOLOGO -LIST "$archive" | while read member
    do
      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
    done

(with archive=foo.lib)

and that reads members from the archive but breaks if there's a
backslash in one of the members. This works much better:

    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
    do
      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
    done

Ok for the msvc branch?

The code added to the test fails with old ar-lib and works with the change.

Cheers,
Peter
>From 63daad5a46cecf88c168e20febdec7d53568c111 Mon Sep 17 00:00:00 2001
From: Peter Rosin <p...@lysator.liu.se>
Date: Thu, 2 Sep 2010 16:46:14 +0200
Subject: [PATCH] Make ar-lib support backslashed files in archives.

* lib/ar-lib: If an archive member contains a backslash, make sure
it is escaped when the archive member is extracted.
* lib/ar-lib.test: Test the above.

Signed-off-by: Peter Rosin <p...@lysator.liu.se>
---
 ChangeLog         |    7 +++++++
 lib/ar-lib        |    2 +-
 tests/ar-lib.test |    7 +++++++
 3 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5d80edb..aaebf94 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-09-02  Peter Rosin  <p...@lysator.liu.se>
+
+       Make ar-lib support backslashed files in archives.
+       * lib/ar-lib: If an archive member contains a backslash, make sure
+       it is escaped when the archive member is extracted.
+       * lib/ar-lib.test: Test the above.
+
 2010-08-31  Peter Rosin  <p...@lysator.liu.se>
 
        Do file name conversion for object files in the compile wrapper.
diff --git a/lib/ar-lib b/lib/ar-lib
index ef03430..0f0a31b 100755
--- a/lib/ar-lib
+++ b/lib/ar-lib
@@ -219,7 +219,7 @@ elif test -n "$extract"; then
       esac
     done
   else
-    $AR -NOLOGO -LIST "$archive" | while read member
+    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
     do
       $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
     done
diff --git a/tests/ar-lib.test b/tests/ar-lib.test
index d418c21..4759b65 100755
--- a/tests/ar-lib.test
+++ b/tests/ar-lib.test
@@ -26,6 +26,8 @@ cat >lib <<'END'
 #! /bin/sh
 if test x"$2" = x-LIST -a $3 = fake.lib; then
   echo fake.obj
+elif test x"$2" = x-LIST -a $3 = fake2.lib; then
+  echo dir\\fake2.obj
 else
   echo "lib $@"
 fi
@@ -76,4 +78,9 @@ test x"$opts" = x"lib -NOLOGO -EXTRACT:foo.obj foo.lib"
 opts=`./ar-lib ./lib -lib -LTCG x foo.lib foo.obj`
 test x"$opts" = x"lib -lib -LTCG -NOLOGO -EXTRACT:foo.obj foo.lib"
 
+# Check if ar-lib can extract backslashed members
+touch fake2.lib
+opts=`./ar-lib ./lib x fake2.lib`
+test x"$opts" = x"lib -NOLOGO -EXTRACT:dir\\fake2.obj fake2.lib"
+
 :
-- 
1.7.1

Reply via email to