[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#231015: libm.so: symlink should be relative



At Mon, 15 Mar 2004 00:53:25 +0900,
GOTO Masanori wrote:
> At Sun, 14 Mar 2004 12:31:37 +0900,
> GOTO Masanori wrote:
> > Joey, please look at this patch.  How to test in libc6-dev as following:
> > 
> > 	> ln -sf ../../lib/libm.so debian/libc6-dev/usr/lib/libm.so ; ls -l debian/libc6-dev/usr/lib/libm.so
> > 	lrwxrwxrwx    1 gotom    gotom          17 2004-03-14 12:26 debian/libc6-dev/usr/lib/libm.so -> ../../lib/libm.so
> > 	> dh_link.new -plibc6-dev ; ls -l debian/libc6-dev/usr/lib/libm.so
> > 	lrwxrwxrwx    1 gotom    gotom          18 2004-03-14 12:26 debian/libc6-dev/usr/lib/libm.so -> /lib/libm-2.3.2.so
> 
> Umm, this patch has the bug.  The resolved symlink path should be
> "/lib/libm.so"...

The problem is that if /lib/libm.so is existed, then this path keeps
resolving to /lib/libm-2.3.2.so because readlink(2) resolves both
. and .. and symlinks.  So we can't use abs_path() for this purpose.

I implement path expand routine which resolve . and .., but don't
resolve symbolic links. 

This patch can handle to expand pathname even if the first character
in $src component includes `..' or `.'.


--- dh_link	2004-03-12 18:49:27.000000000 +0900
+++ dh_link.new	2004-03-15 02:09:35.000000000 +0900
@@ -78,6 +78,39 @@
 
 init();
 
+# expand_path expands all path "." and ".." component, but don't
+# resolve symbolic links.
+sub expand_path
+{
+	my $start = @_ ? shift : '.';
+	my @pathname = split(m:/+:,$start);
+
+	my $entry;
+	my @respath;
+	foreach $entry (@pathname) {
+		if ($entry eq '.' || $entry eq '') {
+			# Do nothing
+		} elsif ($entry eq '..') {
+			if ($#respath == -1) {
+				# Do nothing
+			} else {
+				pop @respath;
+			}
+		} else {
+			push @respath, $entry;
+		}
+	}
+
+	# reconstruct full pathname
+	my $result;
+	foreach $entry (@respath) {
+		$result .= '/' . $entry;
+	}
+
+	return $result;
+}
+		
+
 foreach my $package (@{$dh{DOPACKAGES}}) {
 	my $tmp=tmpdir($package);
 	my $file=pkgfile($package,"links");
@@ -128,6 +161,9 @@
 		my $dest=pop @links;
 		my $src=pop @links;
 
+		# Expand . and .. in src.
+		$src=expand_path($src);
+	
 		# Relavatize src and dest.
 		$src=~s:^/::;
 		$dest=~s:^/::;


	> ln -sf ../../lib/libm.so debian/libc6-dev/usr/lib/libm.so ; ls -l debian/libc6-dev/usr/lib/libm.so
	lrwxrwxrwx    1 gotom    gotom          17 2004-03-15 02:11 debian/libc6-dev/usr/lib/libm.so -> ../../lib/libm.so
	> ./dh_link -plibc6-dev ; ls -l debian/libc6-dev/usr/lib/libm.so
	lrwxrwxrwx    1 gotom    gotom          12 2004-03-15 02:11 debian/libc6-dev/usr/lib/libm.so -> /lib/libm.so

I keep testing for another path examples.

Regards,
-- gotom



Reply to: